Lines Matching +full:opp +full:- +full:table

1 // SPDX-License-Identifier: GPL-2.0-only
25 #include "cpufreq-dt.h"
41 NULL, /* Extra space for boost-attr if required */
50 if (cpumask_test_cpu(cpu, priv->cpus)) in cpufreq_dt_find_data()
59 struct private_data *priv = policy->driver_data; in set_target()
60 unsigned long freq = policy->freq_table[index].frequency; in set_target()
62 return dev_pm_opp_set_rate(priv->cpu_dev, freq * 1000); in set_target()
66 * An earlier version of opp-v1 bindings used to name the regulator
67 * "cpu0-supply", we still need to handle that for backwards compatibility.
73 int cpu = dev->id; in find_supply_name()
76 np = of_node_get(dev->of_node); in find_supply_name()
84 pp = of_find_property(np, "cpu0-supply", NULL); in find_supply_name()
91 pp = of_find_property(np, "cpu-supply", NULL); in find_supply_name()
112 priv = cpufreq_dt_find_data(policy->cpu); in cpufreq_init()
114 pr_err("failed to find data for cpu%d\n", policy->cpu); in cpufreq_init()
115 return -ENODEV; in cpufreq_init()
118 cpu_dev = priv->cpu_dev; in cpufreq_init()
119 cpumask_copy(policy->cpus, priv->cpus); in cpufreq_init()
129 * Initialize OPP tables for all policy->cpus. They will be shared by in cpufreq_init()
130 * all CPUs which have marked their CPUs shared with OPP bindings. in cpufreq_init()
132 * For platforms not using operating-points-v2 bindings, we do this in cpufreq_init()
133 * before updating policy->cpus. Otherwise, we will end up creating in cpufreq_init()
134 * duplicate OPPs for policy->cpus. in cpufreq_init()
138 if (!dev_pm_opp_of_cpumask_add_table(policy->cpus)) in cpufreq_init()
139 priv->have_static_opps = true; in cpufreq_init()
142 * But we need OPP table to function so if it is not there let's in cpufreq_init()
147 dev_err(cpu_dev, "OPP table can't be empty\n"); in cpufreq_init()
148 ret = -ENODEV; in cpufreq_init()
154 dev_err(cpu_dev, "failed to init cpufreq table: %d\n", ret); in cpufreq_init()
158 policy->driver_data = priv; in cpufreq_init()
159 policy->clk = cpu_clk; in cpufreq_init()
160 policy->freq_table = freq_table; in cpufreq_init()
162 policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000; in cpufreq_init()
177 policy->cpuinfo.transition_latency = transition_latency; in cpufreq_init()
178 policy->dvfs_possible_from_any_cpu = true; in cpufreq_init()
180 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in cpufreq_init()
187 if (priv->have_static_opps) in cpufreq_init()
188 dev_pm_opp_of_cpumask_remove_table(policy->cpus); in cpufreq_init()
196 /* We did light-weight tear down earlier, nothing to do here */ in cpufreq_online()
203 * Preserve policy->driver_data and don't free resources on light-weight in cpufreq_offline()
211 struct private_data *priv = policy->driver_data; in cpufreq_exit()
213 dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); in cpufreq_exit()
214 if (priv->have_static_opps) in cpufreq_exit()
215 dev_pm_opp_of_cpumask_remove_table(policy->related_cpus); in cpufreq_exit()
216 clk_put(policy->clk); in cpufreq_exit()
230 .name = "cpufreq-dt",
248 return -EPROBE_DEFER; in dt_cpufreq_early_init()
252 return -ENOMEM; in dt_cpufreq_early_init()
254 if (!alloc_cpumask_var(&priv->cpus, GFP_KERNEL)) in dt_cpufreq_early_init()
255 return -ENOMEM; in dt_cpufreq_early_init()
257 priv->cpu_dev = cpu_dev; in dt_cpufreq_early_init()
259 /* Try to get OPP table early to ensure resources are available */ in dt_cpufreq_early_init()
260 priv->opp_table = dev_pm_opp_get_opp_table(cpu_dev); in dt_cpufreq_early_init()
261 if (IS_ERR(priv->opp_table)) { in dt_cpufreq_early_init()
262 ret = PTR_ERR(priv->opp_table); in dt_cpufreq_early_init()
263 if (ret != -EPROBE_DEFER) in dt_cpufreq_early_init()
264 dev_err(cpu_dev, "failed to get OPP table: %d\n", ret); in dt_cpufreq_early_init()
269 * OPP layer will be taking care of regulators now, but it needs to know in dt_cpufreq_early_init()
274 priv->reg_opp_table = dev_pm_opp_set_regulators(cpu_dev, in dt_cpufreq_early_init()
276 if (IS_ERR(priv->reg_opp_table)) { in dt_cpufreq_early_init()
277 ret = PTR_ERR(priv->reg_opp_table); in dt_cpufreq_early_init()
278 if (ret != -EPROBE_DEFER) in dt_cpufreq_early_init()
285 /* Find OPP sharing information so we can fill pri->cpus here */ in dt_cpufreq_early_init()
286 /* Get OPP-sharing information from "operating-points-v2" bindings */ in dt_cpufreq_early_init()
287 ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, priv->cpus); in dt_cpufreq_early_init()
289 if (ret != -ENOENT) in dt_cpufreq_early_init()
293 * operating-points-v2 not supported, fallback to all CPUs share in dt_cpufreq_early_init()
294 * OPP for backward compatibility if the platform hasn't set in dt_cpufreq_early_init()
297 if (dev_pm_opp_get_sharing_cpus(cpu_dev, priv->cpus)) { in dt_cpufreq_early_init()
298 cpumask_setall(priv->cpus); in dt_cpufreq_early_init()
301 * OPP tables are initialized only for cpu, do it for in dt_cpufreq_early_init()
304 ret = dev_pm_opp_set_sharing_cpus(cpu_dev, priv->cpus); in dt_cpufreq_early_init()
311 list_add(&priv->node, &priv_list); in dt_cpufreq_early_init()
315 if (priv->reg_opp_table) in dt_cpufreq_early_init()
316 dev_pm_opp_put_regulators(priv->reg_opp_table); in dt_cpufreq_early_init()
318 dev_pm_opp_put_opp_table(priv->opp_table); in dt_cpufreq_early_init()
320 free_cpumask_var(priv->cpus); in dt_cpufreq_early_init()
329 if (priv->reg_opp_table) in dt_cpufreq_release()
330 dev_pm_opp_put_regulators(priv->reg_opp_table); in dt_cpufreq_release()
331 dev_pm_opp_put_opp_table(priv->opp_table); in dt_cpufreq_release()
332 free_cpumask_var(priv->cpus); in dt_cpufreq_release()
333 list_del(&priv->node); in dt_cpufreq_release()
339 struct cpufreq_dt_platform_data *data = dev_get_platdata(&pdev->dev); in dt_cpufreq_probe()
342 /* Request resources early so we can return in case of -EPROBE_DEFER */ in dt_cpufreq_probe()
344 ret = dt_cpufreq_early_init(&pdev->dev, cpu); in dt_cpufreq_probe()
350 if (data->have_governor_per_policy) in dt_cpufreq_probe()
353 dt_cpufreq_driver.resume = data->resume; in dt_cpufreq_probe()
354 if (data->suspend) in dt_cpufreq_probe()
355 dt_cpufreq_driver.suspend = data->suspend; in dt_cpufreq_probe()
356 if (data->get_intermediate) { in dt_cpufreq_probe()
357 dt_cpufreq_driver.target_intermediate = data->target_intermediate; in dt_cpufreq_probe()
358 dt_cpufreq_driver.get_intermediate = data->get_intermediate; in dt_cpufreq_probe()
364 dev_err(&pdev->dev, "failed register driver: %d\n", ret); in dt_cpufreq_probe()
383 .name = "cpufreq-dt",
390 MODULE_ALIAS("platform:cpufreq-dt");