diff options
| author | Graf Yang <graf.yang@analog.com> | 2010-03-07 22:01:35 -0500 |
|---|---|---|
| committer | Mike Frysinger <vapier@gentoo.org> | 2010-03-09 00:30:53 -0500 |
| commit | 7998a8787a8b35fede689c2bb716f65b231e7492 (patch) | |
| tree | 07a9d6c0e27923cfdbe237aa0a0cfca6cb9f095c | |
| parent | f2b0cd61cf635cbdc110472f6edc97328322cb8b (diff) | |
Blackfin: scale calibration when cpu freq changes
Need to make sure we update the loops_per_jiffy values when we start
changing the core clock.
Signed-off-by: Graf Yang <graf.yang@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
| -rw-r--r-- | arch/blackfin/mach-common/cpufreq.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/blackfin/mach-common/cpufreq.c b/arch/blackfin/mach-common/cpufreq.c index 5d7f8ab5509a..4391d03dc845 100644 --- a/arch/blackfin/mach-common/cpufreq.c +++ b/arch/blackfin/mach-common/cpufreq.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/cpufreq.h> | 12 | #include <linux/cpufreq.h> |
| 13 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
| 14 | #include <linux/delay.h> | ||
| 14 | #include <asm/blackfin.h> | 15 | #include <asm/blackfin.h> |
| 15 | #include <asm/time.h> | 16 | #include <asm/time.h> |
| 16 | #include <asm/dpmc.h> | 17 | #include <asm/dpmc.h> |
| @@ -99,13 +100,15 @@ static unsigned int bfin_getfreq_khz(unsigned int cpu) | |||
| 99 | return get_cclk() / 1000; | 100 | return get_cclk() / 1000; |
| 100 | } | 101 | } |
| 101 | 102 | ||
| 102 | |||
| 103 | static int bfin_target(struct cpufreq_policy *poli, | 103 | static int bfin_target(struct cpufreq_policy *poli, |
| 104 | unsigned int target_freq, unsigned int relation) | 104 | unsigned int target_freq, unsigned int relation) |
| 105 | { | 105 | { |
| 106 | unsigned int index, plldiv, cpu; | 106 | unsigned int index, plldiv, cpu; |
| 107 | unsigned long flags, cclk_hz; | 107 | unsigned long flags, cclk_hz; |
| 108 | struct cpufreq_freqs freqs; | 108 | struct cpufreq_freqs freqs; |
| 109 | static unsigned long lpj_ref; | ||
| 110 | static unsigned int lpj_ref_freq; | ||
| 111 | |||
| 109 | #if defined(CONFIG_CYCLES_CLOCKSOURCE) | 112 | #if defined(CONFIG_CYCLES_CLOCKSOURCE) |
| 110 | cycles_t cycles; | 113 | cycles_t cycles; |
| 111 | #endif | 114 | #endif |
| @@ -144,6 +147,14 @@ static int bfin_target(struct cpufreq_policy *poli, | |||
| 144 | (cycles << __bfin_cycles_mod) - (cycles << index); | 147 | (cycles << __bfin_cycles_mod) - (cycles << index); |
| 145 | __bfin_cycles_mod = index; | 148 | __bfin_cycles_mod = index; |
| 146 | #endif | 149 | #endif |
| 150 | if (!lpj_ref_freq) { | ||
| 151 | lpj_ref = loops_per_jiffy; | ||
| 152 | lpj_ref_freq = freqs.old; | ||
| 153 | } | ||
| 154 | if (freqs.new != freqs.old) { | ||
| 155 | loops_per_jiffy = cpufreq_scale(lpj_ref, | ||
| 156 | lpj_ref_freq, freqs.new); | ||
| 157 | } | ||
| 147 | local_irq_restore_hw(flags); | 158 | local_irq_restore_hw(flags); |
| 148 | } | 159 | } |
| 149 | /* TODO: just test case for cycles clock source, remove later */ | 160 | /* TODO: just test case for cycles clock source, remove later */ |
