Lines Matching +full:opp +full:- +full:table
1 // SPDX-License-Identifier: GPL-2.0
45 struct dev_pm_opp *opp; in qcom_cpufreq_set_bw() local
49 dev = get_cpu_device(policy->cpu); in qcom_cpufreq_set_bw()
51 return -ENODEV; in qcom_cpufreq_set_bw()
53 opp = dev_pm_opp_find_freq_exact(dev, freq_hz, true); in qcom_cpufreq_set_bw()
54 if (IS_ERR(opp)) in qcom_cpufreq_set_bw()
55 return PTR_ERR(opp); in qcom_cpufreq_set_bw()
57 ret = dev_pm_opp_set_bw(dev, opp); in qcom_cpufreq_set_bw()
58 dev_pm_opp_put(opp); in qcom_cpufreq_set_bw()
69 /* Skip voltage update if the opp table is not available */ in qcom_cpufreq_update_opp()
85 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_target_index()
86 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; in qcom_cpufreq_hw_target_index()
87 unsigned long freq = policy->freq_table[index].frequency; in qcom_cpufreq_hw_target_index()
89 writel_relaxed(index, data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_target_index()
108 data = policy->driver_data; in qcom_cpufreq_hw_get()
109 soc_data = data->soc_data; in qcom_cpufreq_hw_get()
111 index = readl_relaxed(data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_get()
112 index = min(index, LUT_MAX_ENTRIES - 1); in qcom_cpufreq_hw_get()
114 return policy->freq_table[index].frequency; in qcom_cpufreq_hw_get()
120 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_fast_switch()
121 const struct qcom_cpufreq_soc_data *soc_data = data->soc_data; in qcom_cpufreq_hw_fast_switch()
124 index = policy->cached_resolved_idx; in qcom_cpufreq_hw_fast_switch()
125 writel_relaxed(index, data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_fast_switch()
127 return policy->freq_table[index].frequency; in qcom_cpufreq_hw_fast_switch()
135 struct cpufreq_frequency_table *table; in qcom_cpufreq_hw_read_lut() local
136 struct dev_pm_opp *opp; in qcom_cpufreq_hw_read_lut() local
139 struct qcom_cpufreq_data *drv_data = policy->driver_data; in qcom_cpufreq_hw_read_lut()
140 const struct qcom_cpufreq_soc_data *soc_data = drv_data->soc_data; in qcom_cpufreq_hw_read_lut()
142 table = kcalloc(LUT_MAX_ENTRIES + 1, sizeof(*table), GFP_KERNEL); in qcom_cpufreq_hw_read_lut()
143 if (!table) in qcom_cpufreq_hw_read_lut()
144 return -ENOMEM; in qcom_cpufreq_hw_read_lut()
148 /* Disable all opps and cross-validate against LUT later */ in qcom_cpufreq_hw_read_lut()
151 opp = dev_pm_opp_find_freq_ceil(cpu_dev, &rate); in qcom_cpufreq_hw_read_lut()
152 if (IS_ERR(opp)) in qcom_cpufreq_hw_read_lut()
155 dev_pm_opp_put(opp); in qcom_cpufreq_hw_read_lut()
158 } else if (ret != -ENODEV) { in qcom_cpufreq_hw_read_lut()
159 dev_err(cpu_dev, "Invalid opp table in device tree\n"); in qcom_cpufreq_hw_read_lut()
162 policy->fast_switch_possible = true; in qcom_cpufreq_hw_read_lut()
167 data = readl_relaxed(drv_data->base + soc_data->reg_freq_lut + in qcom_cpufreq_hw_read_lut()
168 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
173 data = readl_relaxed(drv_data->base + soc_data->reg_volt_lut + in qcom_cpufreq_hw_read_lut()
174 i * soc_data->lut_row_size); in qcom_cpufreq_hw_read_lut()
184 table[i].frequency = freq; in qcom_cpufreq_hw_read_lut()
188 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", freq); in qcom_cpufreq_hw_read_lut()
189 table[i].frequency = CPUFREQ_ENTRY_INVALID; in qcom_cpufreq_hw_read_lut()
193 table[i].frequency = CPUFREQ_ENTRY_INVALID; in qcom_cpufreq_hw_read_lut()
198 * end of table in qcom_cpufreq_hw_read_lut()
201 struct cpufreq_frequency_table *prev = &table[i - 1]; in qcom_cpufreq_hw_read_lut()
207 if (prev->frequency == CPUFREQ_ENTRY_INVALID) { in qcom_cpufreq_hw_read_lut()
209 prev->frequency = prev_freq; in qcom_cpufreq_hw_read_lut()
210 prev->flags = CPUFREQ_BOOST_FREQ; in qcom_cpufreq_hw_read_lut()
212 dev_warn(cpu_dev, "failed to update OPP for freq=%d\n", in qcom_cpufreq_hw_read_lut()
223 table[i].frequency = CPUFREQ_TABLE_END; in qcom_cpufreq_hw_read_lut()
224 policy->freq_table = table; in qcom_cpufreq_hw_read_lut()
225 dev_pm_opp_set_sharing_cpus(cpu_dev, policy->cpus); in qcom_cpufreq_hw_read_lut()
241 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_get_related_cpus()
242 "#freq-domain-cells", 0, in qcom_get_related_cpus()
270 { .compatible = "qcom,cpufreq-hw", .data = &qcom_soc_data },
271 { .compatible = "qcom,cpufreq-epss", .data = &epss_soc_data },
279 struct device *dev = &pdev->dev; in qcom_cpufreq_hw_cpu_init()
287 cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_init()
290 policy->cpu); in qcom_cpufreq_hw_cpu_init()
291 return -ENODEV; in qcom_cpufreq_hw_cpu_init()
294 cpu_np = of_cpu_device_node_get(policy->cpu); in qcom_cpufreq_hw_cpu_init()
296 return -EINVAL; in qcom_cpufreq_hw_cpu_init()
298 ret = of_parse_phandle_with_args(cpu_np, "qcom,freq-domain", in qcom_cpufreq_hw_cpu_init()
299 "#freq-domain-cells", 0, &args); in qcom_cpufreq_hw_cpu_init()
312 ret = -ENOMEM; in qcom_cpufreq_hw_cpu_init()
316 data->soc_data = of_device_get_match_data(&pdev->dev); in qcom_cpufreq_hw_cpu_init()
317 data->base = base; in qcom_cpufreq_hw_cpu_init()
320 if (!(readl_relaxed(base + data->soc_data->reg_enable) & 0x1)) { in qcom_cpufreq_hw_cpu_init()
321 dev_err(dev, "Domain-%d cpufreq hardware not enabled\n", index); in qcom_cpufreq_hw_cpu_init()
322 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
326 qcom_get_related_cpus(index, policy->cpus); in qcom_cpufreq_hw_cpu_init()
327 if (!cpumask_weight(policy->cpus)) { in qcom_cpufreq_hw_cpu_init()
328 dev_err(dev, "Domain-%d failed to get related CPUs\n", index); in qcom_cpufreq_hw_cpu_init()
329 ret = -ENOENT; in qcom_cpufreq_hw_cpu_init()
333 policy->driver_data = data; in qcom_cpufreq_hw_cpu_init()
337 dev_err(dev, "Domain-%d failed to read LUT\n", index); in qcom_cpufreq_hw_cpu_init()
344 ret = -ENODEV; in qcom_cpufreq_hw_cpu_init()
348 dev_pm_opp_of_register_em(cpu_dev, policy->cpus); in qcom_cpufreq_hw_cpu_init()
358 struct device *cpu_dev = get_cpu_device(policy->cpu); in qcom_cpufreq_hw_cpu_exit()
359 struct qcom_cpufreq_data *data = policy->driver_data; in qcom_cpufreq_hw_cpu_exit()
363 dev_pm_opp_of_cpumask_remove_table(policy->related_cpus); in qcom_cpufreq_hw_cpu_exit()
364 kfree(policy->freq_table); in qcom_cpufreq_hw_cpu_exit()
365 devm_iounmap(&pdev->dev, data->base); in qcom_cpufreq_hw_cpu_exit()
386 .name = "qcom-cpufreq-hw",
396 clk = clk_get(&pdev->dev, "xo"); in qcom_cpufreq_hw_driver_probe()
403 clk = clk_get(&pdev->dev, "alternate"); in qcom_cpufreq_hw_driver_probe()
415 return -EPROBE_DEFER; in qcom_cpufreq_hw_driver_probe()
423 dev_err(&pdev->dev, "CPUFreq HW driver failed to register\n"); in qcom_cpufreq_hw_driver_probe()
425 dev_dbg(&pdev->dev, "QCOM CPUFreq HW driver initialized\n"); in qcom_cpufreq_hw_driver_probe()
439 .name = "qcom-cpufreq-hw",