summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Aaberg <jonas.aberg@stericsson.com>2011-12-19 11:53:50 +0100
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 10:59:30 +0200
commit8ba293285244d1104118cbdebfe9a99f43d2f68d (patch)
tree3e6f4c7c18e652a9a709fde85fc75977d9d9060a
parentd513fd1d1a7963c39da32171a0bee45b180187f2 (diff)
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 <jonas.aberg@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/43051
-rw-r--r--arch/arm/mach-ux500/pm/usecase_gov.c40
1 files 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);