]> git.sur5r.net Git - u-boot/blobdiff - board/cds/common/ft_board.c
Move the MPC8540 ADS board under board/freescale.
[u-boot] / board / cds / common / ft_board.c
index 77d1d851d90860b4d36a67209a1bf44ee3356b01..6f221aff26fcfa79969fb563c128850cbbd01e3c 100644 (file)
  */
 
 #include <common.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#include "cadmus.h"
 
-#if defined(CONFIG_OF_FLAT_TREE)
-#include <ft_build.h>
-extern void ft_cpu_setup(void *blob, bd_t *bd);
-#endif
+#if defined(CONFIG_OF_BOARD_SETUP)
+static void cds_pci_fixup(void *blob)
+{
+       int node, tmp[2];
+       const char *path;
+       int len, slot, i;
+       u32 *map = NULL;
+
+       node = fdt_path_offset(blob, "/aliases");
+       tmp[0] = 0;
+       if (node >= 0) {
+               path = fdt_getprop(blob, node, "pci0", NULL);
+               if (path) {
+                       node = fdt_path_offset(blob, path);
+                       if (node >= 0) {
+                               map = fdt_getprop_w(blob, node, "interrupt-map", &len);
+                       }
+               }
+       }
 
+       if (map) {
+               len /= sizeof(u32);
+
+               slot = get_pci_slot();
+
+               for (i=0;i<len;i+=7) {
+                       /* We rotate the interrupt pins so that the mapping
+                        * changes depending on the slot the carrier card is in.
+                        */
+                       map[3] = ((map[3] + slot - 2) % 4) + 1;
+                       map+=7;
+               }
+       }
+}
 
-#if defined(CONFIG_OF_FLAT_TREE) && defined(CONFIG_OF_BOARD_SETUP)
 void
 ft_board_setup(void *blob, bd_t *bd)
 {
-       u32 *p;
-       int len;
-
+       ft_cpu_setup(blob, bd);
 #ifdef CONFIG_PCI
        ft_pci_setup(blob, bd);
+       cds_pci_fixup(blob);
 #endif
-       ft_cpu_setup(blob, bd);
-
-       p = ft_get_prop(blob, "/memory/reg", &len);
-       if (p != NULL) {
-               *p++ = cpu_to_be32(bd->bi_memstart);
-               *p = cpu_to_be32(bd->bi_memsize);
-       }
 }
 #endif