[brcm63xx] prevent bcm6338 and bcm6345 from crashing very early
[openwrt.git] / target / linux / brcm63xx / files / arch / mips / bcm63xx / boards / board_bcm963xx.c
index 5623d79..92d46e7 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
+#include <linux/ssb/ssb.h>
 #include <asm/addrspace.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_dev_pci.h>
 #include <bcm63xx_dev_uart.h>
+#include <bcm63xx_dev_wdt.h>
 #include <bcm63xx_dev_enet.h>
 #include <bcm63xx_dev_pcmcia.h>
 #include <bcm63xx_dev_usb_ohci.h>
 #include <bcm63xx_dev_usb_ehci.h>
+#include <bcm63xx_dev_usb_udc.h>
+#include <bcm63xx_dev_spi.h>
 #include <board_bcm963xx.h>
 
 #define PFX    "board_bcm963xx: "
@@ -33,6 +37,32 @@ static struct bcm963xx_nvram nvram;
 static unsigned int mac_addr_used = 0;
 static struct board_info board;
 
+/*
+ * known 6338 boards
+ */
+
+#ifdef CONFIG_BCM63XX_CPU_6338
+static struct board_info __initdata board_96338gw = {
+       .name                           = "96338GW",
+       .expected_cpu_id                = 0x6338,
+
+       .has_enet0                      = 1,
+       .enet0 = {
+               .has_phy                = 1,
+               .use_internal_phy       = 1,
+       },
+
+       .has_ohci0                      = 1,
+};
+
+static struct board_info __initdata board_96338w = {
+       .name                           = "9338W",
+       .expected_cpu_id                = 0x6338,
+
+       .has_enet0                      = 1,
+};
+#endif
+
 /*
  * known 6348 boards
  */
@@ -50,6 +80,28 @@ static struct board_info __initdata board_96348r = {
        },
 };
 
+static struct board_info __initdata board_96348gw_10 = { 
+       .name                           = "96348GW-10",
+       .expected_cpu_id                = 0x6348,
+       
+       .has_enet0                      = 1,
+       .has_enet1                      = 1,
+       .has_pci                        = 1, 
+       
+       .enet0 = {
+               .has_phy                = 1,
+               .use_internal_phy       = 1,
+       },
+       .enet1 = {
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
+       },
+       
+       .has_ohci0                      = 1,
+       .has_pccard                     = 1,
+       .has_ehci0                      = 1,
+}; 
+
 static struct board_info __initdata board_96348gw_11 = {
        .name                           = "96348GW-11",
        .expected_cpu_id                = 0x6348,
@@ -90,7 +142,75 @@ static struct board_info __initdata board_96348gw = {
                .force_speed_100        = 1,
                .force_duplex_full      = 1,
        },
+
+       .has_ohci0 = 1,
 };
+
+static struct board_info __initdata board_FAST2404 = {
+        .name                           = "F@ST2404",
+        .expected_cpu_id                = 0x6348,
+
+        .has_enet0                      = 1,
+        .has_enet1                      = 1,
+        .has_pci                        = 1,
+
+        .enet0 = {
+                .has_phy                = 1,
+                .use_internal_phy       = 1,
+        },
+
+        .enet1 = {
+                .force_speed_100        = 1,
+                .force_duplex_full      = 1,
+        },
+
+
+        .has_ohci0 = 1,
+        .has_pccard = 1,
+        .has_ehci0 = 1,
+};
+
+static struct board_info __initdata board_DV201AMR = {
+       .name                           = "DV201AMR",
+       .expected_cpu_id                = 0x6348,
+
+       .has_pci                        = 1,
+       .has_ohci0                      = 1,
+       .has_udc0                       = 1,
+
+       .has_enet0                      = 1,
+       .has_enet1                      = 1,
+       .enet0 = {
+               .has_phy                = 1,
+               .use_internal_phy       = 1,
+       },
+       .enet1 = {
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
+       },
+};
+
+static struct board_info __initdata board_96348gw_a = {
+       .name                           = "96348GW-A",
+       .expected_cpu_id                = 0x6348,
+
+       .has_enet0                      = 1,
+       .has_enet1                      = 1,
+       .has_pci                        = 1,
+
+       .enet0 = {
+               .has_phy                = 1,
+               .use_internal_phy       = 1,
+       },
+       .enet1 = {
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
+       },
+
+       .has_ohci0 = 1,
+};
+
+
 #endif
 
 /*
@@ -144,21 +264,52 @@ static struct board_info __initdata board_96358vw2 = {
        .has_pccard = 1,
        .has_ehci0 = 1,
 };
+
+static struct board_info __initdata board_AGPFS0 = {
+       .name                           = "AGPF-S0",
+       .expected_cpu_id                = 0x6358,
+
+       .has_enet0                      = 1,
+       .has_enet1                      = 1,
+       .has_pci                        = 1,
+
+       .enet0 = {
+               .has_phy                = 1,
+               .use_internal_phy       = 1,
+       },
+
+       .enet1 = {
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
+       },
+
+       .has_ohci0 = 1,
+       .has_ehci0 = 1,
+};
 #endif
 
 /*
  * all boards
  */
 static const struct board_info __initdata *bcm963xx_boards[] = {
+#ifdef CONFIG_BCM63XX_CPU_6338
+       &board_96338gw,
+       &board_96338w,
+#endif
 #ifdef CONFIG_BCM63XX_CPU_6348
        &board_96348r,
        &board_96348gw,
+       &board_96348gw_10,
        &board_96348gw_11,
+       &board_FAST2404,
+       &board_DV201AMR,
+       &board_96348gw_a,
 #endif
 
 #ifdef CONFIG_BCM63XX_CPU_6358
        &board_96358vw,
        &board_96358vw2,
+       &board_AGPFS0,
 #endif
 };
 
