mpc8[56]xx: Put localbus clock in sysinfo and gd
authorTrent Piepho <tpiepho@freescale.com>
Wed, 3 Dec 2008 23:16:37 +0000 (15:16 -0800)
committerAndrew Fleming-AFLEMING <afleming@freescale.com>
Sat, 20 Dec 2008 00:32:49 +0000 (18:32 -0600)
Currently MPC85xx and MPC86xx boards just calculate the localbus frequency
and print it out, but don't save it.

This changes where its calculated and stored to be more consistent with the
CPU, CCB, TB, and DDR frequencies and the MPC83xx localbus clock.

The localbus frequency is added to sysinfo and calculated when sysinfo is
set up, in cpu/mpc8[56]xx/speed.c, the same as the other frequencies are.

get_clocks() copies the frequency into the global data, as the other
frequencies are, into a new field that is only enabled for MPC85xx and
MPC86xx.

checkcpu() in cpu/mpc8[56]xx/cpu.c will print out the local bus frequency
from sysinfo, like the other frequencies, instead of calculating it on the
spot.

Signed-off-by: Trent Piepho <tpiepho@freescale.com>
Acked-by: Kumar Gala <galak@kernel.crashing.org>
Acked-by: Jon Loeliger <jdl@freescale.com>
cpu/mpc85xx/cpu.c
cpu/mpc85xx/speed.c
cpu/mpc86xx/cpu.c
cpu/mpc86xx/speed.c
include/asm-ppc/global_data.h
include/e500.h
include/mpc86xx.h

index 89800b88448b40e6c1ccf2c02c351176904137db..15ba7f1c5ed25992ae82588bed3ffa282f8449bb 100644 (file)
@@ -77,8 +77,6 @@ struct cpu_type *identify_cpu(u32 ver)
 int checkcpu (void)
 {
        sys_info_t sysinfo;
-       uint lcrr;              /* local bus clock ratio register */
-       uint clkdiv;            /* clock divider portion of lcrr */
        uint pvr, svr;
        uint fam;
        uint ver;
@@ -165,30 +163,11 @@ int checkcpu (void)
                break;
        }
 
-#if defined(CONFIG_SYS_LBC_LCRR)
-       lcrr = CONFIG_SYS_LBC_LCRR;
-#else
-       {
-           volatile ccsr_lbc_t *lbc = (void *)(CONFIG_SYS_MPC85xx_LBC_ADDR);
-
-           lcrr = lbc->lcrr;
-       }
-#endif
-       clkdiv = lcrr & LCRR_CLKDIV;
-       if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) {
-#if !defined(CONFIG_MPC8540) && !defined(CONFIG_MPC8541) && \
-    !defined(CONFIG_MPC8555) && !defined(CONFIG_MPC8560)
-               /*
-                * Yes, the entire PQ38 family use the same
-                * bit-representation for twice the clock divider values.
-                */
-                clkdiv *= 2;
-#endif
-               printf("LBC:%-4s MHz\n",
-                      strmhz(buf1, sysinfo.freqSystemBus / clkdiv));
-       } else {
-               printf("LBC: unknown (lcrr: 0x%08x)\n", lcrr);
-       }
+       if (sysinfo.freqLocalBus > LCRR_CLKDIV)
+               printf("LBC:%-4s MHz\n", strmhz(buf1, sysinfo.freqLocalBus));
+       else
+               printf("LBC: unknown (LCRR[CLKDIV] = 0x%02lx)\n",
+                      sysinfo.freqLocalBus);
 
 #ifdef CONFIG_CPM2
        printf("CPM:   %s MHz\n", strmhz(buf1, sysinfo.freqSystemBus));
index 1e0f4838bf8991273e42270376196ae8f4369bf5..0d55228b641f7ba9cc8b298cc6f8fcd3cac1ec15 100644 (file)
@@ -28,6 +28,7 @@
 #include <common.h>
 #include <ppc_asm.tmpl>
 #include <asm/processor.h>
+#include <asm/io.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -37,6 +38,7 @@ void get_sys_info (sys_info_t * sysInfo)
 {
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
        uint plat_ratio,e500_ratio,half_freqSystemBus;
+       uint lcrr_div;
 
        plat_ratio = (gur->porpllsr) & 0x0000003e;
        plat_ratio >>= 1;
@@ -60,6 +62,30 @@ void get_sys_info (sys_info_t * sysInfo)
                        sysInfo->freqDDRBus = ddr_ratio * CONFIG_DDR_CLK_FREQ;
        }
 #endif
+
+#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;
+       }
+#endif
+       if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) {
+#if !defined(CONFIG_MPC8540) && !defined(CONFIG_MPC8541) && \
+    !defined(CONFIG_MPC8555) && !defined(CONFIG_MPC8560)
+               /*
+                * Yes, the entire PQ38 family use the same
+                * bit-representation for twice the clock divider values.
+                */
+               lcrr_div *= 2;
+#endif
+               sysInfo->freqLocalBus = sysInfo->freqSystemBus / lcrr_div;
+       } else {
+               /* In case anyone cares what the unknown value is */
+               sysInfo->freqLocalBus = lcrr_div;
+       }
 }
 
 
@@ -82,6 +108,7 @@ int get_clocks (void)
        gd->cpu_clk = sys_info.freqProcessor;
        gd->bus_clk = sys_info.freqSystemBus;
        gd->mem_clk = sys_info.freqDDRBus;
