]> err.no Git - linux-2.6/commitdiff
[POWERPC] 8xx: Timebase frequency should not depend on bus-frequency
authorAnton Vorontsov <avorontsov@ru.mvista.com>
Thu, 21 Feb 2008 19:45:08 +0000 (06:45 +1100)
committerPaul Mackerras <paulus@samba.org>
Tue, 26 Feb 2008 11:17:03 +0000 (22:17 +1100)
m8xx_setup.c says:
   /* Force all 8xx processors to use divide by 16 processor clock. */

And at the same time it is using bus-frequency for calculating
timebase.  It is okay for most setups because bus-frequency is
equal to clock-frequency.

The problem emerges when cpu frequency is > 66MHz, quoting
u-boot/cpu/mpc8xx/speed.c:

        if (gd->cpu_clk <= 66000000) {
                sccr_reg |= SCCR_EBDF00;        /* bus division factor = 1 */
                gd->bus_clk = gd->cpu_clk;
        } else {
                sccr_reg |= SCCR_EBDF01;        /* bus division factor = 2 */
                gd->bus_clk = gd->cpu_clk / 2;
        }

So in case of cpu clock > 66MHz, bus_clk = cpu_clk / 2. An then, from
Linux, we calculate timebase frequency as tb_freq = bus_clk / 16,
that is cpu_clk / 2 / 16, which is wrong.

This fixes the system time drifting problem on the EP885C board
running at 133MHz.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/platforms/8xx/m8xx_setup.c

index 184f998d1be2e25da5f3d09c2d526683ded8741c..0d9f75c74f8cdf22e83f13ba342c45f5b12a0d66 100644 (file)
@@ -111,17 +111,12 @@ void __init mpc8xx_calibrate_decr(void)
 
        /* Processor frequency is MHz.
         */
-       ppc_tb_freq = 50000000;
-       if (!get_freq("bus-frequency", &ppc_tb_freq)) {
-               printk(KERN_ERR "WARNING: Estimating decrementer frequency "
-                               "(not found)\n");
-       }
-       ppc_tb_freq /= 16;
        ppc_proc_freq = 50000000;
        if (!get_freq("clock-frequency", &ppc_proc_freq))
                printk(KERN_ERR "WARNING: Estimating processor frequency "
                                "(not found)\n");
 
+       ppc_tb_freq = ppc_proc_freq / 16;
        printk("Decrementer Frequency = 0x%lx\n", ppc_tb_freq);
 
        /* Perform some more timer/timebase initialization.  This used