[PATCH v15 3/3] cpufreq: mediatek-hw: Add support for CPUFREQ HW
Viresh Kumar
viresh.kumar at linaro.org
Mon Sep 6 02:44:11 PDT 2021
On 03-09-21, 16:39, Hector Yuan wrote:
> From: "Hector.Yuan" <hector.yuan at mediatek.com>
>
> Introduce cpufreq HW driver which can support
> CPU frequency adjust in MT6779 platform.
>
> Signed-off-by: Hector.Yuan <hector.yuan at mediatek.com>
> ---
> 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);
}
More information about the linux-arm-kernel
mailing list