Lines Matching +full:clk +full:- +full:out +full:- +full:frequency
19 #include <linux/clk.h>
28 struct clk *armdiv;
29 struct clk *armclk;
30 struct clk *hclk;
50 /* pseudo-frequency for dvs mode */
53 /* frequency to sleep and reboot in
64 /* S3C2416 only supports changing the voltage in the dvs-mode.
97 /* return our pseudo-frequency when in dvs mode */ in s3c2416_cpufreq_get_speed()
98 if (s3c_freq->is_dvs) in s3c2416_cpufreq_get_speed()
101 return clk_get_rate(s3c_freq->armclk) / 1000; in s3c2416_cpufreq_get_speed()
109 if (clk_get_rate(s3c_freq->armdiv) / 1000 != freq) { in s3c2416_cpufreq_set_armdiv()
110 ret = clk_set_rate(s3c_freq->armdiv, freq * 1000); in s3c2416_cpufreq_set_armdiv()
128 if (s3c_freq->is_dvs) { in s3c2416_cpufreq_enter_dvs()
134 clk_get_rate(s3c_freq->hclk) / 1000); in s3c2416_cpufreq_enter_dvs()
135 ret = clk_set_parent(s3c_freq->armclk, s3c_freq->hclk); in s3c2416_cpufreq_enter_dvs()
143 if (s3c_freq->vddarm) { in s3c2416_cpufreq_enter_dvs()
146 pr_debug("cpufreq: setting regulator to %d-%d\n", in s3c2416_cpufreq_enter_dvs()
147 dvfs->vddarm_min, dvfs->vddarm_max); in s3c2416_cpufreq_enter_dvs()
148 ret = regulator_set_voltage(s3c_freq->vddarm, in s3c2416_cpufreq_enter_dvs()
149 dvfs->vddarm_min, in s3c2416_cpufreq_enter_dvs()
150 dvfs->vddarm_max); in s3c2416_cpufreq_enter_dvs()
158 s3c_freq->is_dvs = 1; in s3c2416_cpufreq_enter_dvs()
170 if (!s3c_freq->is_dvs) { in s3c2416_cpufreq_leave_dvs()
176 if (s3c_freq->vddarm) { in s3c2416_cpufreq_leave_dvs()
179 pr_debug("cpufreq: setting regulator to %d-%d\n", in s3c2416_cpufreq_leave_dvs()
180 dvfs->vddarm_min, dvfs->vddarm_max); in s3c2416_cpufreq_leave_dvs()
181 ret = regulator_set_voltage(s3c_freq->vddarm, in s3c2416_cpufreq_leave_dvs()
182 dvfs->vddarm_min, in s3c2416_cpufreq_leave_dvs()
183 dvfs->vddarm_max); in s3c2416_cpufreq_leave_dvs()
191 /* force armdiv to hclk frequency for transition from dvs*/ in s3c2416_cpufreq_leave_dvs()
192 if (clk_get_rate(s3c_freq->armdiv) > clk_get_rate(s3c_freq->hclk)) { in s3c2416_cpufreq_leave_dvs()
193 pr_debug("cpufreq: force armdiv to hclk frequency (%lukHz)\n", in s3c2416_cpufreq_leave_dvs()
194 clk_get_rate(s3c_freq->hclk) / 1000); in s3c2416_cpufreq_leave_dvs()
196 clk_get_rate(s3c_freq->hclk) / 1000); in s3c2416_cpufreq_leave_dvs()
199 clk_get_rate(s3c_freq->hclk) / 1000, ret); in s3c2416_cpufreq_leave_dvs()
205 clk_get_rate(s3c_freq->armdiv) / 1000); in s3c2416_cpufreq_leave_dvs()
207 ret = clk_set_parent(s3c_freq->armclk, s3c_freq->armdiv); in s3c2416_cpufreq_leave_dvs()
214 s3c_freq->is_dvs = 0; in s3c2416_cpufreq_leave_dvs()
228 idx = s3c_freq->freq_table[index].driver_data; in s3c2416_cpufreq_set_target()
234 if (to_dvs && s3c_freq->disable_dvs) { in s3c2416_cpufreq_set_target()
236 ret = -EINVAL; in s3c2416_cpufreq_set_target()
237 goto out; in s3c2416_cpufreq_set_target()
244 new_freq = (s3c_freq->is_dvs && !to_dvs) in s3c2416_cpufreq_set_target()
245 ? clk_get_rate(s3c_freq->hclk) / 1000 in s3c2416_cpufreq_set_target()
246 : s3c_freq->freq_table[index].frequency; in s3c2416_cpufreq_set_target()
251 } else if (s3c_freq->is_dvs) { in s3c2416_cpufreq_set_target()
259 out: in s3c2416_cpufreq_set_target()
272 count = regulator_count_voltages(s3c_freq->vddarm); in s3c2416_cpufreq_cfg_regulator()
279 goto out; in s3c2416_cpufreq_cfg_regulator()
281 cpufreq_for_each_valid_entry(pos, s3c_freq->freq_table) { in s3c2416_cpufreq_cfg_regulator()
282 dvfs = &s3c2416_dvfs_table[pos->driver_data]; in s3c2416_cpufreq_cfg_regulator()
285 /* Check only the min-voltage, more is always ok on S3C2416 */ in s3c2416_cpufreq_cfg_regulator()
287 v = regulator_list_voltage(s3c_freq->vddarm, i); in s3c2416_cpufreq_cfg_regulator()
288 if (v >= dvfs->vddarm_min) in s3c2416_cpufreq_cfg_regulator()
294 pos->frequency); in s3c2416_cpufreq_cfg_regulator()
295 pos->frequency = CPUFREQ_ENTRY_INVALID; in s3c2416_cpufreq_cfg_regulator()
299 out: in s3c2416_cpufreq_cfg_regulator()
301 s3c_freq->regulator_latency = 1 * 1000 * 1000; in s3c2416_cpufreq_cfg_regulator()
314 s3c_freq->disable_dvs = 1; in s3c2416_cpufreq_reboot_notifier_evt()
322 if (s3c_freq->is_dvs) { in s3c2416_cpufreq_reboot_notifier_evt()
340 struct clk *msysclk; in s3c2416_cpufreq_driver_init()
344 if (policy->cpu != 0) in s3c2416_cpufreq_driver_init()
345 return -EINVAL; in s3c2416_cpufreq_driver_init()
355 * S3C2416 and S3C2450 share the same processor-ID and also provide no in s3c2416_cpufreq_driver_init()
361 pr_info("cpufreq: msysclk running at %lukHz, using S3C2416 frequency table\n", in s3c2416_cpufreq_driver_init()
363 s3c_freq->freq_table = s3c2416_freq_table; in s3c2416_cpufreq_driver_init()
364 policy->cpuinfo.max_freq = 400000; in s3c2416_cpufreq_driver_init()
366 pr_info("cpufreq: msysclk running at %lukHz, using S3C2450 frequency table\n", in s3c2416_cpufreq_driver_init()
368 s3c_freq->freq_table = s3c2450_freq_table; in s3c2416_cpufreq_driver_init()
369 policy->cpuinfo.max_freq = 534000; in s3c2416_cpufreq_driver_init()
375 if (s3c_freq->freq_table == NULL) { in s3c2416_cpufreq_driver_init()
376 pr_err("cpufreq: No frequency information for this CPU, msysclk at %lukHz\n", in s3c2416_cpufreq_driver_init()
378 return -ENODEV; in s3c2416_cpufreq_driver_init()
381 s3c_freq->is_dvs = 0; in s3c2416_cpufreq_driver_init()
383 s3c_freq->armdiv = clk_get(NULL, "armdiv"); in s3c2416_cpufreq_driver_init()
384 if (IS_ERR(s3c_freq->armdiv)) { in s3c2416_cpufreq_driver_init()
385 ret = PTR_ERR(s3c_freq->armdiv); in s3c2416_cpufreq_driver_init()
390 s3c_freq->hclk = clk_get(NULL, "hclk"); in s3c2416_cpufreq_driver_init()
391 if (IS_ERR(s3c_freq->hclk)) { in s3c2416_cpufreq_driver_init()
392 ret = PTR_ERR(s3c_freq->hclk); in s3c2416_cpufreq_driver_init()
400 rate = clk_get_rate(s3c_freq->hclk); in s3c2416_cpufreq_driver_init()
403 ret = -EINVAL; in s3c2416_cpufreq_driver_init()
407 s3c_freq->armclk = clk_get(NULL, "armclk"); in s3c2416_cpufreq_driver_init()
408 if (IS_ERR(s3c_freq->armclk)) { in s3c2416_cpufreq_driver_init()
409 ret = PTR_ERR(s3c_freq->armclk); in s3c2416_cpufreq_driver_init()
415 s3c_freq->vddarm = regulator_get(NULL, "vddarm"); in s3c2416_cpufreq_driver_init()
416 if (IS_ERR(s3c_freq->vddarm)) { in s3c2416_cpufreq_driver_init()
417 ret = PTR_ERR(s3c_freq->vddarm); in s3c2416_cpufreq_driver_init()
424 s3c_freq->regulator_latency = 0; in s3c2416_cpufreq_driver_init()
427 cpufreq_for_each_entry(pos, s3c_freq->freq_table) { in s3c2416_cpufreq_driver_init()
429 if (pos->driver_data == 0) { in s3c2416_cpufreq_driver_init()
430 if (!s3c_freq->hclk) { in s3c2416_cpufreq_driver_init()
432 pos->frequency); in s3c2416_cpufreq_driver_init()
433 pos->frequency = CPUFREQ_ENTRY_INVALID; in s3c2416_cpufreq_driver_init()
440 rate = clk_round_rate(s3c_freq->armdiv, in s3c2416_cpufreq_driver_init()
441 pos->frequency * 1000); in s3c2416_cpufreq_driver_init()
443 if (rate != pos->frequency) { in s3c2416_cpufreq_driver_init()
445 pos->frequency, rate); in s3c2416_cpufreq_driver_init()
446 pos->frequency = CPUFREQ_ENTRY_INVALID; in s3c2416_cpufreq_driver_init()
453 ret = cpufreq_generic_init(policy, s3c_freq->freq_table, in s3c2416_cpufreq_driver_init()
454 (500 * 1000) + s3c_freq->regulator_latency); in s3c2416_cpufreq_driver_init()
464 regulator_put(s3c_freq->vddarm); in s3c2416_cpufreq_driver_init()
467 clk_put(s3c_freq->armclk); in s3c2416_cpufreq_driver_init()
469 clk_put(s3c_freq->hclk); in s3c2416_cpufreq_driver_init()
471 clk_put(s3c_freq->armdiv); in s3c2416_cpufreq_driver_init()