summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorMian Yousaf Kaukab <mian.yousaf.kaukab@stericsson.com>2011-10-17 17:38:44 +0200
committerLinus WALLEIJ <linus.walleij@stericsson.com>2011-10-20 17:26:01 +0200
commitd994321261e5e079882c90e9d5bd24ace959dfc9 (patch)
tree52bd11e9fd32d1207abe21bb4b911965a7ad6acf /arch
parent9b443812cf12d8c8e2f30064e5eaff56e2116cb0 (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')
-rw-r--r--arch/arm/mach-ux500/pm/usecase_gov.c72
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);