]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ARM: atmel: arm926ejs: fix clock configuration
authorBo Shen <voice.shen@atmel.com>
Fri, 27 Mar 2015 06:23:33 +0000 (14:23 +0800)
committerAndreas Bießmann <andreas.devel@googlemail.com>
Tue, 31 Mar 2015 23:04:29 +0000 (01:04 +0200)
Config MCKR according to the datasheet sequence, or else it
will cause the MCKR configuration failed.

Remove timeout checking for clock configuration, if configure
the clock failed, let the system hang while not run in wrong
clock configuration.

Signed-off-by: Bo Shen <voice.shen@atmel.com>
Tested-by: Heiko Schocher <hs@denx.de>
arch/arm/mach-at91/arm926ejs/clock.c

index f363982d0350d85dea3eef38be960de5b65a2b6b..8d6934e32490dd44b31acddf09b54a1b2a05cdcc 100644 (file)
@@ -195,50 +195,52 @@ int at91_clock_init(unsigned long main_clock)
 void at91_plla_init(u32 pllar)
 {
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
-       int timeout = AT91_PLL_LOCK_TIMEOUT;
 
        writel(pllar, &pmc->pllar);
-       while (!(readl(&pmc->sr) & (AT91_PMC_LOCKA | AT91_PMC_MCKRDY))) {
-               timeout--;
-               if (timeout == 0)
-                       break;
-       }
+       while (!(readl(&pmc->sr) & AT91_PMC_LOCKA))
+               ;
 }
 void at91_pllb_init(u32 pllbr)
 {
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
-       int timeout = AT91_PLL_LOCK_TIMEOUT;
 
        writel(pllbr, &pmc->pllbr);
-       while (!(readl(&pmc->sr) & (AT91_PMC_LOCKB | AT91_PMC_MCKRDY))) {
-               timeout--;
-               if (timeout == 0)
-                       break;
-       }
+       while (!(readl(&pmc->sr) & AT91_PMC_LOCKB))
+               ;
 }
 
 void at91_mck_init(u32 mckr)
 {
        struct at91_pmc *pmc = (struct at91_pmc *)ATMEL_BASE_PMC;
-       int timeout = AT91_PLL_LOCK_TIMEOUT;
        u32 tmp;
 
        tmp = readl(&pmc->mckr);
-       tmp &= ~(AT91_PMC_MCKR_PRES_MASK |
-                AT91_PMC_MCKR_MDIV_MASK |
-                AT91_PMC_MCKR_PLLADIV_MASK |
-                AT91_PMC_MCKR_CSS_MASK);
-       tmp |= mckr & (AT91_PMC_MCKR_PRES_MASK |
-                      AT91_PMC_MCKR_MDIV_MASK |
-                      AT91_PMC_MCKR_PLLADIV_MASK |
-                      AT91_PMC_MCKR_CSS_MASK);
+       tmp &= ~AT91_PMC_MCKR_PRES_MASK;
+       tmp |= mckr & AT91_PMC_MCKR_PRES_MASK;
        writel(tmp, &pmc->mckr);
+       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+               ;
 
-       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY)) {
-               timeout--;
-               if (timeout == 0)
-                       break;
-       }
+       tmp = readl(&pmc->mckr);
+       tmp &= ~AT91_PMC_MCKR_MDIV_MASK;
+       tmp |= mckr & AT91_PMC_MCKR_MDIV_MASK;
+       writel(tmp, &pmc->mckr);
+       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+               ;
+
+       tmp = readl(&pmc->mckr);
+       tmp &= ~AT91_PMC_MCKR_PLLADIV_MASK;
+       tmp |= mckr & AT91_PMC_MCKR_PLLADIV_MASK;
+       writel(tmp, &pmc->mckr);
+       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+               ;
+
+       tmp = readl(&pmc->mckr);
+       tmp &= ~AT91_PMC_MCKR_CSS_MASK;
+       tmp |= mckr & AT91_PMC_MCKR_CSS_MASK;
+       writel(tmp, &pmc->mckr);
+       while (!(readl(&pmc->sr) & AT91_PMC_MCKRDY))
+               ;
 }
 
 void at91_periph_clk_enable(int id)