Lines Matching +full:cpufreq +full:- +full:hw
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/cpufreq.h>
62 policy = cpufreq_cpu_get_raw(cpu_dev->id); in mtk_cpufreq_get_cpu_power()
66 data = policy->driver_data; in mtk_cpufreq_get_cpu_power()
68 for (i = 0; i < data->nr_opp; i++) { in mtk_cpufreq_get_cpu_power()
69 if (data->table[i].frequency < *KHz) in mtk_cpufreq_get_cpu_power()
72 i--; in mtk_cpufreq_get_cpu_power()
74 *KHz = data->table[i].frequency; in mtk_cpufreq_get_cpu_power()
75 /* Provide micro-Watts value to the Energy Model */ in mtk_cpufreq_get_cpu_power()
76 *uW = readl_relaxed(data->reg_bases[REG_EM_POWER_TBL] + in mtk_cpufreq_get_cpu_power()
85 struct mtk_cpufreq_data *data = policy->driver_data; in mtk_cpufreq_hw_target_index()
87 writel_relaxed(index, data->reg_bases[REG_FREQ_PERF_STATE]); in mtk_cpufreq_hw_target_index()
102 data = policy->driver_data; in mtk_cpufreq_hw_get()
104 index = readl_relaxed(data->reg_bases[REG_FREQ_PERF_STATE]); in mtk_cpufreq_hw_get()
105 index = min(index, LUT_MAX_ENTRIES - 1); in mtk_cpufreq_hw_get()
107 return data->table[index].frequency; in mtk_cpufreq_hw_get()
113 struct mtk_cpufreq_data *data = policy->driver_data; in mtk_cpufreq_hw_fast_switch()
118 writel_relaxed(index, data->reg_bases[REG_FREQ_PERF_STATE]); in mtk_cpufreq_hw_fast_switch()
120 return policy->freq_table[index].frequency; in mtk_cpufreq_hw_fast_switch()
126 struct device *dev = &pdev->dev; in mtk_cpu_create_freq_table()
130 data->table = devm_kcalloc(dev, LUT_MAX_ENTRIES + 1, in mtk_cpu_create_freq_table()
131 sizeof(*data->table), GFP_KERNEL); in mtk_cpu_create_freq_table()
132 if (!data->table) in mtk_cpu_create_freq_table()
133 return -ENOMEM; in mtk_cpu_create_freq_table()
135 base_table = data->reg_bases[REG_FREQ_LUT_TABLE]; in mtk_cpu_create_freq_table()
144 data->table[i].frequency = freq; in mtk_cpu_create_freq_table()
146 dev_dbg(dev, "index=%d freq=%d\n", i, data->table[i].frequency); in mtk_cpu_create_freq_table()
151 data->table[i].frequency = CPUFREQ_TABLE_END; in mtk_cpu_create_freq_table()
152 data->nr_opp = i; in mtk_cpu_create_freq_table()
162 struct device *dev = &pdev->dev; in mtk_cpu_resources_init()
171 return -ENOMEM; in mtk_cpu_resources_init()
173 ret = of_perf_domain_get_sharing_cpumask(policy->cpu, "performance-domains", in mtk_cpu_resources_init()
174 "#performance-domain-cells", in mtk_cpu_resources_init()
175 policy->cpus, &args); in mtk_cpu_resources_init()
185 return -ENODEV; in mtk_cpu_resources_init()
188 if (!request_mem_region(res->start, resource_size(res), res->name)) { in mtk_cpu_resources_init()
190 return -EBUSY; in mtk_cpu_resources_init()
193 base = ioremap(res->start, resource_size(res)); in mtk_cpu_resources_init()
196 ret = -ENOMEM; in mtk_cpu_resources_init()
200 data->base = base; in mtk_cpu_resources_init()
201 data->res = res; in mtk_cpu_resources_init()
204 data->reg_bases[i] = base + offsets[i]; in mtk_cpu_resources_init()
208 dev_info(dev, "Domain-%d failed to create freq table\n", index); in mtk_cpu_resources_init()
212 policy->freq_table = data->table; in mtk_cpu_resources_init()
213 policy->driver_data = data; in mtk_cpu_resources_init()
217 release_mem_region(res->start, resource_size(res)); in mtk_cpu_resources_init()
229 /* Get the bases of cpufreq for domains */ in mtk_cpufreq_hw_cpu_init()
232 dev_info(&pdev->dev, "CPUFreq resource init failed\n"); in mtk_cpufreq_hw_cpu_init()
236 data = policy->driver_data; in mtk_cpufreq_hw_cpu_init()
238 latency = readl_relaxed(data->reg_bases[REG_FREQ_LATENCY]) * 1000; in mtk_cpufreq_hw_cpu_init()
242 policy->cpuinfo.transition_latency = latency; in mtk_cpufreq_hw_cpu_init()
243 policy->fast_switch_possible = true; in mtk_cpufreq_hw_cpu_init()
245 /* HW should be in enabled state to proceed now */ in mtk_cpufreq_hw_cpu_init()
246 writel_relaxed(0x1, data->reg_bases[REG_FREQ_ENABLE]); in mtk_cpufreq_hw_cpu_init()
247 if (readl_poll_timeout(data->reg_bases[REG_FREQ_HW_STATE], sig, in mtk_cpufreq_hw_cpu_init()
251 pr_info("cpufreq hardware of CPU%d is not enabled\n", in mtk_cpufreq_hw_cpu_init()
252 policy->cpu); in mtk_cpufreq_hw_cpu_init()
253 return -ENODEV; in mtk_cpufreq_hw_cpu_init()
256 pr_info("SVS of CPU%d is not enabled\n", policy->cpu); in mtk_cpufreq_hw_cpu_init()
264 struct mtk_cpufreq_data *data = policy->driver_data; in mtk_cpufreq_hw_cpu_exit()
265 struct resource *res = data->res; in mtk_cpufreq_hw_cpu_exit()
266 void __iomem *base = data->base; in mtk_cpufreq_hw_cpu_exit()
268 /* HW should be in paused state now */ in mtk_cpufreq_hw_cpu_exit()
269 writel_relaxed(0x0, data->reg_bases[REG_FREQ_ENABLE]); in mtk_cpufreq_hw_cpu_exit()
271 release_mem_region(res->start, resource_size(res)); in mtk_cpufreq_hw_cpu_exit()
279 struct mtk_cpufreq_data *data = policy->driver_data; in mtk_cpufreq_register_em()
281 em_dev_register_perf_domain(get_cpu_device(policy->cpu), data->nr_opp, in mtk_cpufreq_register_em()
282 &em_cb, policy->cpus, true); in mtk_cpufreq_register_em()
296 .name = "mtk-cpufreq-hw",
305 data = of_device_get_match_data(&pdev->dev); in mtk_cpufreq_hw_driver_probe()
307 return -EINVAL; in mtk_cpufreq_hw_driver_probe()
314 dev_err(&pdev->dev, "CPUFreq HW driver failed to register\n"); in mtk_cpufreq_hw_driver_probe()
325 { .compatible = "mediatek,cpufreq-hw", .data = &cpufreq_mtk_offsets },
334 .name = "mtk-cpufreq-hw",
341 MODULE_DESCRIPTION("Mediatek cpufreq-hw driver");