aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViresh Kumar <viresh.kumar@linaro.org>2012-12-18 12:00:59 +0530
committerAndrey Konovalov <andrey.konovalov@linaro.org>2013-05-25 13:27:27 +0400
commit9c2010c231ad92a97b66be2258cf2871a63304f7 (patch)
treeb571f17ec6d8e6dc904d483a0462ce8492f2f267
parentfce6c6884da1ca88973181cb2580b19a39239b6b (diff)
cpufreq: arm_big_little: simplify find_cluster_maxfreq()
find_cluster_maxfreq() looks overly complex, lets simplify it. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
-rw-r--r--drivers/cpufreq/arm_big_little.c47
1 files changed, 25 insertions, 22 deletions
diff --git a/drivers/cpufreq/arm_big_little.c b/drivers/cpufreq/arm_big_little.c
index 22d04bd196c..a3c9fbc9ba7 100644
--- a/drivers/cpufreq/arm_big_little.c
+++ b/drivers/cpufreq/arm_big_little.c
@@ -69,23 +69,23 @@ static int cpu_to_cluster(int cpu)
topology_physical_package_id(cpu);
}
-static unsigned int find_cluster_maxfreq(int cpu, int cluster, unsigned int new)
+static unsigned int find_cluster_maxfreq(int cluster)
{
int j;
+ u32 max_freq = 0, cpu_freq;
for_each_online_cpu(j) {
- unsigned int temp = per_cpu(cpu_last_req_freq, j);
+ cpu_freq = per_cpu(cpu_last_req_freq, j);
- if (cpu == j)
- continue;
- if (cluster == per_cpu(physical_cluster, j) &&
- new < temp)
- new = temp;
+ if ((cluster == per_cpu(physical_cluster, j)) &&
+ (max_freq < cpu_freq))
+ max_freq = cpu_freq;
}
- pr_debug("%s: cluster: %d, max freq: %d\n", __func__, cluster, new);
+ pr_debug("%s: cluster: %d, max freq: %d\n", __func__, cluster,
+ max_freq);
- return new;
+ return max_freq;
}
static unsigned int clk_get_cpu_rate(unsigned int cpu)
@@ -113,11 +113,15 @@ static unsigned int bL_cpufreq_get_rate(unsigned int cpu)
static unsigned int
bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
{
- u32 new_rate;
+ u32 new_rate, prev_rate;
int ret;
+ prev_rate = per_cpu(cpu_last_req_freq, cpu);
+ per_cpu(cpu_last_req_freq, cpu) = rate;
+ per_cpu(physical_cluster, cpu) = new_cluster;
+
if (is_bL_switching_enabled()) {
- new_rate = find_cluster_maxfreq(cpu, new_cluster, rate);
+ new_rate = find_cluster_maxfreq(new_cluster);
new_rate = ACTUAL_FREQ(new_cluster, new_rate);
} else {
new_rate = rate;
@@ -130,15 +134,23 @@ bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
if (ret) {
pr_err("clk_set_rate failed: %d, new cluster: %d\n", ret,
new_cluster);
+ per_cpu(cpu_last_req_freq, cpu) = prev_rate;
+ per_cpu(physical_cluster, cpu) = old_cluster;
return ret;
}
/* Recalc freq for old cluster when switching clusters */
if (old_cluster != new_cluster) {
- new_rate = find_cluster_maxfreq(cpu, old_cluster, 0);
- new_rate = ACTUAL_FREQ(old_cluster, new_rate);
+ pr_debug("%s: cpu: %d, old cluster: %d, new cluster: %d\n",
+ __func__, cpu, old_cluster, new_cluster);
+
+ /* Switch cluster */
+ bL_switch_request(cpu, new_cluster);
/* Set freq of old cluster if there are cpus left on it */
+ new_rate = find_cluster_maxfreq(old_cluster);
+ new_rate = ACTUAL_FREQ(old_cluster, new_rate);
+
if (new_rate) {
pr_debug("%s: Updating rate of old cluster: %d, to freq: %d\n",
__func__, old_cluster, new_rate);
@@ -149,7 +161,6 @@ bL_cpufreq_set_rate(u32 cpu, u32 old_cluster, u32 new_cluster, u32 rate)
}
}
- per_cpu(cpu_last_req_freq, cpu) = rate;
return 0;
}
@@ -207,14 +218,6 @@ static int bL_cpufreq_set_target(struct cpufreq_policy *policy,
if (ret)
return ret;
- if (new_cluster != actual_cluster) {
- pr_debug("%s: old cluster: %d, new cluster: %d\n", __func__,
- actual_cluster, new_cluster);
-
- bL_switch_request(cpu, new_cluster);
- per_cpu(physical_cluster, cpu) = new_cluster;
- }
-
policy->cur = freqs.new;
for_each_cpu(freqs.cpu, policy->cpus)