Blackfin: scale calibration when cpu freq changes
authorGraf Yang <graf.yang@analog.com>
Mon, 8 Mar 2010 03:01:35 +0000 (03:01 +0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 9 Mar 2010 05:30:53 +0000 (00:30 -0500)
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>
arch/blackfin/mach-common/cpufreq.c

index 5d7f8ab..4391d03 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/init.h>
 #include <linux/cpufreq.h>
 #include <linux/fs.h>
+#include <linux/delay.h>
 #include <asm/blackfin.h>
 #include <asm/time.h>
 #include <asm/dpmc.h>
@@ -99,13 +100,15 @@ static unsigned int bfin_getfreq_khz(unsigned int cpu)
        return get_cclk() / 1000;
 }
 
-
 static int bfin_target(struct cpufreq_policy *poli,
                        unsigned int target_freq, unsigned int relation)
 {
        unsigned int index, plldiv, cpu;
        unsigned long flags, cclk_hz;
        struct cpufreq_freqs freqs;
+       static unsigned long lpj_ref;
+       static unsigned int  lpj_ref_freq;
+
 #if defined(CONFIG_CYCLES_CLOCKSOURCE)
        cycles_t cycles;
 #endif
@@ -144,6 +147,14 @@ static int bfin_target(struct cpufreq_policy *poli,
                            (cycles << __bfin_cycles_mod) - (cycles << index);
                        __bfin_cycles_mod = index;
 #endif
+                       if (!lpj_ref_freq) {
+                               lpj_ref = loops_per_jiffy;
+                               lpj_ref_freq = freqs.old;
+                       }
+                       if (freqs.new != freqs.old) {
+                               loops_per_jiffy = cpufreq_scale(lpj_ref,
+                                               lpj_ref_freq, freqs.new);
+                       }
                        local_irq_restore_hw(flags);
                }
                /* TODO: just test case for cycles clock source, remove later */