]> git.sur5r.net Git - u-boot/blobdiff - arch/powerpc/cpu/mpc85xx/speed.c
Merge branch 'master' of git://git.denx.de/u-boot-arm
[u-boot] / arch / powerpc / cpu / mpc85xx / speed.c
index 268edbc5b7368fc6a4dda852ade6e2491f79efcb..f2aa8d039d69053bb0d2517f2a6860575f927ce2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2004, 2007-2009 Freescale Semiconductor, Inc.
+ * Copyright 2004, 2007-2011 Freescale Semiconductor, Inc.
  *
  * (C) Copyright 2003 Motorola Inc.
  * Xianghua Xiao, (X.Xiao@motorola.com)
@@ -71,22 +71,30 @@ void get_sys_info (sys_info_t * sysInfo)
                [14] = 4,       /* CC4 PPL / 4 */
        };
        uint lcrr_div, i, freqCC_PLL[4], rcw_tmp;
+       uint ratio[4];
        unsigned long sysclk = CONFIG_SYS_CLK_FREQ;
+       uint mem_pll_rat;
 
        sysInfo->freqSystemBus = sysclk;
        sysInfo->freqDDRBus = sysclk;
-       freqCC_PLL[0] = sysclk;
-       freqCC_PLL[1] = sysclk;
-       freqCC_PLL[2] = sysclk;
-       freqCC_PLL[3] = sysclk;
 
        sysInfo->freqSystemBus *= (in_be32(&gur->rcwsr[0]) >> 25) & 0x1f;
-       sysInfo->freqDDRBus *= ((in_be32(&gur->rcwsr[0]) >> 17) & 0x1f);
-       freqCC_PLL[0] *= (in_be32(&clk->pllc1gsr) >> 1) & 0x3f;
-       freqCC_PLL[1] *= (in_be32(&clk->pllc2gsr) >> 1) & 0x3f;
-       freqCC_PLL[2] *= (in_be32(&clk->pllc3gsr) >> 1) & 0x3f;
-       freqCC_PLL[3] *= (in_be32(&clk->pllc4gsr) >> 1) & 0x3f;
+       mem_pll_rat = (in_be32(&gur->rcwsr[0]) >> 17) & 0x1f;
+       if (mem_pll_rat > 2)
+               sysInfo->freqDDRBus *= mem_pll_rat;
+       else
+               sysInfo->freqDDRBus = sysInfo->freqSystemBus * mem_pll_rat;
 
+       ratio[0] = (in_be32(&clk->pllc1gsr) >> 1) & 0x3f;
+       ratio[1] = (in_be32(&clk->pllc2gsr) >> 1) & 0x3f;
+       ratio[2] = (in_be32(&clk->pllc3gsr) >> 1) & 0x3f;
+       ratio[3] = (in_be32(&clk->pllc4gsr) >> 1) & 0x3f;
+       for (i = 0; i < 4; i++) {
+               if (ratio[i] > 4)
+                       freqCC_PLL[i] = sysclk * ratio[i];
+               else
+                       freqCC_PLL[i] = sysInfo->freqSystemBus * ratio[i];
+       }
        rcw_tmp = in_be32(&gur->rcwsr[3]);
        for (i = 0; i < cpu_numcores(); i++) {
                u32 c_pll_sel = (in_be32(&clk->clkc0csr + i*8) >> 27) & 0xf;
@@ -123,7 +131,9 @@ void get_sys_info (sys_info_t * sysInfo)
 
 #else
        uint plat_ratio,e500_ratio,half_freqSystemBus;
+#if defined(CONFIG_FSL_LBC)
        uint lcrr_div;
+#endif
        int i;
 #ifdef CONFIG_QE
        u32 qe_ratio;
@@ -160,14 +170,12 @@ void get_sys_info (sys_info_t * sysInfo)
        sysInfo->freqQE = qe_ratio * CONFIG_SYS_CLK_FREQ;
 #endif
 
+#if defined(CONFIG_FSL_LBC)
 #if defined(CONFIG_SYS_LBC_LCRR)
        /* We will program LCRR to this value later */
        lcrr_div = CONFIG_SYS_LBC_LCRR & LCRR_CLKDIV;
 #else
-       {
-           volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
-           lcrr_div = in_be32(&lbc->lcrr) & LCRR_CLKDIV;
-       }
+       lcrr_div = in_be32(&(LBC_BASE_ADDR)->lcrr) & LCRR_CLKDIV;
 #endif
        if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) {
 #if defined(CONFIG_FSL_CORENET)
@@ -188,6 +196,7 @@ void get_sys_info (sys_info_t * sysInfo)
                /* In case anyone cares what the unknown value is */
                sysInfo->freqLocalBus = lcrr_div;
        }
+#endif
 }