diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2011-10-07 10:38:08 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2011-12-06 10:46:41 +0100 |
commit | 0250d7be1ccfc943603c01d1ecba1ba4cfab4494 (patch) | |
tree | de04de6e20b03746d4a291e543d4ec42f90c4d84 /drivers/cpufreq | |
parent | 53b3274e7627d5976f65b72b928575c0c7895183 (diff) |
ux500: add smp_twd clock
Add a smp_twd clock with an appropriate get_rate() implementation so that
localtimers scale correctly with cpufreq changes.
ST-Ericsson ID: 361450
ST-Ericsson Linux next: NA
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: I492af8efe1c8c081f6079e538f6edf296eca3a02
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33277
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/dbx500-cpufreq.c | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/drivers/cpufreq/dbx500-cpufreq.c b/drivers/cpufreq/dbx500-cpufreq.c index fcc21181097..1f9249f869a 100644 --- a/drivers/cpufreq/dbx500-cpufreq.c +++ b/drivers/cpufreq/dbx500-cpufreq.c @@ -136,6 +136,44 @@ static unsigned int dbx500_cpufreq_getspeed(unsigned int cpu) return freq_table[i].frequency; } +static bool initialized; + +static void __init dbx500_cpufreq_early_init(void) +{ + if (cpu_is_u5500()) { + freq_table = db5500_freq_table; + idx2opp = db5500_idx2opp; + + } else if (cpu_is_u8500()) { + freq_table = db8500_freq_table; + idx2opp = db8500_idx2opp; + + if (!prcmu_is_u8400()) { + freq_table[1].frequency = 400000; + freq_table[2].frequency = 800000; + if (prcmu_has_arm_maxopp()) + freq_table[3].frequency = 1000000; + } + + } else { + ux500_unknown_soc(); + } + + initialized = true; +} + +/* + * This is called from localtimer initialization, via the clk_get_rate() for + * the smp_twd clock. This is way before cpufreq is initialized. + */ +unsigned long dbx500_cpufreq_getfreq(void) +{ + if (!initialized) + dbx500_cpufreq_early_init(); + + return dbx500_cpufreq_getspeed(0) * 1000; +} + int dbx500_cpufreq_get_limits(int cpu, int r, unsigned int *min, unsigned int *max) { @@ -252,25 +290,8 @@ static int __init dbx500_cpufreq_register(void) if (cpu_is_u8500() && !cpu_is_u8500v20_or_later()) return -ENODEV; - - if (cpu_is_u5500()) { - freq_table = db5500_freq_table; - idx2opp = db5500_idx2opp; - - } else if (cpu_is_u8500()) { - freq_table = db8500_freq_table; - idx2opp = db8500_idx2opp; - - if (!prcmu_is_u8400()) { - freq_table[1].frequency = 400000; - freq_table[2].frequency = 800000; - if (prcmu_has_arm_maxopp()) - freq_table[3].frequency = 1000000; - } - - } else { - ux500_unknown_soc(); - } + if (!initialized) + dbx500_cpufreq_early_init(); pr_info("dbx500-cpufreq : Available frequencies:\n"); |