diff options
author | Jonas Aaberg <jonas.aberg@stericsson.com> | 2011-12-22 09:24:39 +0100 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 10:59:28 +0200 |
commit | c996fcdcedf8d70a101c53ff8f8610c02be737a7 (patch) | |
tree | 3758cd49d7a13d17f70d875e54c3dd5536c34238 | |
parent | ff456e7674409437ef7e50699d6f23f35ed3791d (diff) |
drivers: cpufreq: ux500: Add check for unknown OPP
Print out an error message if the ARM OPP provided
from the prcmu fw is unknown to us.
ST-Ericsson Linux next: -
ST-Ericsson ID: 370799
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I9456bd967b2dab3756f646f10c1d1e5f98b437fa
Signed-off-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/43592
-rw-r--r-- | drivers/cpufreq/dbx500-cpufreq.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/cpufreq/dbx500-cpufreq.c b/drivers/cpufreq/dbx500-cpufreq.c index f1cc009a3b1..9680bb9ff33 100644 --- a/drivers/cpufreq/dbx500-cpufreq.c +++ b/drivers/cpufreq/dbx500-cpufreq.c @@ -115,6 +115,8 @@ static int dbx500_cpufreq_target(struct cpufreq_policy *policy, for_each_cpu(freqs.cpu, policy->cpus) cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); + BUG_ON(idx >= freq_table_len); + /* request the PRCM unit for opp change */ if (prcmu_set_arm_opp(idx2opp[idx])) { pr_err("ux500-cpufreq: Failed to set OPP level\n"); @@ -131,10 +133,25 @@ static int dbx500_cpufreq_target(struct cpufreq_policy *policy, static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu) { int i; + enum arm_opp current_opp; + + current_opp = prcmu_get_arm_opp(); + /* request the prcm to get the current ARM opp */ - for (i = 0; prcmu_get_arm_opp() != idx2opp[i]; i++) - ; - return freq_table[i].frequency; + for (i = 0; i < freq_table_len; i++) { + if (current_opp == idx2opp[i]) + return freq_table[i].frequency; + } + + pr_err("cpufreq: ERROR: unknown opp %d given from prcmufw!\n", + current_opp); + BUG_ON(1); + + /* + * Better to return something that might be correct than + * errno or zero, since clk_get_rate() won't do well with an errno. + */ + return freq_table[0].frequency; } static void __init dbx500_cpufreq_init_maxopp_freq(void) @@ -171,6 +188,8 @@ static void __init dbx500_cpufreq_early_init(void) idx2opp = db8500_idx2opp; dbx500_cpufreq_init_maxopp_freq(); freq_table_len = ARRAY_SIZE(db8500_freq_table); + if (!prcmu_has_arm_maxopp()) + freq_table_len--; } else { ux500_unknown_soc(); } |