On 03-09-21, 16:39, Hector Yuan wrote: > From: "Hector.Yuan" <hector.yuan@xxxxxxxxxxxx> > > Introduce cpufreq HW driver which can support > CPU frequency adjust in MT6779 platform. > > Signed-off-by: Hector.Yuan <hector.yuan@xxxxxxxxxxxx> > --- > drivers/cpufreq/Kconfig.arm | 12 ++ > drivers/cpufreq/Makefile | 1 + > drivers/cpufreq/mediatek-cpufreq-hw.c | 340 +++++++++++++++++++++++++++++++++ > 3 files changed, 353 insertions(+) > create mode 100644 drivers/cpufreq/mediatek-cpufreq-hw.c Here as well, I have added below diff to the original patch. Lemme know if you don't like something. diff --git a/drivers/cpufreq/mediatek-cpufreq-hw.c b/drivers/cpufreq/mediatek-cpufreq-hw.c index 9c6df1b00f3e..0cf18dd46b92 100644 --- a/drivers/cpufreq/mediatek-cpufreq-hw.c +++ b/drivers/cpufreq/mediatek-cpufreq-hw.c @@ -33,12 +33,6 @@ enum { REG_ARRAY_SIZE, }; -struct mtk_cpufreq_drv; - -struct mtk_cpufreq_drv { - const u16 *offsets; -}; - struct mtk_cpufreq_data { struct cpufreq_frequency_table *table; void __iomem *reg_bases[REG_ARRAY_SIZE]; @@ -126,8 +120,8 @@ static int mtk_cpu_create_freq_table(struct platform_device *pdev, struct mtk_cpufreq_data *data) { struct device *dev = &pdev->dev; - void __iomem *base_table; u32 temp, i, freq, prev_freq = 0; + void __iomem *base_table; data->table = devm_kcalloc(dev, LUT_MAX_ENTRIES + 1, sizeof(*data->table), GFP_KERNEL); @@ -198,15 +192,13 @@ static int mtk_cpu_resources_init(struct platform_device *pdev, static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) { struct platform_device *pdev = cpufreq_get_driver_data(); - struct mtk_cpufreq_drv *drv = platform_get_drvdata(pdev); int sig, pwr_hw = CPUFREQ_HW_STATUS | SVS_HW_STATUS; struct mtk_cpufreq_data *data; - struct device *cpu_dev; unsigned int latency; int ret; /* Get the bases of cpufreq for domains */ - ret = mtk_cpu_resources_init(pdev, policy, drv->offsets); + ret = mtk_cpu_resources_init(pdev, policy, platform_get_drvdata(pdev)); if (ret) { dev_info(&pdev->dev, "CPUFreq resource init failed\n"); return ret; @@ -218,9 +210,7 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) if (!latency) latency = CPUFREQ_ETERNAL; - /* us convert to ns */ policy->cpuinfo.transition_latency = latency; - policy->fast_switch_possible = true; /* HW should be in enabled state to proceed now */ @@ -237,12 +227,6 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy) pr_info("SVS of CPU%d is not enabled\n", policy->cpu); } - cpu_dev = get_cpu_device(policy->cpu); - if (!cpu_dev) { - pr_info("failed to get cpu%d device\n", policy->cpu); - return -ENODEV; - } - return 0; } @@ -261,9 +245,6 @@ static void mtk_cpufreq_register_em(struct cpufreq_policy *policy) struct em_data_callback em_cb = EM_DATA_CB(mtk_cpufreq_get_cpu_power); struct mtk_cpufreq_data *data = policy->driver_data; - if (!data->nr_opp) - return; - em_dev_register_perf_domain(get_cpu_device(policy->cpu), data->nr_opp, &em_cb, policy->cpus, true); } @@ -285,22 +266,14 @@ static struct cpufreq_driver cpufreq_mtk_hw_driver = { static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev) { - struct mtk_cpufreq_drv *drv; - const u16 *offsets; + const void *data; int ret; - offsets = of_device_get_match_data(&pdev->dev); - if (!offsets) + data = of_device_get_match_data(&pdev->dev); + if (!data) return -EINVAL; - drv = kzalloc(sizeof(*drv), GFP_KERNEL); - if (!drv) - return -ENOMEM; - - drv->offsets = offsets; - - platform_set_drvdata(pdev, drv); - + platform_set_drvdata(pdev, (void *) data); cpufreq_mtk_hw_driver.driver_data = pdev; ret = cpufreq_register_driver(&cpufreq_mtk_hw_driver); @@ -312,11 +285,6 @@ static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev) static int mtk_cpufreq_hw_driver_remove(struct platform_device *pdev) { - struct mtk_cpufreq_drv *drv = platform_get_drvdata(pdev); - - kfree(drv->offsets); - kfree(drv); - return cpufreq_unregister_driver(&cpufreq_mtk_hw_driver); }