+       gd->lbc_clk = sys_info.freqLocalBus;
 
        /*
         * The base clock for I2C depends on the actual SOC.  Unfortunately,
index a179fb3d01f083c173c754f42396ebe4b54a62e2..35680238d2ec6a7ed13ef895b4218a2975311dd8 100644 (file)
@@ -39,8 +39,6 @@ checkcpu(void)
        uint pvr, svr;
        uint ver;
        uint major, minor;
-       uint lcrr;              /* local bus clock ratio register */
-       uint clkdiv;            /* clock divider portion of lcrr */
        volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
        volatile ccsr_gur_t *gur = &immap->im_gur;
 
@@ -100,23 +98,11 @@ checkcpu(void)
        printf("MPX:%4lu MHz, ", sysinfo.freqSystemBus / 1000000);
        printf("DDR:%4lu MHz, ", sysinfo.freqSystemBus / 2000000);
 
-#if defined(CONFIG_SYS_LBC_LCRR)
-       lcrr = CONFIG_SYS_LBC_LCRR;
-#else
-       {
-               volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
-               volatile ccsr_lbc_t *lbc = &immap->im_lbc;
-
-               lcrr = lbc->lcrr;
-       }
-#endif
-       clkdiv = lcrr & LCRR_CLKDIV;
-       if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) {
-               clkdiv *= 2;
-               printf("LBC:%4lu MHz\n",
-                      sysinfo.freqSystemBus / 1000000 / clkdiv);
+       if (sysinfo.freqLocalBus > LCRR_CLKDIV) {
+               printf("LBC:%4lu MHz\n", sysinfo.freqLocalBus / 1000000);
        } else {
-               printf("    LBC: unknown (lcrr: 0x%08x)\n", lcrr);
+               printf("LBC: unknown (LCRR[CLKDIV] = 0x%02x)\n",
+                      sysinfo.freqLocalBus);
        }
 
        puts("    L2: ");
index 415ac9db89055ed4f72d8c1c89bde489083b76ad..64a3479d7e51dc56fd52c194b98c91b7833ed1f9 100644 (file)
@@ -28,6 +28,7 @@
 #include <common.h>
 #include <mpc86xx.h>
 #include <asm/processor.h>
+#include <asm/io.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -39,6 +40,7 @@ void get_sys_info(sys_info_t *sysInfo)
        volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
        volatile ccsr_gur_t *gur = &immap->im_gur;
        uint plat_ratio, e600_ratio;
+       uint lcrr_div;
 
        plat_ratio = (gur->porpllsr) & 0x0000003e;
        plat_ratio >>= 1;
@@ -90,6 +92,22 @@ void get_sys_info(sys_info_t *sysInfo)
                sysInfo->freqProcessor = e600_ratio + sysInfo->freqSystemBus;
                break;
        }
+
+#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 = &immap->im_lbc;
+               lcrr_div = in_be32(&lbc->lcrr) & LCRR_CLKDIV;
+       }
+#endif
+       if (lcrr_div == 2 || lcrr_div == 4 || lcrr_div == 8) {
+               sysInfo->freqLocalBus = sysInfo->freqSystemBus / (lcrr_div * 2);
+       } else {
+               /* In case anyone cares what the unknown value is */
+               sysInfo->freqLocalBus = lcrr_div;
+       }
 }
 
 
@@ -105,6 +123,7 @@ int get_clocks(void)
        get_sys_info(&sys_info);
        gd->cpu_clk = sys_info.freqProcessor;
        gd->bus_clk = sys_info.freqSystemBus;
+       gd->lbc_clk = sys_info.freqLocalBus;
 
        /*
         * The base clock for I2C depends on the actual SOC.  Unfortunately,
index aade097fa4edcd88e9701e133ab49dccc12625fd..2bb50b47f518cb4eeb9222bc6ce308e45f6fee4b 100644 (file)
@@ -89,6 +89,9 @@ typedef       struct  global_data {
 #if defined(CONFIG_MPC837X) || defined(CONFIG_MPC8536)
        u32 sdhc_clk;
 #endif
+#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
+       u32 lbc_clk;
+#endif /* CONFIG_MPC85xx || CONFIG_MPC86xx */
 #if defined(CONFIG_MPC83XX) || defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
        u32 i2c1_clk;
        u32 i2c2_clk;
index 1971eee291af8fa3dbcb53a749581f942020e6d6..9d3c8417c01ae31df7b7479226b44741f9f9e535 100644 (file)
@@ -13,6 +13,7 @@ typedef struct
   unsigned long freqProcessor;
   unsigned long freqSystemBus;
   unsigned long freqDDRBus;
+  unsigned long freqLocalBus;
 } MPC85xx_SYS_INFO;
 
 #endif  /* _ASMLANGUAGE */
index f119d5bb15fdeb564aaaf177eaf8fefdd80cabfb..a6fdea352fd0c4a052c081ef9cf9b625907a8cb5 100644 (file)
@@ -84,6 +84,7 @@
 typedef struct {
        unsigned long freqProcessor;
        unsigned long freqSystemBus;
+       unsigned long freqLocalBus;
 } MPC86xx_SYS_INFO;
 
 #define l1icache_enable        icache_enable