summaryrefslogtreecommitdiff
path: root/drivers/cpufreq
diff options
context:
space:
mode:
authorRabin Vincent <rabin.vincent@stericsson.com>2011-10-07 10:38:08 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2011-12-06 10:46:41 +0100
commit0250d7be1ccfc943603c01d1ecba1ba4cfab4494 (patch)
treede04de6e20b03746d4a291e543d4ec42f90c4d84 /drivers/cpufreq
parent53b3274e7627d5976f65b72b928575c0c7895183 (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.c59
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");