Lines Matching +full:opp +full:- +full:v2 +full:- +full:base
1 // SPDX-License-Identifier: GPL-2.0
34 void __iomem *base; member
46 struct dev_pm_opp *opp; in qcom_cpufreq_set_bw() local
50 dev = get_cpu_device(policy->cpu); in qcom_cpufreq_set_bw()
52 return -ENODEV; in qcom_cpufreq_set_bw()
54 opp = dev_pm_opp_find_freq_exact(dev, freq_hz, true); in qcom_cpufreq_set_bw()
55 if (IS_ERR(opp)) in qcom_cpufreq_set_bw()
56 return PTR_ERR(opp); in qcom_cpufreq_set_bw()
58 ret = dev_pm_opp_set_bw(dev, opp); in qcom_cpufreq_set_bw()
59 dev_pm_opp_put(opp); in qcom_cpufreq_set_bw()
70 /* Skip voltage update if the opp table is not available */ in qcom_cpufreq_update_opp()
86 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_target_index()
87 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; in qcom_cpufreq_hw_target_index()
88 unsigned long freq = policy->freq_table[index].frequency; in qcom_cpufreq_hw_target_index()
90 writel_relaxed(index, data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_target_index()
109 data = policy->driver_data; in qcom_cpufreq_hw_get()
110 soc_data = data->soc_data; in qcom_cpufreq_hw_get()
112 index = readl_relaxed(data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_get()
113 index = min(index, LUT_MAX_ENTRIES - 1); in qcom_cpufreq_hw_get()
115 return policy->freq_table[index].frequency; in qcom_cpufreq_hw_get()
121 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_fast_switch()
122 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; in qcom_cpufreq_hw_fast_switch()
125 index = policy->cached_resolved_idx; in qcom_cpufreq_hw_fast_switch()
126 writel_relaxed(index, data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_fast_switch()
128 return policy->freq_table[index].frequency; in qcom_cpufreq_hw_fast_switch()
137 struct dev_pm_opp *opp; in qcom_cpufreq_hw_read_lut() local
140 struct qcom_cpufreq_data *drv_data = policy->driver_data; in qcom_cpufreq_hw_read_lut()
141 const struct qcom_cpufreq_soc_data *soc_data = drv_data->soc_data; in qcom_cpufreq_hw_read_lut()
145 return -ENOMEM; in qcom_cpufreq_hw_read_lut()
149 /* Disable all opps and cross-validate against LUT later */ in qcom_cpufreq_hw_read_lut()
152 opp = dev_pm_opp_find_freq_ceil(cpu_dev, &rate); in qcom_cpufreq_hw_read_lut()
153 if (IS_ERR(opp)) in qcom_cpufreq_hw_read_lut()
156 dev_pm_opp_put(opp); in qcom_cpufreq_hw_read_lut()
159 } else if (ret != -ENODEV) { in qcom_cpufreq_hw_read_lut()
160 dev_err(cpu_dev, "Invalid opp table in device tree\n"); in qcom_cpufreq_hw_read_lut()
164 policy->fast_switch_possible = true; in qcom_cpufreq_hw_read_lut()
169 data = readl_relaxed(drv_data->base + soc_data->reg_freq_lut + in qcom_cpufreq_hw_read_lut()
170 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
175 data = readl_relaxed(drv_data->base + soc_data->reg_volt_lut + in qcom_cpufreq_hw_read_lut()
176 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
190 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", freq); in qcom_cpufreq_hw_read_lut()
203 struct cpufreq_frequency_table *prev = &table[i - 1]; in qcom_cpufreq_hw_read_lut()
209 if (prev->frequency == CPUFREQ_ENTRY_INVALID) { in qcom_cpufreq_hw_read_lut()
211 prev->frequency = prev_freq; in qcom_cpufreq_hw_read_lut()
212 prev->flags = CPUFREQ_BOOST_FREQ; in qcom_cpufreq_hw_read_lut()
214 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", in qcom_cpufreq_hw_read_lut()
226 policy->freq_table = table; in qcom_cpufreq_hw_read_lut()
227 dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); in qcom_cpufreq_hw_read_lut()
243 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_get_related_cpus()
244 "#freq-domain-cells", 0, in qcom_get_related_cpus()
272 { .compatible = "qcom,cpufreq-hw", .data = &qcom_soc_data },
273 { .compatible = "qcom,cpufreq-epss", .data = &epss_soc_data },
281 struct device *dev = &pdev->dev; in qcom_cpufreq_hw_cpu_init()
286 void __iomem *base; in qcom_cpufreq_hw_cpu_init() local
290 cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_init()
293 policy->cpu); in qcom_cpufreq_hw_cpu_init()
294 return -ENODEV; in qcom_cpufreq_hw_cpu_init()
297 cpu_np = of_cpu_device_node_get(policy->cpu); in qcom_cpufreq_hw_cpu_init()
299 return -EINVAL; in qcom_cpufreq_hw_cpu_init()
301 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_cpufreq_hw_cpu_init()
302 "#freq-domain-cells", 0, &args); in qcom_cpufreq_hw_cpu_init()
312 return -ENODEV; in qcom_cpufreq_hw_cpu_init()
315 if (!request_mem_region(res->start, resource_size(res), res->name)) { in qcom_cpufreq_hw_cpu_init()
317 return -EBUSY; in qcom_cpufreq_hw_cpu_init()
320 base = ioremap(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_init()
321 if (!base) { in qcom_cpufreq_hw_cpu_init()
323 ret = -ENOMEM; in qcom_cpufreq_hw_cpu_init()
329 ret = -ENOMEM; in qcom_cpufreq_hw_cpu_init()
333 data->soc_data = of_device_get_match_data(&pdev->dev); in qcom_cpufreq_hw_cpu_init()
334 data->base = base; in qcom_cpufreq_hw_cpu_init()
335 data->res = res; in qcom_cpufreq_hw_cpu_init()
338 if (!(readl_relaxed(base + data->soc_data->reg_enable) & 0x1)) { in qcom_cpufreq_hw_cpu_init()
339 dev_err(dev, "Domain-%d cpufreq hardware not enabled\n", index); in qcom_cpufreq_hw_cpu_init()
340 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
344 qcom_get_related_cpus(index, policy->cpus); in qcom_cpufreq_hw_cpu_init()
345 if (!cpumask_weight(policy->cpus)) { in qcom_cpufreq_hw_cpu_init()
346 dev_err(dev, "Domain-%d failed to get related CPUs\n", index); in qcom_cpufreq_hw_cpu_init()
347 ret = -ENOENT; in qcom_cpufreq_hw_cpu_init()
351 policy->driver_data = data; in qcom_cpufreq_hw_cpu_init()
355 dev_err(dev, "Domain-%d failed to read LUT\n", index); in qcom_cpufreq_hw_cpu_init()
362 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
366 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in qcom_cpufreq_hw_cpu_init()
372 iounmap(base); in qcom_cpufreq_hw_cpu_init()
374 release_mem_region(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_init()
380 struct device *cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_exit()
381 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_cpu_exit()
382 struct resource *res = data->res; in qcom_cpufreq_hw_cpu_exit()
383 void __iomem *base = data->base; in qcom_cpufreq_hw_cpu_exit() local
386 dev_pm_opp_of_cpumask_remove_table(policy->related_cpus); in qcom_cpufreq_hw_cpu_exit()
387 kfree(policy->freq_table); in qcom_cpufreq_hw_cpu_exit()
389 iounmap(base); in qcom_cpufreq_hw_cpu_exit()
390 release_mem_region(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_exit()
411 .name = "qcom-cpufreq-hw",
421 clk = clk_get(&pdev->dev, "xo"); in qcom_cpufreq_hw_driver_probe()
428 clk = clk_get(&pdev->dev, "alternate"); in qcom_cpufreq_hw_driver_probe()
440 return -EPROBE_DEFER; in qcom_cpufreq_hw_driver_probe()
448 dev_err(&pdev->dev, "CPUFreq HW driver failed to register\n"); in qcom_cpufreq_hw_driver_probe()
450 dev_dbg(&pdev->dev, "QCOM CPUFreq HW driver initialized\n"); in qcom_cpufreq_hw_driver_probe()
464 .name = "qcom-cpufreq-hw",
482 MODULE_LICENSE("GPL v2");