arm: tcc8k: Fix bus clock calculation
authorOskar Schirmer <oskar@linutronix.de>
Thu, 17 Feb 2011 15:43:02 +0000 (16:43 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Fri, 11 Mar 2011 09:06:06 +0000 (10:06 +0100)
There are two dividers used to derive bus clock from system clock:
system clock is divided by SCKDIV+1, then by BCKDIV+1. SCKDIV divider
has been ignored up to now, which is no problem as long as it is 0.

Take SCKDIV into account for bus clock calculation.

Signed-off-by: Oskar Schirmer <oskar@linutronix.de>
Cc: bigeasy@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/arm/mach-tcc8k/clock.c

index 8d8c99f895583e1382381d7cd79ee184176f3af5..e7cdae5c77a4c9137050d5cfd8977c62c073de35 100644 (file)
@@ -308,10 +308,17 @@ static unsigned long get_rate_sys(struct clk *clk)
 
 static unsigned long get_rate_bus(struct clk *clk)
 {
-       unsigned int div;
+       unsigned int reg, sdiv, bdiv, rate;
 
-       div = (__raw_readl(CKC_BASE + CLKCTRL_OFFS) >> 4) & 0xff;
-       return get_rate_sys(clk) / (div + 1);
+       reg = __raw_readl(CKC_BASE + CLKCTRL_OFFS);
+       rate = get_rate_sys(clk);
+       sdiv = (reg >> 20) & 3;
+       if (sdiv)
+               rate /= sdiv + 1;
+       bdiv = (reg >> 4) & 0xff;
+       if (bdiv)
+               rate /= bdiv + 1;
+       return rate;
 }
 
 static unsigned long get_rate_cpu(struct clk *clk)