cpufreq: arm_big_little: free OPP table created during ->init()
authorViresh Kumar <viresh.kumar@linaro.org>
Tue, 25 Nov 2014 10:34:20 +0000 (16:04 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 1 Dec 2014 23:01:24 +0000 (00:01 +0100)
OPP layer now supports freeing of OPPs and we should free them once they aren't
useful anymore.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/cpufreq/arm_big_little.c
drivers/cpufreq/arm_big_little.h
drivers/cpufreq/arm_big_little_dt.c

index a46c223..e1a6ba6 100644 (file)
@@ -289,6 +289,8 @@ static void _put_cluster_clk_and_freq_table(struct device *cpu_dev)
 
        clk_put(clk[cluster]);
        dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table[cluster]);
+       if (arm_bL_ops->free_opp_table)
+               arm_bL_ops->free_opp_table(cpu_dev);
        dev_dbg(cpu_dev, "%s: cluster: %d\n", __func__, cluster);
 }
 
@@ -337,7 +339,7 @@ static int _get_cluster_clk_and_freq_table(struct device *cpu_dev)
        if (ret) {
                dev_err(cpu_dev, "%s: failed to init cpufreq table, cpu: %d, err: %d\n",
                                __func__, cpu_dev->id, ret);
-               goto out;
+               goto free_opp_table;
        }
 
        name[12] = cluster + '0';
@@ -354,6 +356,9 @@ static int _get_cluster_clk_and_freq_table(struct device *cpu_dev)
        ret = PTR_ERR(clk[cluster]);
        dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table[cluster]);
 
+free_opp_table:
+       if (arm_bL_ops->free_opp_table)
+               arm_bL_ops->free_opp_table(cpu_dev);
 out:
        dev_err(cpu_dev, "%s: Failed to get data for cluster: %d\n", __func__,
                        cluster);
index 70f18fc..a211f7d 100644 (file)
 
 struct cpufreq_arm_bL_ops {
        char name[CPUFREQ_NAME_LEN];
-       int (*get_transition_latency)(struct device *cpu_dev);
 
        /*
         * This must set opp table for cpu_dev in a similar way as done by
         * of_init_opp_table().
         */
        int (*init_opp_table)(struct device *cpu_dev);
+
+       /* Optional */
+       int (*get_transition_latency)(struct device *cpu_dev);
+       void (*free_opp_table)(struct device *cpu_dev);
 };
 
 int bL_cpufreq_register(struct cpufreq_arm_bL_ops *ops);
index 4550f69..ef0b3f1 100644 (file)
@@ -82,6 +82,7 @@ static struct cpufreq_arm_bL_ops dt_bL_ops = {
        .name   = "dt-bl",
        .get_transition_latency = dt_get_transition_latency,
        .init_opp_table = dt_init_opp_table,
+       .free_opp_table = of_free_opp_table,
 };
 
 static int generic_bL_probe(struct platform_device *pdev)