Patch by Jon Loeliger, 16 Jul 2004:
[oweals/u-boot.git] / cpu / ppc4xx / speed.c
index dfd2a04d51cf66bffef01093daa4b2029e120d57..be0de0c32a08433a50379a8bc6eee6b8c7183322 100644 (file)
@@ -247,7 +247,7 @@ void get_sys_info (sys_info_t * sysInfo)
        unsigned long temp1;
        unsigned long lfdiv;
        unsigned long m;
-
+       unsigned long prbdv0;
 
        /* Extract configured divisors */
        mfsdr( sdr_sdstp0,strp0 );
@@ -263,6 +263,7 @@ void get_sys_info (sys_info_t * sysInfo)
        sysInfo->pllOpbDiv = temp ? temp : 4;
        temp = (strp1 & PLLSYS1_PERCLK_DIV_MASK) >> 24;
        sysInfo->pllExtBusDiv = temp ? temp : 4;
+       prbdv0 = (strp0 >> 2) & 0x7;
 
        /* Calculate 'M' based on feedback source */
        temp = (strp0 & PLLSYS0_SEL_MASK) >> 27;
@@ -284,7 +285,7 @@ void get_sys_info (sys_info_t * sysInfo)
        /* Now calculate the individual clocks */
        sysInfo->freqVCOMhz = (m * CONFIG_SYS_CLK_FREQ) + (m>>1);
        sysInfo->freqProcessor = sysInfo->freqVCOMhz/sysInfo->pllFwdDivA;
-       sysInfo->freqPLB = sysInfo->freqVCOMhz/sysInfo->pllFwdDivB;
+       sysInfo->freqPLB = sysInfo->freqVCOMhz/sysInfo->pllFwdDivB/prbdv0;
        sysInfo->freqOPB = sysInfo->freqPLB/sysInfo->pllOpbDiv;
        sysInfo->freqEPB = sysInfo->freqOPB/sysInfo->pllExtBusDiv;
 
@@ -299,6 +300,10 @@ ulong get_OPB_freq (void)
        return sys_info.freqOPB;
 }
 
+#elif defined(CONFIG_XILINX_ML300)
+extern void get_sys_info (sys_info_t * sysInfo);
+extern ulong get_PCI_freq (void);
+
 #elif defined(CONFIG_405)
 
 void get_sys_info (sys_info_t * sysInfo) {
@@ -378,8 +383,13 @@ void get_sys_info (PPC405_SYS_INFO * sysInfo)
         */
        pllmr0_ccdv = ((pllmr0 & PLLMR0_CPU_DIV_MASK) >> 20) + 1;
        if (pllmr1 & PLLMR1_SSCS_MASK) {
-               sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv)
-                       / pllmr0_ccdv;
+               /*
+                * This is true if FWDVA == FWDVB:
+                * sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv)
+                *      / pllmr0_ccdv;
+                */
+               sysInfo->freqProcessor = (CONFIG_SYS_CLK_FREQ * sysInfo->pllFbkDiv * sysInfo->pllFwdDivB)
+                       / sysInfo->pllFwdDiv / pllmr0_ccdv;
        } else {
                sysInfo->freqProcessor = CONFIG_SYS_CLK_FREQ / pllmr0_ccdv;
        }