Lines Matching +full:opp +full:- +full:table
1 // SPDX-License-Identifier: GPL-2.0
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()
136 struct cpufreq_frequency_table *table; in qcom_cpufreq_hw_read_lut() local
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()
143 table = kcalloc(LUT_MAX_ENTRIES + 1, sizeof(*table), GFP_KERNEL); in qcom_cpufreq_hw_read_lut()
144 if (!table) 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()
163 policy->fast_switch_possible = true; in qcom_cpufreq_hw_read_lut()
168 data = readl_relaxed(drv_data->base + soc_data->reg_freq_lut + in qcom_cpufreq_hw_read_lut()
169 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
174 data = readl_relaxed(drv_data->base + soc_data->reg_volt_lut + in qcom_cpufreq_hw_read_lut()
175 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
185 table[i].frequency = freq; in qcom_cpufreq_hw_read_lut()
189 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", freq); in qcom_cpufreq_hw_read_lut()
190 table[i].frequency = CPUFREQ_ENTRY_INVALID; in qcom_cpufreq_hw_read_lut()
194 table[i].frequency = CPUFREQ_ENTRY_INVALID; in qcom_cpufreq_hw_read_lut()
199 * end of table in qcom_cpufreq_hw_read_lut()
202 struct cpufreq_frequency_table *prev = &table[i - 1]; in qcom_cpufreq_hw_read_lut()
208 if (prev->frequency == CPUFREQ_ENTRY_INVALID) { in qcom_cpufreq_hw_read_lut()
210 prev->frequency = prev_freq; in qcom_cpufreq_hw_read_lut()
211 prev->flags = CPUFREQ_BOOST_FREQ; in qcom_cpufreq_hw_read_lut()
213 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", in qcom_cpufreq_hw_read_lut()
224 table[i].frequency = CPUFREQ_TABLE_END; in qcom_cpufreq_hw_read_lut()
225 policy->freq_table = table; in qcom_cpufreq_hw_read_lut()
226 dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); in qcom_cpufreq_hw_read_lut()
242 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_get_related_cpus()
243 "#freq-domain-cells", 0, in qcom_get_related_cpus()
271 { .compatible = "qcom,cpufreq-hw", .data = &qcom_soc_data },
272 { .compatible = "qcom,cpufreq-epss", .data = &epss_soc_data },
280 struct device *dev = &pdev->dev; in qcom_cpufreq_hw_cpu_init()
289 cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_init()
292 policy->cpu); in qcom_cpufreq_hw_cpu_init()
293 return -ENODEV; in qcom_cpufreq_hw_cpu_init()
296 cpu_np = of_cpu_device_node_get(policy->cpu); in qcom_cpufreq_hw_cpu_init()
298 return -EINVAL; in qcom_cpufreq_hw_cpu_init()
300 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_cpufreq_hw_cpu_init()
301 "#freq-domain-cells", 0, &args); in qcom_cpufreq_hw_cpu_init()
311 return -ENODEV; in qcom_cpufreq_hw_cpu_init()
314 if (!request_mem_region(res->start, resource_size(res), res->name)) { in qcom_cpufreq_hw_cpu_init()
316 return -EBUSY; in qcom_cpufreq_hw_cpu_init()
319 base = ioremap(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_init()
322 ret = -ENOMEM; in qcom_cpufreq_hw_cpu_init()
328 ret = -ENOMEM; in qcom_cpufreq_hw_cpu_init()
332 data->soc_data = of_device_get_match_data(&pdev->dev); in qcom_cpufreq_hw_cpu_init()
333 data->base = base; in qcom_cpufreq_hw_cpu_init()
334 data->res = res; in qcom_cpufreq_hw_cpu_init()
337 if (!(readl_relaxed(base + data->soc_data->reg_enable) & 0x1)) { in qcom_cpufreq_hw_cpu_init()
338 dev_err(dev, "Domain-%d cpufreq hardware not enabled\n", index); in qcom_cpufreq_hw_cpu_init()
339 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
343 qcom_get_related_cpus(index, policy->cpus); in qcom_cpufreq_hw_cpu_init()
344 if (!cpumask_weight(policy->cpus)) { in qcom_cpufreq_hw_cpu_init()
345 dev_err(dev, "Domain-%d failed to get related CPUs\n", index); in qcom_cpufreq_hw_cpu_init()
346 ret = -ENOENT; in qcom_cpufreq_hw_cpu_init()
350 policy->driver_data = data; in qcom_cpufreq_hw_cpu_init()
354 dev_err(dev, "Domain-%d failed to read LUT\n", index); in qcom_cpufreq_hw_cpu_init()
361 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
365 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in qcom_cpufreq_hw_cpu_init()
373 release_mem_region(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_init()
379 struct device *cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_exit()
380 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_cpu_exit()
381 struct resource *res = data->res; in qcom_cpufreq_hw_cpu_exit()
382 void __iomem *base = data->base; in qcom_cpufreq_hw_cpu_exit()
385 dev_pm_opp_of_cpumask_remove_table(policy->related_cpus); in qcom_cpufreq_hw_cpu_exit()
386 kfree(policy->freq_table); in qcom_cpufreq_hw_cpu_exit()
389 release_mem_region(res->start, resource_size(res)); in qcom_cpufreq_hw_cpu_exit()
410 .name = "qcom-cpufreq-hw",
420 clk = clk_get(&pdev->dev, "xo"); in qcom_cpufreq_hw_driver_probe()
427 clk = clk_get(&pdev->dev, "alternate"); in qcom_cpufreq_hw_driver_probe()
439 return -EPROBE_DEFER; in qcom_cpufreq_hw_driver_probe()
447 dev_err(&pdev->dev, "CPUFreq HW driver failed to register\n"); in qcom_cpufreq_hw_driver_probe()
449 dev_dbg(&pdev->dev, "QCOM CPUFreq HW driver initialized\n"); in qcom_cpufreq_hw_driver_probe()
463 .name = "qcom-cpufreq-hw",