]> git.sur5r.net Git - u-boot/blobdiff - cpu/mpc85xx/cpu.c
Merge branch 'mpc86xx'
[u-boot] / cpu / mpc85xx / cpu.c
index fe678dfa63a21866709508670f701bef490a1635..0507c47e6e74dc66d04adffe35631138be9dc302 100644 (file)
 #include <command.h>
 #include <asm/cache.h>
 
-/* ------------------------------------------------------------------------- */
+#if defined(CONFIG_OF_FLAT_TREE)
+#include <ft_build.h>
+#endif
+
 
 int checkcpu (void)
 {
@@ -38,6 +41,7 @@ int checkcpu (void)
        uint lcrr;              /* local bus clock ratio register */
        uint clkdiv;            /* clock divider portion of lcrr */
        uint pvr, svr;
+       uint fam;
        uint ver;
        uint major, minor;
 
@@ -60,6 +64,12 @@ int checkcpu (void)
        case SVR_8560:
                puts("8560");
                break;
+       case SVR_8548:
+               puts("8548");
+               break;
+       case SVR_8548_E:
+               puts("8548_E");
+               break;
        default:
                puts("Unknown");
                break;
@@ -67,13 +77,14 @@ int checkcpu (void)
        printf(", Version: %d.%d, (0x%08x)\n", major, minor, svr);
 
        pvr = get_pvr();
+       fam = PVR_FAM(pvr);
        ver = PVR_VER(pvr);
        major = PVR_MAJ(pvr);
        minor = PVR_MIN(pvr);
 
        printf("Core:  ");
-       switch (ver) {
-       case PVR_VER(PVR_85xx):
+       switch (fam) {
+       case PVR_FAM(PVR_85xx):
            puts("E500");
            break;
        default:
@@ -84,7 +95,7 @@ int checkcpu (void)
 
        get_sys_info(&sysinfo);
 
-       puts("Clocks Configuration:\n");
+       puts("Clock Configuration:\n");
        printf("       CPU:%4lu MHz, ", sysinfo.freqProcessor / 1000000);
        printf("CCB:%4lu MHz,\n", sysinfo.freqSystemBus / 1000000);
        printf("       DDR:%4lu MHz, ", sysinfo.freqSystemBus / 2000000);
@@ -101,6 +112,13 @@ int checkcpu (void)
 #endif
        clkdiv = lcrr & 0x0f;
        if (clkdiv == 2 || clkdiv == 4 || clkdiv == 8) {
+#ifdef CONFIG_MPC8548
+               /*
+                * Yes, the entire PQ38 family use the same
+                * bit-representation for twice the clock divider values.
+                */
+                clkdiv *= 2;
+#endif
                printf("LBC:%4lu MHz\n",
                       sysinfo.freqSystemBus / 1000000 / clkdiv);
        } else {
@@ -145,7 +163,7 @@ unsigned long get_tbclk (void)
        sys_info_t  sys_info;
 
        get_sys_info(&sys_info);
-       return ((sys_info.freqSystemBus + 3L) / 4L);
+       return ((sys_info.freqSystemBus + 7L) / 8L);
 }
 
 
@@ -212,3 +230,48 @@ int dma_xfer(void *dest, uint count, void *src) {
        return dma_check();
 }
 #endif
+
+
+#ifdef CONFIG_OF_FLAT_TREE
+void
+ft_cpu_setup(void *blob, bd_t *bd)
+{
+       u32 *p;
+       ulong clock;
+       int len;
+
+       clock = bd->bi_busfreq;
+       p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/serial@4500/clock-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+       p = ft_get_prop(blob, "/" OF_SOC "/serial@4600/clock-frequency", &len);
+       if (p != NULL)
+               *p = cpu_to_be32(clock);
+
+#if defined(CONFIG_MPC85XX_TSEC1)
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@24000/mac-address", &len);
+               memcpy(p, bd->bi_enetaddr, 6);
+#endif
+
+#if defined(CONFIG_HAS_ETH1)
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@25000/mac-address", &len);
+               memcpy(p, bd->bi_enet1addr, 6);
+#endif
+
+#if defined(CONFIG_HAS_ETH2)
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@26000/mac-address", &len);
+               memcpy(p, bd->bi_enet2addr, 6);
+#endif
+
+#if defined(CONFIG_HAS_ETH3)
+       p = ft_get_prop(blob, "/" OF_SOC "/ethernet@27000/mac-address", &len);
+               memcpy(p, bd->bi_enet3addr, 6);
+#endif
+
+}
+#endif