diff options
author | Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com> | 2011-10-17 17:38:44 +0200 |
---|---|---|
committer | Linus WALLEIJ <linus.walleij@stericsson.com> | 2011-10-20 17:26:01 +0200 |
commit | d994321261e5e079882c90e9d5bd24ace959dfc9 (patch) | |
tree | 52bd11e9fd32d1207abe21bb4b911965a7ad6acf /arch/arm | |
parent | 9b443812cf12d8c8e2f30064e5eaff56e2116cb0 (diff) |
[ANDROID]: ux500: pm: usecase: remove upper arm frequency bounds
There is no need to specify upper arm frequency bounds for low-power-audio and
voice-call. CPUFreq's statistics shows that when running at 400MHz, 95% of the
time frequency is not increased for these use-cases. Power figures for these
use-cases show no impact after removing upper bounds. Not having upper bounds
will prevent the CPU from chocking when a audio codec with higher mips
requirements is in use.
Moreover, instead of using lower arm frequency bounds, use PRCMU ARM QOS and
specify the required operating point.
ST-Ericsson ID: 361756
ST-Ericsson Linux next: N/A
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I629201af7c3dc143308c92aa4bb88a8341156824
Signed-off-by: Mian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/34278
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Reviewed-by: Bengt JONSSON <bengt.g.jonsson@stericsson.com>
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/mach-ux500/pm/usecase_gov.c | 72 |
1 files changed, 16 insertions, 56 deletions
diff --git a/arch/arm/mach-ux500/pm/usecase_gov.c b/arch/arm/mach-ux500/pm/usecase_gov.c index aa2528f1c2b..c17a4c3f3dc 100644 --- a/arch/arm/mach-ux500/pm/usecase_gov.c +++ b/arch/arm/mach-ux500/pm/usecase_gov.c @@ -81,8 +81,8 @@ static unsigned int cpuidle_deepest_state; struct usecase_config { char *name; - unsigned long max_freq; - unsigned long min_freq; /* if no requirement set 0 */ + /* Minimum required ARM OPP. if no requirement set 25 */ + unsigned int min_arm_opp; unsigned long cpuidle_multiplier; bool second_cpu_online; bool l2_prefetch_en; @@ -94,8 +94,7 @@ struct usecase_config { static struct usecase_config usecase_conf[UX500_UC_MAX] = { [UX500_UC_NORMAL] = { .name = "normal", - .max_freq = 1000000, - .min_freq = 200000, + .min_arm_opp = 25, .cpuidle_multiplier = 1024, .second_cpu_online = true, .l2_prefetch_en = true, @@ -105,8 +104,7 @@ static struct usecase_config usecase_conf[UX500_UC_MAX] = { }, [UX500_UC_AUTO] = { .name = "auto", - .max_freq = 400000, - .min_freq = 200000, + .min_arm_opp = 25, .cpuidle_multiplier = 0, .second_cpu_online = false, .l2_prefetch_en = true, @@ -116,8 +114,7 @@ static struct usecase_config usecase_conf[UX500_UC_MAX] = { }, [UX500_UC_VC] = { .name = "voice-call", - .max_freq = 800000, - .min_freq = 400000, + .min_arm_opp = 50, .cpuidle_multiplier = 0, .second_cpu_online = false, .l2_prefetch_en = false, @@ -127,8 +124,7 @@ static struct usecase_config usecase_conf[UX500_UC_MAX] = { }, [UX500_UC_LPA] = { .name = "low-power-audio", - .max_freq = 400000, - .min_freq = 400000, + .min_arm_opp = 50, .cpuidle_multiplier = 0, .second_cpu_online = false, .l2_prefetch_en = false, @@ -329,10 +325,7 @@ static u32 get_num_interrupts_per_s(void) static void set_cpu_config(enum ux500_uc new_uc) { - struct cpufreq_policy policy; - int err; bool update = false; - u32 min_freq, max_freq; if (new_uc != current_uc) update = true; @@ -353,38 +346,8 @@ static void set_cpu_config(enum ux500_uc new_uc) (num_online_cpus() < 2)) cpu_up(1); - /* Cpu freq */ - err = cpufreq_get_policy(&policy, 0); - if (err) - pr_err("usecase-gov: get cpufreq policy failed\n"); - - /* If requirement is 0, use current policy value */ - min_freq = usecase_conf[new_uc].min_freq ? - usecase_conf[new_uc].min_freq : policy.min; - - max_freq = usecase_conf[new_uc].max_freq ? - usecase_conf[new_uc].max_freq : policy.max; - - /* - * cpufreq fw does not allow frequency change if - * "current min freq" > "new max freq" or - * "current max freq" < "new min freq". - * Thus the intermediate steps below. - */ - if (policy.min > max_freq) { - err = cpufreq_update_freq(0, min_freq, policy.max); - if (err) - pr_err("usecase-gov: update min cpufreq failed\n"); - } - if (policy.max < min_freq) { - err = cpufreq_update_freq(0, policy.min, max_freq); - if (err) - pr_err("usecase-gov: update max cpufreq failed\n"); - } - - err = cpufreq_update_freq(0, min_freq, max_freq); - if (err) - pr_err("usecase-gov: update min/max cpufreq failed\n"); + prcmu_qos_update_requirement(PRCMU_QOS_ARM_OPP, + "usecase", usecase_conf[new_uc].min_arm_opp); /* Cpu idle */ cpuidle_set_multiplier(usecase_conf[new_uc].cpuidle_multiplier); @@ -687,8 +650,7 @@ static void usecase_update_user_config(void) mutex_lock(&usecase_mutex); - user_conf->max_freq = 0; - user_conf->min_freq = 0; + user_conf->min_arm_opp = 25; user_conf->cpuidle_multiplier = 0; user_conf->second_cpu_online = false; user_conf->l2_prefetch_en = false; @@ -702,11 +664,9 @@ static void usecase_update_user_config(void) config_enable = true; - if (usecase_conf[i].max_freq > user_conf->max_freq) - user_conf->max_freq = usecase_conf[i].max_freq; - /* It's the highest min freq requirement that should be used */ - if (usecase_conf[i].min_freq > user_conf->min_freq) - user_conf->min_freq = usecase_conf[i].min_freq; + /* It's the highest arm opp requirement that should be used */ + if (usecase_conf[i].min_arm_opp > user_conf->min_arm_opp) + user_conf->min_arm_opp = usecase_conf[i].min_arm_opp; if (usecase_conf[i].cpuidle_multiplier > user_conf->cpuidle_multiplier) @@ -761,15 +721,13 @@ static ssize_t show_current(struct sysdev_class *class, enum ux500_uc display_uc = (current_uc == UX500_UC_MAX) ? UX500_UC_NORMAL : current_uc; - return sprintf(buf, "max_freq: %ld\n" - "min_freq: %ld\n" + return sprintf(buf, "min_arm_opp: %d\n" "cpuidle_multiplier: %ld\n" "second_cpu_online: %s\n" "l2_prefetch_en: %s\n" "forced_state: %d\n" "vc_override: %s\n", - usecase_conf[display_uc].max_freq, - usecase_conf[display_uc].min_freq, + usecase_conf[display_uc].min_arm_opp, usecase_conf[display_uc].cpuidle_multiplier, usecase_conf[display_uc].second_cpu_online ? "true" : "false", usecase_conf[display_uc].l2_prefetch_en ? "true" : "false", @@ -932,6 +890,8 @@ static int __init init_usecase_devices(void) usecase_cpuidle_init(); + prcmu_qos_add_requirement(PRCMU_QOS_ARM_OPP, "usecase", 25); + return 0; error2: debugfs_remove_recursive(usecase_dir); |