Lines Matching +full:freq +full:- +full:domain
1 // SPDX-License-Identifier: GPL-2.0
50 dev = get_cpu_device(policy->cpu); in qcom_cpufreq_set_bw()
52 return -ENODEV; in qcom_cpufreq_set_bw()
76 dev_err(cpu_dev, "Voltage update failed freq=%ld\n", freq_khz); 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() local
90 writel_relaxed(index, data->base + soc_data->reg_perf_state); in qcom_cpufreq_hw_target_index()
93 qcom_cpufreq_set_bw(policy, freq); 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()
134 u32 data, src, lval, i, core_count, prev_freq = 0, freq; 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()
159 } else if (ret != -ENODEV) { 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()
179 freq = xo_rate * lval / 1000; in qcom_cpufreq_hw_read_lut()
181 freq = cpu_hw_rate / 1000; in qcom_cpufreq_hw_read_lut()
183 if (freq != prev_freq && core_count != LUT_TURBO_IND) { in qcom_cpufreq_hw_read_lut()
184 if (!qcom_cpufreq_update_opp(cpu_dev, freq, volt)) { in qcom_cpufreq_hw_read_lut()
185 table[i].frequency = freq; in qcom_cpufreq_hw_read_lut()
186 dev_dbg(cpu_dev, "index=%d freq=%d, core_count %d\n", i, in qcom_cpufreq_hw_read_lut()
187 freq, core_count); 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()
201 if (i > 0 && prev_freq == freq) { 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()
214 freq); in qcom_cpufreq_hw_read_lut()
221 prev_freq = freq; 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",