Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[pandora-kernel.git] / arch / powerpc / boot / cuboot-warp.c
index 3db93e8..2178021 100644 (file)
@@ -10,6 +10,7 @@
 #include "ops.h"
 #include "4xx.h"
 #include "cuboot.h"
+#include "stdio.h"
 
 #define TARGET_4xx
 #define TARGET_44x
 
 static bd_t bd;
 
-static void warp_fixups(void)
+static void warp_fixup_one_nor(u32 from, u32 to)
 {
-       unsigned long sysclk = 66000000;
+       void *devp;
+       char name[50];
+       u32 v[2];
+
+       sprintf(name, "/plb/opb/ebc/nor_flash@0,0/partition@%x", from);
+
+       devp = finddevice(name);
+       if (!devp)
+               return;
+
+       if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) {
+               v[0] = to;
+               setprop(devp, "reg", v, sizeof(v));
+
+               printf("NOR 64M fixup %x -> %x\r\n", from, to);
+       }
+}
+
 
-       ibm440ep_fixup_clocks(sysclk, 11059200, 50000000);
+static void warp_fixups(void)
+{
+       ibm440ep_fixup_clocks(66000000, 11059200, 50000000);
        ibm4xx_sdram_fixup_memsize();
        ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
-       dt_fixup_mac_addresses(&bd.bi_enetaddr);
+       dt_fixup_mac_address_by_alias("ethernet0", bd.bi_enetaddr);
+
+       /* Fixup for 64M flash on Rev A boards. */
+       if (bd.bi_flashsize == 0x4000000) {
+               void *devp;
+               u32 v[3];
+
+               devp = finddevice("/plb/opb/ebc/nor_flash@0,0");
+               if (!devp)
+                       return;
+
+               /* Fixup the size */
+               if (getprop(devp, "reg", v, sizeof(v)) == sizeof(v)) {
+                       v[2] = bd.bi_flashsize;
+                       setprop(devp, "reg", v, sizeof(v));
+               }
+
+               /* Fixup parition offsets */
+               warp_fixup_one_nor(0x300000, 0x3f00000);
+               warp_fixup_one_nor(0x340000, 0x3f40000);
+               warp_fixup_one_nor(0x380000, 0x3f80000);
+       }
 }