aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/ath79
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2012-09-01 12:46:00 -0400
committerRalf Baechle <ralf@linux-mips.org>2012-10-01 05:36:34 -0400
commit65fc7f9957c52ad4fdf4ee5dfe3a75aa0a633d39 (patch)
treea5c67f2eaf738fe04262206b4fda402a6166dc22 /arch/mips/ath79
parentd21a7713464c7d35b2cce1fe7f7d87928d6a047e (diff)
MIPS: ath79: use correct fractional dividers for {CPU,DDR}_PLL on AR934x
The current dividers in the code are wrong and this leads to broken CPU frequency calculation on boards where the fractional part is used. For example, if the SoC is running from a 40MHz reference clock, refdiv=1, nint=14, outdiv=0 and nfrac=31 the real frequency is 579.375MHz but the current code calculates 569.687MHz instead. Because the system time is indirectly related to the CPU frequency the broken computation causes drift in the system time. The correct divider is 2^6 for the CPU PLL and 2^10 for the DDR PLL. Use the correct values to fix the issue. Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Cc: stable@vger.kernel.org Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/4305/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/ath79')
-rw-r--r--arch/mips/ath79/clock.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c
index b91ad3efe29e..d2728573e9fc 100644
--- a/arch/mips/ath79/clock.c
+++ b/arch/mips/ath79/clock.c
@@ -189,7 +189,7 @@ static void __init ar934x_clocks_init(void)
189 AR934X_PLL_CPU_CONFIG_NFRAC_MASK; 189 AR934X_PLL_CPU_CONFIG_NFRAC_MASK;
190 190
191 cpu_pll = nint * ath79_ref_clk.rate / ref_div; 191 cpu_pll = nint * ath79_ref_clk.rate / ref_div;
192 cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 6)); 192 cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 6));
193 cpu_pll /= (1 << out_div); 193 cpu_pll /= (1 << out_div);
194 194
195 pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG); 195 pll = ath79_pll_rr(AR934X_PLL_DDR_CONFIG_REG);
@@ -203,7 +203,7 @@ static void __init ar934x_clocks_init(void)
203 AR934X_PLL_DDR_CONFIG_NFRAC_MASK; 203 AR934X_PLL_DDR_CONFIG_NFRAC_MASK;
204 204
205 ddr_pll = nint * ath79_ref_clk.rate / ref_div; 205 ddr_pll = nint * ath79_ref_clk.rate / ref_div;
206 ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (2 << 10)); 206 ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 10));
207 ddr_pll /= (1 << out_div); 207 ddr_pll /= (1 << out_div);
208 208
209 clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG); 209 clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG);