Lines Matching +full:dynamic +full:- +full:power +full:- +full:coefficient
1 // SPDX-License-Identifier: GPL-2.0-only
4 * Author: Pi-Cheng Chen <pi-cheng.chen@linaro.org>
26 * on each CPU power/clock domain of Mediatek SoCs. Each CPU cluster in
29 * 100mV < Vsram - Vproc < 200mV
54 if (cpumask_test_cpu(cpu, &info->cpus)) in mtk_cpu_dvfs_info_lookup()
64 struct regulator *proc_reg = info->proc_reg; in mtk_cpufreq_voltage_tracking()
65 struct regulator *sram_reg = info->sram_reg; in mtk_cpufreq_voltage_tracking()
80 * then set Vproc to (Vsram - 100mV). in mtk_cpufreq_voltage_tracking()
110 vsram - VOLT_TOL, in mtk_cpufreq_voltage_tracking()
118 vproc = vsram - MIN_VOLT_SHIFT; in mtk_cpufreq_voltage_tracking()
134 * by step. At each step, set Vproc to (Vsram - 200mV) first, in mtk_cpufreq_voltage_tracking()
152 vproc = max(new_vproc, old_vsram - MAX_VOLT_SHIFT); in mtk_cpufreq_voltage_tracking()
174 vsram - VOLT_TOL, in mtk_cpufreq_voltage_tracking()
195 if (info->need_voltage_tracking) in mtk_cpufreq_set_voltage()
198 return regulator_set_voltage(info->proc_reg, vproc, in mtk_cpufreq_set_voltage()
205 struct cpufreq_frequency_table *freq_table = policy->freq_table; in mtk_cpufreq_set_target()
206 struct clk *cpu_clk = policy->clk; in mtk_cpufreq_set_target()
208 struct mtk_cpu_dvfs_info *info = policy->driver_data; in mtk_cpufreq_set_target()
209 struct device *cpu_dev = info->cpu_dev; in mtk_cpufreq_set_target()
214 inter_vproc = info->intermediate_voltage; in mtk_cpufreq_set_target()
217 old_vproc = regulator_get_voltage(info->proc_reg); in mtk_cpufreq_set_target()
228 policy->cpu, freq_hz); in mtk_cpufreq_set_target()
243 policy->cpu); in mtk_cpufreq_set_target()
250 ret = clk_set_parent(cpu_clk, info->inter_clk); in mtk_cpufreq_set_target()
252 pr_err("cpu%d: failed to re-parent cpu clock!\n", in mtk_cpufreq_set_target()
253 policy->cpu); in mtk_cpufreq_set_target()
263 policy->cpu); in mtk_cpufreq_set_target()
272 pr_err("cpu%d: failed to re-parent cpu clock!\n", in mtk_cpufreq_set_target()
273 policy->cpu); in mtk_cpufreq_set_target()
287 policy->cpu); in mtk_cpufreq_set_target()
288 clk_set_parent(cpu_clk, info->inter_clk); in mtk_cpufreq_set_target()
298 #define DYNAMIC_POWER "dynamic-power-coefficient"
303 struct regulator *proc_reg = ERR_PTR(-ENODEV); in mtk_cpu_dvfs_info_init()
304 struct regulator *sram_reg = ERR_PTR(-ENODEV); in mtk_cpu_dvfs_info_init()
305 struct clk *cpu_clk = ERR_PTR(-ENODEV); in mtk_cpu_dvfs_info_init()
306 struct clk *inter_clk = ERR_PTR(-ENODEV); in mtk_cpu_dvfs_info_init()
314 return -ENODEV; in mtk_cpu_dvfs_info_init()
319 if (PTR_ERR(cpu_clk) == -EPROBE_DEFER) in mtk_cpu_dvfs_info_init()
330 if (PTR_ERR(inter_clk) == -EPROBE_DEFER) in mtk_cpu_dvfs_info_init()
343 if (PTR_ERR(proc_reg) == -EPROBE_DEFER) in mtk_cpu_dvfs_info_init()
357 /* Get OPP-sharing information from "operating-points-v2" bindings */ in mtk_cpu_dvfs_info_init()
358 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, &info->cpus); in mtk_cpu_dvfs_info_init()
360 pr_err("failed to get OPP-sharing information for cpu%d\n", in mtk_cpu_dvfs_info_init()
365 ret = dev_pm_opp_of_cpumask_add_table(&info->cpus); in mtk_cpu_dvfs_info_init()
379 info->intermediate_voltage = dev_pm_opp_get_voltage(opp); in mtk_cpu_dvfs_info_init()
382 info->cpu_dev = cpu_dev; in mtk_cpu_dvfs_info_init()
383 info->proc_reg = proc_reg; in mtk_cpu_dvfs_info_init()
384 info->sram_reg = IS_ERR(sram_reg) ? NULL : sram_reg; in mtk_cpu_dvfs_info_init()
385 info->cpu_clk = cpu_clk; in mtk_cpu_dvfs_info_init()
386 info->inter_clk = inter_clk; in mtk_cpu_dvfs_info_init()
390 * for this CPU power domain. in mtk_cpu_dvfs_info_init()
392 info->need_voltage_tracking = !IS_ERR(sram_reg); in mtk_cpu_dvfs_info_init()
397 dev_pm_opp_of_cpumask_remove_table(&info->cpus); in mtk_cpu_dvfs_info_init()
414 if (!IS_ERR(info->proc_reg)) in mtk_cpu_dvfs_info_release()
415 regulator_put(info->proc_reg); in mtk_cpu_dvfs_info_release()
416 if (!IS_ERR(info->sram_reg)) in mtk_cpu_dvfs_info_release()
417 regulator_put(info->sram_reg); in mtk_cpu_dvfs_info_release()
418 if (!IS_ERR(info->cpu_clk)) in mtk_cpu_dvfs_info_release()
419 clk_put(info->cpu_clk); in mtk_cpu_dvfs_info_release()
420 if (!IS_ERR(info->inter_clk)) in mtk_cpu_dvfs_info_release()
421 clk_put(info->inter_clk); in mtk_cpu_dvfs_info_release()
423 dev_pm_opp_of_cpumask_remove_table(&info->cpus); in mtk_cpu_dvfs_info_release()
432 info = mtk_cpu_dvfs_info_lookup(policy->cpu); in mtk_cpufreq_init()
435 policy->cpu); in mtk_cpufreq_init()
436 return -EINVAL; in mtk_cpufreq_init()
439 ret = dev_pm_opp_init_cpufreq_table(info->cpu_dev, &freq_table); in mtk_cpufreq_init()
442 policy->cpu, ret); in mtk_cpufreq_init()
446 cpumask_copy(policy->cpus, &info->cpus); in mtk_cpufreq_init()
447 policy->freq_table = freq_table; in mtk_cpufreq_init()
448 policy->driver_data = info; in mtk_cpufreq_init()
449 policy->clk = info->cpu_clk; in mtk_cpufreq_init()
451 dev_pm_opp_of_register_em(info->cpu_dev, policy->cpus); in mtk_cpufreq_init()
458 struct mtk_cpu_dvfs_info *info = policy->driver_data; in mtk_cpufreq_exit()
460 dev_pm_opp_free_cpufreq_table(info->cpu_dev, &policy->freq_table); in mtk_cpufreq_exit()
474 .name = "mtk-cpufreq",
488 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); in mtk_cpufreq_probe()
490 ret = -ENOMEM; in mtk_cpufreq_probe()
496 dev_err(&pdev->dev, in mtk_cpufreq_probe()
502 list_add(&info->list_head, &dvfs_info_list); in mtk_cpufreq_probe()
507 dev_err(&pdev->dev, "failed to register mtk cpufreq driver\n"); in mtk_cpufreq_probe()
516 list_del(&info->list_head); in mtk_cpufreq_probe()
524 .name = "mtk-cpufreq",
553 return -ENODEV; in mtk_cpufreq_driver_init()
558 pr_debug("Machine is not compatible with mtk-cpufreq\n"); in mtk_cpufreq_driver_init()
559 return -ENODEV; in mtk_cpufreq_driver_init()
572 pdev = platform_device_register_simple("mtk-cpufreq", -1, NULL, 0); in mtk_cpufreq_driver_init()
574 pr_err("failed to register mtk-cpufreq platform device\n"); in mtk_cpufreq_driver_init()
583 MODULE_AUTHOR("Pi-Cheng Chen <pi-cheng.chen@linaro.org>");