@@ -172,9 +323,15 @@ void __init board_prom_init(void)
        char cfe_version[32];
        u32 val;
 
-       /* read base address of boot chip select (0) */
-       val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-       val &= MPI_CSBASE_BASE_MASK;
+       /* read base address of boot chip select (0) 
+        * 6338 does not have MPI but boots from standard
+        * MIPS Flash address */
+       if (BCMCPU_IS_6338() || BCMCPU_IS_6345())
+               val = 0x1fc00000;
+       else {
+               val = bcm_mpi_readl(MPI_CSBASE_REG(0));
+               val &= MPI_CSBASE_BASE_MASK;
+       }
        boot_addr = (u8 *)KSEG1ADDR(val);
 
        /* dump cfe version */
@@ -227,13 +384,13 @@ void __init board_prom_init(void)
         * this has to be done this early since PCI init is done
         * inside arch_initcall */
        val = 0;
-
+#ifdef CONFIG_PCI
        if (board.has_pci) {
                bcm63xx_pci_enabled = 1;
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G2_PCI;
        }
-
+#endif
        if (board.has_pccard) {
                if (BCMCPU_IS_6348())
                        val |= GPIO_MODE_6348_G1_MII_PCCARD;
@@ -326,6 +483,35 @@ static struct platform_device mtd_dev = {
        .num_resources          = ARRAY_SIZE(mtd_resources),
 };
 
+/*
+ * Register a sane SPROMv2 to make the on-board
+ * bcm4318 WLAN work
+ */
+static struct ssb_sprom bcm63xx_sprom = {
+       .revision               = 0x02,
+       .board_rev              = 0x17,
+       .country_code           = 0x0,
+       .ant_available_bg       = 0x3,
+       .pa0b0                  = 0x15ae,
+       .pa0b1                  = 0xfa85,
+       .pa0b2                  = 0xfe8d,
+       .pa1b0                  = 0xffff,
+       .pa1b1                  = 0xffff,
+       .pa1b2                  = 0xffff,
+       .gpio0                  = 0xff,
+       .gpio1                  = 0xff,
+       .gpio2                  = 0xff,
+       .gpio3                  = 0xff,
+       .maxpwr_bg              = 0x004c,
+       .itssi_bg               = 0x00,
+       .boardflags_lo          = 0x2848,
+       .boardflags_hi          = 0x0000,
+};
+
+static struct resource gpiodev_resource = {
+       .start                  = 0xFFFFFFFF,
+};
+
 /*
  * third stage init callback, register all board devices.
  */
@@ -334,6 +520,8 @@ int __init board_register_devices(void)
        u32 val;
 
        bcm63xx_uart_register();
+       bcm63xx_wdt_register();
+       bcm63xx_spi_register();
 
        if (board.has_pccard)
                bcm63xx_pcmcia_register();
@@ -352,6 +540,18 @@ int __init board_register_devices(void)
        if (board.has_ehci0)
                bcm63xx_ehci_register();
 
+       if (board.has_udc0)
+               bcm63xx_udc_register();
+       /* Generate MAC address for WLAN and
+        * register our SPROM */
+#ifdef CONFIG_PCI
+       if (!board_get_mac_address(bcm63xx_sprom.il0mac)) {
+               memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
+               memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
+               if (ssb_arch_set_fallback_sprom(&bcm63xx_sprom) < 0)
+                       printk(KERN_ERR "failed to register fallback SPROM\n");
+       }
+#endif
 
        /* read base address of boot chip select (0) */
        val = bcm_mpi_readl(MPI_CSBASE_REG(0));
@@ -361,6 +561,9 @@ int __init board_register_devices(void)
 
        platform_device_register(&mtd_dev);
 
+       /* Register GPIODEV */
+       platform_device_register_simple("GPIODEV", 0, &gpiodev_resource, 1);
+
        return 0;
 }
 
This page took 0.034193 seconds and 4 git commands to generate.