diff options
Diffstat (limited to 'arch/arm/plat-omap/cpu-omap.c')
-rw-r--r-- | arch/arm/plat-omap/cpu-omap.c | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/arch/arm/plat-omap/cpu-omap.c b/arch/arm/plat-omap/cpu-omap.c index 6d3d33360056..06744058abc9 100644 --- a/arch/arm/plat-omap/cpu-omap.c +++ b/arch/arm/plat-omap/cpu-omap.c @@ -8,6 +8,10 @@ * * Based on cpu-sa1110.c, Copyright (C) 2001 Russell King * + * Copyright (C) 2007-2008 Texas Instruments, Inc. + * Updated to support OMAP3 + * Rajendra Nayak <rnayak@ti.com> + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. @@ -26,12 +30,19 @@ #include <plat/clock.h> #include <asm/system.h> +#if defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE) +#include <plat/omap-pm.h> +#include <plat/opp.h> +#endif + #define VERY_HI_RATE 900000000 static struct cpufreq_frequency_table *freq_table; #ifdef CONFIG_ARCH_OMAP1 #define MPU_CLK "mpu" +#elif CONFIG_ARCH_OMAP3 +#define MPU_CLK "arm_fck" #else #define MPU_CLK "virt_prcm_set" #endif @@ -73,7 +84,12 @@ static int omap_target(struct cpufreq_policy *policy, unsigned int target_freq, unsigned int relation) { +#ifdef CONFIG_ARCH_OMAP1 struct cpufreq_freqs freqs; +#endif +#if defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE) + unsigned long freq; +#endif int ret = 0; /* Ensure desired rate is within allowed range. Some govenors @@ -83,13 +99,13 @@ static int omap_target(struct cpufreq_policy *policy, if (target_freq > policy->max) target_freq = policy->max; +#ifdef CONFIG_ARCH_OMAP1 freqs.old = omap_getspeed(0); freqs.new = clk_round_rate(mpu_clk, target_freq * 1000) / 1000; freqs.cpu = 0; if (freqs.old == freqs.new) return ret; - cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); #ifdef CONFIG_CPU_FREQ_DEBUG printk(KERN_DEBUG "cpufreq-omap: transition: %u --> %u\n", @@ -97,7 +113,11 @@ static int omap_target(struct cpufreq_policy *policy, #endif ret = clk_set_rate(mpu_clk, freqs.new * 1000); cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); - +#elif defined(CONFIG_ARCH_OMAP3) && !defined(CONFIG_OMAP_PM_NONE) + freq = target_freq * 1000; + if (opp_find_freq_ceil(OPP_MPU, &freq)) + omap_pm_cpu_set_freq(freq); +#endif return ret; } @@ -114,7 +134,11 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) policy->cur = policy->min = policy->max = omap_getspeed(0); - clk_init_cpufreq_table(&freq_table); + if (!cpu_is_omap34xx()) + clk_init_cpufreq_table(&freq_table); + else + opp_init_cpufreq_table(OPP_MPU, &freq_table); + if (freq_table) { result = cpufreq_frequency_table_cpuinfo(policy, freq_table); if (!result) @@ -126,6 +150,10 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) VERY_HI_RATE) / 1000; } + policy->min = policy->cpuinfo.min_freq; + policy->max = policy->cpuinfo.max_freq; + policy->cur = omap_getspeed(0); + /* FIXME: what's the actual transition time? */ policy->cpuinfo.transition_latency = 300 * 1000; @@ -160,7 +188,7 @@ static int __init omap_cpufreq_init(void) return cpufreq_register_driver(&omap_driver); } -arch_initcall(omap_cpufreq_init); +late_initcall(omap_cpufreq_init); /* * if ever we want to remove this, upon cleanup call: |