diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2011-10-07 10:38:08 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 10:59:10 +0200 |
commit | ae63cac2d342924cb36087aa65eed306601e56e1 (patch) | |
tree | e62c174b41d42ed7475ba766b8b8311a3fe2fcf3 /drivers/cpufreq | |
parent | 16993a30b96eda2075bcf1a14f5eb27ffc377bd6 (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 d87ffc0788c..2b6548d67dc 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) { @@ -247,25 +285,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"); |