aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/clock34xx.c
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2009-01-28 14:08:11 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2009-02-08 12:50:32 -0500
commitf0587b63c24e0c7539c6e77f1bfc68e6053608c7 (patch)
tree1e08b2e231b04dc3d878dc83e1d9a2faac14850e /arch/arm/mach-omap2/clock34xx.c
parentf266950d0234599cc6d4a5602e43d0fb782de1d2 (diff)
[ARM] OMAP3 clock: fix DPLL jitter correction and rate programming
Fix DPLL jitter correction programming. Previously, omap3_noncore_dpll_program() stored the FREQSEL jitter correction parameter to the wrong register. This caused jitter correction to be set incorrectly and also caused the DPLL divider to be programmed incorrectly. Also, fix DPLL divider programming. An off-by-one error existed in omap3_noncore_dpll_program(), causing DPLLs to be programmed with a higher divider than intended. linux-omap source commit is 5c0ec88a2145cdf2f2c9cc5fae49635c4c2476c7. Signed-off-by: Paul Walmsley <paul@pwsan.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/mach-omap2/clock34xx.c')
-rw-r--r--arch/arm/mach-omap2/clock34xx.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c
index cb5e068feb56..fdfc7d582913 100644
--- a/arch/arm/mach-omap2/clock34xx.c
+++ b/arch/arm/mach-omap2/clock34xx.c
@@ -563,14 +563,17 @@ static int omap3_noncore_dpll_program(struct clk *clk, u16 m, u8 n, u16 freqsel)
563 /* 3430 ES2 TRM: 4.7.6.9 DPLL Programming Sequence */ 563 /* 3430 ES2 TRM: 4.7.6.9 DPLL Programming Sequence */
564 _omap3_noncore_dpll_bypass(clk); 564 _omap3_noncore_dpll_bypass(clk);
565 565
566 /* Set jitter correction */
567 v = __raw_readl(dd->control_reg);
568 v &= ~dd->freqsel_mask;
569 v |= freqsel << __ffs(dd->freqsel_mask);
570 __raw_writel(v, dd->control_reg);
571
572 /* Set DPLL multiplier, divider */
566 v = __raw_readl(dd->mult_div1_reg); 573 v = __raw_readl(dd->mult_div1_reg);
567 v &= ~(dd->mult_mask | dd->div1_mask); 574 v &= ~(dd->mult_mask | dd->div1_mask);
568
569 /* Set mult (M), div1 (N), freqsel */
570 v |= m << __ffs(dd->mult_mask); 575 v |= m << __ffs(dd->mult_mask);
571 v |= n << __ffs(dd->div1_mask); 576 v |= (n - 1) << __ffs(dd->div1_mask);
572 v |= freqsel << __ffs(dd->freqsel_mask);
573
574 __raw_writel(v, dd->mult_div1_reg); 577 __raw_writel(v, dd->mult_div1_reg);
575 578
576 /* We let the clock framework set the other output dividers later */ 579 /* We let the clock framework set the other output dividers later */