]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpufreq: mediatek-hw: Separate per-domain and per-instance data
authorNicolas Frattaroli <nicolas.frattaroli@collabora.com>
Wed, 16 Jul 2025 17:51:24 +0000 (19:51 +0200)
committerViresh Kumar <viresh.kumar@linaro.org>
Mon, 11 Aug 2025 06:49:02 +0000 (12:19 +0530)
As it stood, the mediatek cpufreq driver could get away with never
really having a private driver instance struct. This is because all data
was stored in the per-domain structs.

However, this complicates matters when actual per-instance data like the
variant struct is introduced. Instead of having a pointer to it for
every domain, have a pointer to a global "priv" struct that can be
extended over time, and rename the "data" struct to "domain" to
distinguish its purpose better.

Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
drivers/cpufreq/mediatek-cpufreq-hw.c

index b2aba1842226c7d24a8b9599ea62408cac9f803c..53611077d0d9a2d9865cf771568ab71abc0e6fbd 100644 (file)
@@ -35,13 +35,17 @@ enum {
        REG_ARRAY_SIZE,
 };
 
-struct mtk_cpufreq_data {
+struct mtk_cpufreq_priv {
+       const struct mtk_cpufreq_variant *variant;
+};
+
+struct mtk_cpufreq_domain {
+       struct mtk_cpufreq_priv *parent;
        struct cpufreq_frequency_table *table;
        void __iomem *reg_bases[REG_ARRAY_SIZE];
        struct resource *res;
        void __iomem *base;
        int nr_opp;
-       const struct mtk_cpufreq_variant *variant;
 };
 
 struct mtk_cpufreq_variant {
@@ -63,7 +67,7 @@ static int __maybe_unused
 mtk_cpufreq_get_cpu_power(struct device *cpu_dev, unsigned long *uW,
                          unsigned long *KHz)
 {
-       struct mtk_cpufreq_data *data;
+       struct mtk_cpufreq_domain *data;
        struct cpufreq_policy *policy;
        int i;
 
@@ -90,7 +94,7 @@ mtk_cpufreq_get_cpu_power(struct device *cpu_dev, unsigned long *uW,
 static int mtk_cpufreq_hw_target_index(struct cpufreq_policy *policy,
                                       unsigned int index)
 {
-       struct mtk_cpufreq_data *data = policy->driver_data;
+       struct mtk_cpufreq_domain *data = policy->driver_data;
 
        writel_relaxed(index, data->reg_bases[REG_FREQ_PERF_STATE]);
 
@@ -99,7 +103,7 @@ static int mtk_cpufreq_hw_target_index(struct cpufreq_policy *policy,
 
 static unsigned int mtk_cpufreq_hw_get(unsigned int cpu)
 {
-       struct mtk_cpufreq_data *data;
+       struct mtk_cpufreq_domain *data;
        struct cpufreq_policy *policy;
        unsigned int index;
 
@@ -118,7 +122,7 @@ static unsigned int mtk_cpufreq_hw_get(unsigned int cpu)
 static unsigned int mtk_cpufreq_hw_fast_switch(struct cpufreq_policy *policy,
                                               unsigned int target_freq)
 {
-       struct mtk_cpufreq_data *data = policy->driver_data;
+       struct mtk_cpufreq_domain *data = policy->driver_data;
        unsigned int index;
 
        index = cpufreq_table_find_index_dl(policy, target_freq, false);
@@ -129,7 +133,7 @@ static unsigned int mtk_cpufreq_hw_fast_switch(struct cpufreq_policy *policy,
 }
 
 static int mtk_cpu_create_freq_table(struct platform_device *pdev,
-                                    struct mtk_cpufreq_data *data)
+                                    struct mtk_cpufreq_domain *data)
 {
        struct device *dev = &pdev->dev;
        u32 temp, i, freq, prev_freq = 0;
@@ -164,9 +168,9 @@ static int mtk_cpu_create_freq_table(struct platform_device *pdev,
 
 static int mtk_cpu_resources_init(struct platform_device *pdev,
                                  struct cpufreq_policy *policy,
-                                 const struct mtk_cpufreq_variant *variant)
+                                 struct mtk_cpufreq_priv *priv)
 {
-       struct mtk_cpufreq_data *data;
+       struct mtk_cpufreq_domain *data;
        struct device *dev = &pdev->dev;
        struct resource *res;
        struct of_phandle_args args;
@@ -187,6 +191,8 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
        index = args.args[0];
        of_node_put(args.np);
 
+       data->parent = priv;
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, index);
        if (!res) {
                dev_err(dev, "failed to get mem resource %d\n", index);
@@ -207,10 +213,9 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
 
        data->base = base;
        data->res = res;
-       data->variant = variant;
 
        for (i = REG_FREQ_LUT_TABLE; i < REG_ARRAY_SIZE; i++)
-               data->reg_bases[i] = base + variant->reg_offsets[i];
+               data->reg_bases[i] = base + priv->variant->reg_offsets[i];
 
        ret = mtk_cpu_create_freq_table(pdev, data);
        if (ret) {
@@ -231,7 +236,7 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
 {
        struct platform_device *pdev = cpufreq_get_driver_data();
        int sig, pwr_hw = CPUFREQ_HW_STATUS | SVS_HW_STATUS;
-       struct mtk_cpufreq_data *data;
+       struct mtk_cpufreq_domain *data;
        unsigned int latency;
        int ret;
 
@@ -270,7 +275,7 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
 
 static void mtk_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy)
 {
-       struct mtk_cpufreq_data *data = policy->driver_data;
+       struct mtk_cpufreq_domain *data = policy->driver_data;
        struct resource *res = data->res;
        void __iomem *base = data->base;
 
@@ -283,7 +288,7 @@ static void mtk_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy)
 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;
+       struct mtk_cpufreq_domain *data = policy->driver_data;
 
        em_dev_register_perf_domain(get_cpu_device(policy->cpu), data->nr_opp,
                                    &em_cb, policy->cpus, true);
@@ -305,6 +310,7 @@ static struct cpufreq_driver cpufreq_mtk_hw_driver = {
 
 static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
 {
+       struct mtk_cpufreq_priv *priv;
        const void *data;
        int ret, cpu;
        struct device *cpu_dev;
@@ -328,7 +334,13 @@ static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
        if (!data)
                return -EINVAL;
 
-       platform_set_drvdata(pdev, (void *) data);
+       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       priv->variant = data;
+
+       platform_set_drvdata(pdev, priv);
        cpufreq_mtk_hw_driver.driver_data = pdev;
 
        ret = cpufreq_register_driver(&cpufreq_mtk_hw_driver);