From 8ba293285244d1104118cbdebfe9a99f43d2f68d Mon Sep 17 00:00:00 2001 From: Jonas Aaberg Date: Mon, 19 Dec 2011 11:53:50 +0100 Subject: ARM: ux500: pm: usecase_gov: clear max_arm_opp on exit Once a max arm opp was set, it was kept no matter what. This patch simplifies the code and make sure any changes to the min/max frequency always get propagated. ST-Ericsson Linux next: - ST-Ericsson ID: 403563 ST-Ericsson FOSS-OUT ID: Trivial Change-Id: I3ed7eceadb767fc0f0ba176c8fcc9794427b24fd Signed-off-by: Jonas Aaberg Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/43051 --- arch/arm/mach-ux500/pm/usecase_gov.c | 40 ++++++++++++------------------------ 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/arch/arm/mach-ux500/pm/usecase_gov.c b/arch/arm/mach-ux500/pm/usecase_gov.c index 40be7239e39..a3fc3c490b5 100644 --- a/arch/arm/mach-ux500/pm/usecase_gov.c +++ b/arch/arm/mach-ux500/pm/usecase_gov.c @@ -83,7 +83,6 @@ struct usecase_config { char *name; /* Minimum required ARM OPP. if no requirement set 25 */ unsigned int min_arm_opp; - /* Only use max_arm_opp if you know what you're doing */ unsigned int max_arm_opp; unsigned long cpuidle_multiplier; bool second_cpu_online; @@ -317,6 +316,8 @@ static int set_cpufreq(int cpu, int min_freq, int max_freq) int ret; struct cpufreq_policy policy; + pr_debug("set cpu freq: min %d max: %d\n", min_freq, max_freq); + ret = cpufreq_get_policy(&policy, cpu); if (ret < 0) { pr_err("usecase-gov: failed to read policy\n"); @@ -344,9 +345,8 @@ static int set_cpufreq(int cpu, int min_freq, int max_freq) static void set_cpu_config(enum ux500_uc new_uc) { bool update = false; - int ret; int cpu; - static struct cpufreq_policy original_cpufreq_policy; + int max_freq, min_freq; if (new_uc != current_uc) update = true; @@ -367,35 +367,21 @@ static void set_cpu_config(enum ux500_uc new_uc) (num_online_cpus() < 2)) cpu_up(1); - if (usecase_conf[new_uc].max_arm_opp) { - int max_freq; - + if(usecase_conf[new_uc].max_arm_opp) max_freq = dbx500_cpufreq_percent2freq(usecase_conf[new_uc].max_arm_opp); + else + /* Maximum OPP is 125% */ + max_freq = dbx500_cpufreq_percent2freq(125); - ret = cpufreq_get_policy(&original_cpufreq_policy, 0); - if (ret < 0) - pr_err("usecase-gov: fail to get cpufreq policy\n"); - - for_each_online_cpu(cpu) { - set_cpufreq(cpu, - original_cpufreq_policy.min, - max_freq); - } - } + min_freq = dbx500_cpufreq_percent2freq(usecase_conf[new_uc].min_arm_opp); - if (new_uc == UX500_UC_NORMAL && - usecase_conf[current_uc].max_arm_opp) { - /* - * Reset cpufreq limits to what is was before. Yes, overwrite - * any changes done outside usecase governors control. - */ - for_each_online_cpu(cpu) { - set_cpufreq(cpu, - original_cpufreq_policy.min, - original_cpufreq_policy.max); - } + for_each_online_cpu(cpu) { + set_cpufreq(cpu, + min_freq, + max_freq); } + /* Kinda doing the job twice, but this is needed for reference keeping */ prcmu_qos_update_requirement(PRCMU_QOS_ARM_OPP, "usecase", usecase_conf[new_uc].min_arm_opp); -- cgit v1.2.3