Re: [PATCH v15 3/3] cpufreq: mediatek-hw: Add support for CPUFREQ HW

From: Viresh Kumar
Date: Mon Sep 06 2021 - 05:44:17 EST


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);
}