Lines Matching +full:opp +full:- +full:shared

1 // SPDX-License-Identifier: GPL-2.0-only
25 #include "cpufreq-dt.h"
27 #include "rockchip-cpufreq.h"
44 NULL, /* Extra space for boost-attr if required */
53 if (cpumask_test_cpu(cpu, priv->cpus)) in cpufreq_dt_find_data()
62 struct private_data *priv = policy->driver_data; in set_target()
63 unsigned long freq = policy->freq_table[index].frequency; in set_target()
66 return rockchip_cpufreq_opp_set_rate(priv->cpu_dev, freq * 1000); in set_target()
68 return dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); in set_target()
73 * An earlier version of opp-v1 bindings used to name the regulator
74 * "cpu0-supply", we still need to handle that for backwards compatibility.
80 int cpu = dev->id; in find_supply_name()
83 np = of_node_get(dev->of_node); in find_supply_name()
91 pp = of_find_property(np, "cpu0-supply", NULL); in find_supply_name()
98 pp = of_find_property(np, "cpu-supply", NULL); in find_supply_name()
118 priv = cpufreq_dt_find_data(policy->cpu); in cpufreq_init()
120 pr_err("failed to find data for cpu%d\n", policy->cpu); in cpufreq_init()
121 return -ENODEV; in cpufreq_init()
123 cpu_dev = priv->cpu_dev; in cpufreq_init()
136 cpumask_copy(policy->cpus, priv->cpus); in cpufreq_init()
137 policy->driver_data = priv; in cpufreq_init()
138 policy->clk = cpu_clk; in cpufreq_init()
139 policy->freq_table = priv->freq_table; in cpufreq_init()
140 policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000; in cpufreq_init()
141 policy->cpuinfo.transition_latency = transition_latency; in cpufreq_init()
142 policy->dvfs_possible_from_any_cpu = true; in cpufreq_init()
153 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in cpufreq_init()
165 /* We did light-weight tear down earlier, nothing to do here */ in cpufreq_online()
172 * Preserve policy->driver_data and don't free resources on light-weight in cpufreq_offline()
180 clk_put(policy->clk); in cpufreq_exit()
194 .name = "cpufreq-dt",
213 return -EPROBE_DEFER; in dt_cpufreq_early_init()
217 return -ENOMEM; in dt_cpufreq_early_init()
219 if (!alloc_cpumask_var(&priv->cpus, GFP_KERNEL)) in dt_cpufreq_early_init()
220 return -ENOMEM; in dt_cpufreq_early_init()
222 cpumask_set_cpu(cpu, priv->cpus); in dt_cpufreq_early_init()
223 priv->cpu_dev = cpu_dev; in dt_cpufreq_early_init()
226 * OPP layer will be taking care of regulators now, but it needs to know in dt_cpufreq_early_init()
231 priv->opp_table = dev_pm_opp_set_regulators(cpu_dev, &reg_name, in dt_cpufreq_early_init()
233 if (IS_ERR(priv->opp_table)) { in dt_cpufreq_early_init()
234 ret = PTR_ERR(priv->opp_table); in dt_cpufreq_early_init()
235 if (ret != -EPROBE_DEFER) in dt_cpufreq_early_init()
242 /* Get OPP-sharing information from "operating-points-v2" bindings */ in dt_cpufreq_early_init()
243 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, priv->cpus); in dt_cpufreq_early_init()
245 if (ret != -ENOENT) in dt_cpufreq_early_init()
249 * operating-points-v2 not supported, fallback to all CPUs share in dt_cpufreq_early_init()
250 * OPP for backward compatibility if the platform hasn't set in dt_cpufreq_early_init()
253 if (dev_pm_opp_get_sharing_cpus(cpu_dev, priv->cpus)) in dt_cpufreq_early_init()
258 * Initialize OPP tables for all priv->cpus. They will be shared by in dt_cpufreq_early_init()
259 * all CPUs which have marked their CPUs shared with OPP bindings. in dt_cpufreq_early_init()
261 * For platforms not using operating-points-v2 bindings, we do this in dt_cpufreq_early_init()
262 * before updating priv->cpus. Otherwise, we will end up creating in dt_cpufreq_early_init()
267 if (!dev_pm_opp_of_cpumask_add_table(priv->cpus)) in dt_cpufreq_early_init()
268 priv->have_static_opps = true; in dt_cpufreq_early_init()
271 * The OPP table must be initialized, statically or dynamically, by this in dt_cpufreq_early_init()
276 dev_err(cpu_dev, "OPP table can't be empty\n"); in dt_cpufreq_early_init()
277 ret = -ENODEV; in dt_cpufreq_early_init()
282 cpumask_setall(priv->cpus); in dt_cpufreq_early_init()
283 ret = dev_pm_opp_set_sharing_cpus(cpu_dev, priv->cpus); in dt_cpufreq_early_init()
285 dev_err(cpu_dev, "%s: failed to mark OPPs as shared: %d\n", in dt_cpufreq_early_init()
293 ret = dev_pm_opp_init_cpufreq_table(cpu_dev, &priv->freq_table); in dt_cpufreq_early_init()
299 list_add(&priv->node, &priv_list); in dt_cpufreq_early_init()
303 if (priv->have_static_opps) in dt_cpufreq_early_init()
304 dev_pm_opp_of_cpumask_remove_table(priv->cpus); in dt_cpufreq_early_init()
305 if (priv->opp_table) in dt_cpufreq_early_init()
306 dev_pm_opp_put_regulators(priv->opp_table); in dt_cpufreq_early_init()
308 free_cpumask_var(priv->cpus); in dt_cpufreq_early_init()
317 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &priv->freq_table); in dt_cpufreq_release()
318 if (priv->have_static_opps) in dt_cpufreq_release()
319 dev_pm_opp_of_cpumask_remove_table(priv->cpus); in dt_cpufreq_release()
320 if (priv->opp_table) in dt_cpufreq_release()
321 dev_pm_opp_put_regulators(priv->opp_table); in dt_cpufreq_release()
322 free_cpumask_var(priv->cpus); in dt_cpufreq_release()
323 list_del(&priv->node); in dt_cpufreq_release()
329 struct cpufreq_dt_platform_data *data = dev_get_platdata(&pdev->dev); in dt_cpufreq_probe()
332 /* Request resources early so we can return in case of -EPROBE_DEFER */ in dt_cpufreq_probe()
334 ret = dt_cpufreq_early_init(&pdev->dev, cpu); in dt_cpufreq_probe()
340 if (data->have_governor_per_policy) in dt_cpufreq_probe()
343 dt_cpufreq_driver.resume = data->resume; in dt_cpufreq_probe()
344 if (data->suspend) in dt_cpufreq_probe()
345 dt_cpufreq_driver.suspend = data->suspend; in dt_cpufreq_probe()
346 if (data->get_intermediate) { in dt_cpufreq_probe()
347 dt_cpufreq_driver.target_intermediate = data->target_intermediate; in dt_cpufreq_probe()
348 dt_cpufreq_driver.get_intermediate = data->get_intermediate; in dt_cpufreq_probe()
354 dev_err(&pdev->dev, "failed register driver: %d\n", ret); in dt_cpufreq_probe()
373 .name = "cpufreq-dt",
380 MODULE_ALIAS("platform:cpufreq-dt");