]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/cpufreq/arm_big_little.c
cpufreq: arm_big_little: use generic OPP functions for {init, free}_opp_table
[mirror_ubuntu-zesty-kernel.git] / drivers / cpufreq / arm_big_little.c
index c251247ae6613e860164627d8c8161f2b0d0cfe5..418042201e6da9e501ac6fb161437b117491b3ff 100644 (file)
@@ -298,7 +298,8 @@ static int merge_cluster_tables(void)
        return 0;
 }
 
-static void _put_cluster_clk_and_freq_table(struct device *cpu_dev)
+static void _put_cluster_clk_and_freq_table(struct device *cpu_dev,
+                                           const struct cpumask *cpumask)
 {
        u32 cluster = raw_cpu_to_cluster(cpu_dev->id);
 
@@ -308,11 +309,12 @@ 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);
+               arm_bL_ops->free_opp_table(cpumask);
        dev_dbg(cpu_dev, "%s: cluster: %d\n", __func__, cluster);
 }
 
-static void put_cluster_clk_and_freq_table(struct device *cpu_dev)
+static void put_cluster_clk_and_freq_table(struct device *cpu_dev,
+                                          const struct cpumask *cpumask)
 {
        u32 cluster = cpu_to_cluster(cpu_dev->id);
        int i;
@@ -321,7 +323,7 @@ static void put_cluster_clk_and_freq_table(struct device *cpu_dev)
                return;
 
        if (cluster < MAX_CLUSTERS)
-               return _put_cluster_clk_and_freq_table(cpu_dev);
+               return _put_cluster_clk_and_freq_table(cpu_dev, cpumask);
 
        for_each_present_cpu(i) {
                struct device *cdev = get_cpu_device(i);
@@ -330,14 +332,15 @@ static void put_cluster_clk_and_freq_table(struct device *cpu_dev)
                        return;
                }
 
-               _put_cluster_clk_and_freq_table(cdev);
+               _put_cluster_clk_and_freq_table(cdev, cpumask);
        }
 
        /* free virtual table */
        kfree(freq_table[cluster]);
 }
 
-static int _get_cluster_clk_and_freq_table(struct device *cpu_dev)
+static int _get_cluster_clk_and_freq_table(struct device *cpu_dev,
+                                          const struct cpumask *cpumask)
 {
        u32 cluster = raw_cpu_to_cluster(cpu_dev->id);
        int ret;
@@ -345,7 +348,7 @@ static int _get_cluster_clk_and_freq_table(struct device *cpu_dev)
        if (freq_table[cluster])
                return 0;
 
-       ret = arm_bL_ops->init_opp_table(cpu_dev);
+       ret = arm_bL_ops->init_opp_table(cpumask);
        if (ret) {
                dev_err(cpu_dev, "%s: init_opp_table failed, cpu: %d, err: %d\n",
                                __func__, cpu_dev->id, ret);
@@ -374,14 +377,15 @@ static int _get_cluster_clk_and_freq_table(struct device *cpu_dev)
 
 free_opp_table:
        if (arm_bL_ops->free_opp_table)
-               arm_bL_ops->free_opp_table(cpu_dev);
+               arm_bL_ops->free_opp_table(cpumask);
 out:
        dev_err(cpu_dev, "%s: Failed to get data for cluster: %d\n", __func__,
                        cluster);
        return ret;
 }
 
-static int get_cluster_clk_and_freq_table(struct device *cpu_dev)
+static int get_cluster_clk_and_freq_table(struct device *cpu_dev,
+                                         const struct cpumask *cpumask)
 {
        u32 cluster = cpu_to_cluster(cpu_dev->id);
        int i, ret;
@@ -390,7 +394,7 @@ static int get_cluster_clk_and_freq_table(struct device *cpu_dev)
                return 0;
 
        if (cluster < MAX_CLUSTERS) {
-               ret = _get_cluster_clk_and_freq_table(cpu_dev);
+               ret = _get_cluster_clk_and_freq_table(cpu_dev, cpumask);
                if (ret)
                        atomic_dec(&cluster_usage[cluster]);
                return ret;
@@ -407,7 +411,7 @@ static int get_cluster_clk_and_freq_table(struct device *cpu_dev)
                        return -ENODEV;
                }
 
-               ret = _get_cluster_clk_and_freq_table(cdev);
+               ret = _get_cluster_clk_and_freq_table(cdev, cpumask);
                if (ret)
                        goto put_clusters;
        }
@@ -433,7 +437,7 @@ put_clusters:
                        return -ENODEV;
                }
 
-               _put_cluster_clk_and_freq_table(cdev);
+               _put_cluster_clk_and_freq_table(cdev, cpumask);
        }
 
        atomic_dec(&cluster_usage[cluster]);
@@ -455,18 +459,6 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
                return -ENODEV;
        }
 
-       ret = get_cluster_clk_and_freq_table(cpu_dev);
-       if (ret)
-               return ret;
-
-       ret = cpufreq_table_validate_and_show(policy, freq_table[cur_cluster]);
-       if (ret) {
-               dev_err(cpu_dev, "CPU %d, cluster: %d invalid freq table\n",
-                               policy->cpu, cur_cluster);
-               put_cluster_clk_and_freq_table(cpu_dev);
-               return ret;
-       }
-
        if (cur_cluster < MAX_CLUSTERS) {
                int cpu;
 
@@ -479,6 +471,18 @@ static int bL_cpufreq_init(struct cpufreq_policy *policy)
                per_cpu(physical_cluster, policy->cpu) = A15_CLUSTER;
        }
 
+       ret = get_cluster_clk_and_freq_table(cpu_dev, policy->cpus);
+       if (ret)
+               return ret;
+
+       ret = cpufreq_table_validate_and_show(policy, freq_table[cur_cluster]);
+       if (ret) {
+               dev_err(cpu_dev, "CPU %d, cluster: %d invalid freq table\n",
+                       policy->cpu, cur_cluster);
+               put_cluster_clk_and_freq_table(cpu_dev, policy->cpus);
+               return ret;
+       }
+
        if (arm_bL_ops->get_transition_latency)
                policy->cpuinfo.transition_latency =
                        arm_bL_ops->get_transition_latency(cpu_dev);
@@ -509,7 +513,7 @@ static int bL_cpufreq_exit(struct cpufreq_policy *policy)
                return -ENODEV;
        }
 
-       put_cluster_clk_and_freq_table(cpu_dev);
+       put_cluster_clk_and_freq_table(cpu_dev, policy->related_cpus);
        dev_dbg(cpu_dev, "%s: Exited, cpu: %d\n", __func__, policy->cpu);
 
        return 0;