mac80211: fix rekeying in ap mode with connected powersave stations
[openwrt/openwrt.git] / target / linux / brcm63xx / files / arch / mips / bcm63xx / boards / board_bcm963xx.c
index 92d46e7628a43ac38c2276b0d3d721cc0c02e07d..97374f897fa9634086f4c2249dce6b9b973cf850 100644 (file)
@@ -4,6 +4,7 @@
  * for more details.
  *
  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
+ * Copyright (C) 2009 Florian Fainelli <florian@openwrt.org>
  */
 
 #include <linux/init.h>
@@ -14,6 +15,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/ssb/ssb.h>
+#include <linux/gpio_buttons.h>
 #include <asm/addrspace.h>
 #include <bcm63xx_board.h>
 #include <bcm63xx_cpu.h>
 #include <bcm63xx_dev_uart.h>
 #include <bcm63xx_dev_wdt.h>
 #include <bcm63xx_dev_enet.h>
+#include <bcm63xx_dev_dsp.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>
+#include <linux/input.h>
 
 #define PFX    "board_bcm963xx: "
 
@@ -45,21 +49,93 @@ static struct board_info board;
 static struct board_info __initdata board_96338gw = {
        .name                           = "96338GW",
        .expected_cpu_id                = 0x6338,
-
+       
        .has_enet0                      = 1,
        .enet0 = {
-               .has_phy                = 1,
-               .use_internal_phy       = 1,
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
        },
 
        .has_ohci0                      = 1,
+
+       .leds = {
+               {
+                       .name           = "adsl",
+                       .gpio           = 3,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ses",
+                       .gpio           = 5,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               }
+       },
 };
 
 static struct board_info __initdata board_96338w = {
-       .name                           = "9338W",
+       .name                           = "96338W",
        .expected_cpu_id                = 0x6338,
-
+       
        .has_enet0                      = 1,
+       .enet0 = {
+               .force_speed_100        = 1,
+               .force_duplex_full      = 1,
+       },
+
+       .leds = {
+               {
+                       .name           = "adsl",
+                       .gpio           = 3,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ses",
+                       .gpio           = 5,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               },
+       },
+};
+#endif
+
+/*
+ * known 6345 boards
+ */
+#ifdef CONFIG_BCM63XX_CPU_6345
+static struct board_info __initdata board_96345gw2 = {
+       .name                           = "96345GW2",
+       .expected_cpu_id                = 0x6345,
 };
 #endif
 
@@ -78,6 +154,36 @@ static struct board_info __initdata board_96348r = {
                .has_phy                = 1,
                .use_internal_phy       = 1,
        },
+
+       .leds = {
+               {
+                       .name           = "adsl-fail",
+                       .gpio           = 2,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp",
+                       .gpio           = 3,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+                       
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               },
+       },
 };
 
 static struct board_info __initdata board_96348gw_10 = { 
@@ -100,6 +206,43 @@ static struct board_info __initdata board_96348gw_10 = {
        .has_ohci0                      = 1,
        .has_pccard                     = 1,
        .has_ehci0                      = 1,
+
+       .has_dsp                        = 1,
+       .dsp = {
+               .gpio_rst               = 6,
+               .gpio_int               = 34,
+               .cs                     = 2,
+               .ext_irq                = 2,
+       },
+       
+       .leds = {
+               {
+                       .name           = "adsl-fail",
+                       .gpio           = 2,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp",
+                       .gpio           = 3,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               },
+       },
 }; 
 
 static struct board_info __initdata board_96348gw_11 = {
@@ -124,6 +267,45 @@ static struct board_info __initdata board_96348gw_11 = {
        .has_ohci0 = 1,
        .has_pccard = 1,
        .has_ehci0 = 1,
+       
+       .leds = {
+               {
+                       .name           = "adsl-fail",
+                       .gpio           = 2,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp",
+                       .gpio           = 3,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               },
+       },
+       .reset_buttons = {
+               {
+                       .desc           = "reset",
+                       .gpio           = 32,
+                       .active_low     = 1,
+                       .type           = EV_KEY,
+                       .code           = BTN_0,
+                       .threshold      = 3,
+               },
+       },
 };
 
 static struct board_info __initdata board_96348gw = {
@@ -143,7 +325,68 @@ static struct board_info __initdata board_96348gw = {
                .force_duplex_full      = 1,
        },
 
-       .has_ohci0 = 1,
+       .has_ohci0                      = 1,
+       .has_dsp                        = 1,
+       
+       .dsp = {
+               .gpio_rst               = 6,
+               .gpio_int               = 34,
+               .ext_irq                = 2,
+               .cs                     = 2,
+       },
+       
+       .leds = {
+               {
+                       .name           = "adsl-fail",
+                       .gpio           = 2,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 0,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 1,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "line1",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "line2",
+                       .gpio           = 5,
+                       .active_low     = 1,
+               },
+               {       .name           = "line3",
+                       .gpio           = 6,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "tel",
+                       .gpio           = 7,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "eth",
+                       .gpio           = 35,
+                       .active_low     = 1,
+               },
+       },
+       .reset_buttons = {
+               {
+                       .desc           = "reset",
+                       .gpio           = 36,
+                       .active_low     = 1,
+                       .type           = EV_KEY,
+                       .code           = BTN_0,
+                       .threshold      = 3,
+               },
+       },      
 };
 
 static struct board_info __initdata board_FAST2404 = {
@@ -210,7 +453,23 @@ static struct board_info __initdata board_96348gw_a = {
        .has_ohci0 = 1,
 };
 
+static struct board_info __initdata board_rta1025w_16 = {
+       .name                           = "RTA1025W_16",
+       .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,
+       },
+};
 #endif
 
 /*
@@ -239,6 +498,33 @@ static struct board_info __initdata board_96358vw = {
        .has_ohci0 = 1,
        .has_pccard = 1,
        .has_ehci0 = 1,
+       
+       .leds = {
+               {
+                       .name           = "adsl-fail",
+                       .gpio           = 15,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp",
+                       .gpio           = 22,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 23,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 4,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 5,
+               },
+       },
 };
 
 static struct board_info __initdata board_96358vw2 = {
@@ -263,6 +549,29 @@ static struct board_info __initdata board_96358vw2 = {
        .has_ohci0 = 1,
        .has_pccard = 1,
        .has_ehci0 = 1,
+
+       .leds = {
+               {
+                       .name           = "adsl",
+                       .gpio           = 22,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "ppp-fail",
+                       .gpio           = 23,
+               },
+               {
+                       .name           = "power",
+                       .gpio           = 5,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "stop",
+                       .gpio           = 4,
+                       .active_low     = 1,
+               },
+       },
 };
 
 static struct board_info __initdata board_AGPFS0 = {
@@ -285,6 +594,85 @@ static struct board_info __initdata board_AGPFS0 = {
 
        .has_ohci0 = 1,
        .has_ehci0 = 1,
+
+       .leds = {
+               /*Each led on alice gate is bi-color so final char */
+               /* is r for red and g for green leds */
+               {
+                       .name           = "pwrr",
+                       .gpio           = 5,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "pwrg",
+                       .gpio           = 4,
+                       .active_low     = 1,
+                       .default_trigger = "default-on",
+               },
+               {
+                       .name           = "wifir",
+                       .gpio           = 23,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "wifig",
+                       .gpio           = 22,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "usr1r",
+                       .gpio           = 27,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "usr1g",
+                       .gpio           = 26,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "usr2r",
+                       .gpio           = 30,
+                       .active_low     = 1,
+               },
+               {
+                       .name           = "usr2g",
+                       .gpio           = 29,
+                       .active_low     = 1,
+               },
+       },
+
+       .reset_buttons = {
+               {
+                       .desc           = "sw2",
+                       .gpio           = 37,
+                       .active_low     = 1,
+                       .type           = EV_KEY,
+                       .code           = BTN_0,
+                       .threshold      = 3,
+               },
+       },
+       /* sw1 is connected to gpio34*/
+};
+
+static struct board_info __initdata board_DWVS0 = {
+       .name                           = "DWV-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,
 };
 #endif
 
@@ -296,6 +684,9 @@ static const struct board_info __initdata *bcm963xx_boards[] = {
        &board_96338gw,
        &board_96338w,
 #endif
+#ifdef CONFIG_BCM63XX_CPU_6345
+       &board_96345gw2,
+#endif
 #ifdef CONFIG_BCM63XX_CPU_6348
        &board_96348r,
        &board_96348gw,
@@ -304,12 +695,14 @@ static const struct board_info __initdata *bcm963xx_boards[] = {
        &board_FAST2404,
        &board_DV201AMR,
        &board_96348gw_a,
+       &board_rta1025w_16,
 #endif
 
 #ifdef CONFIG_BCM63XX_CPU_6358
        &board_96358vw,
        &board_96358vw2,
        &board_AGPFS0,
+       &board_DWVS0,
 #endif
 };
 
@@ -324,9 +717,9 @@ void __init board_prom_init(void)
        u32 val;
 
        /* read base address of boot chip select (0) 
-        * 6338 does not have MPI but boots from standard
+        * 6345 does not have MPI but boots from standard
         * MIPS Flash address */
-       if (BCMCPU_IS_6338() || BCMCPU_IS_6345())
+       if (BCMCPU_IS_6345())
                val = 0x1fc00000;
        else {
                val = bcm_mpi_readl(MPI_CSBASE_REG(0));
@@ -512,6 +905,25 @@ static struct resource gpiodev_resource = {
        .start                  = 0xFFFFFFFF,
 };
 
+static struct gpio_led_platform_data bcm63xx_led_data;
+
+static struct platform_device bcm63xx_gpio_leds = {
+       .name                   = "leds-gpio",
+       .id                     = 0,
+       .dev.platform_data      = &bcm63xx_led_data,
+};
+
+static struct gpio_buttons_platform_data bcm63xx_gpio_buttons_data = {
+       .poll_interval  = 20,
+};
+
+static struct platform_device bcm63xx_gpio_buttons_device = {
+        .name           = "gpio-buttons",
+        .id             = 0,
+        .dev.platform_data = &bcm63xx_gpio_buttons_data,
+};
+
+
 /*
  * third stage init callback, register all board devices.
  */
@@ -521,7 +933,9 @@ int __init board_register_devices(void)
 
        bcm63xx_uart_register();
        bcm63xx_wdt_register();
-       bcm63xx_spi_register();
+
+       if (!BCMCPU_IS_6345())
+               bcm63xx_spi_register();
 
        if (board.has_pccard)
                bcm63xx_pcmcia_register();
@@ -542,6 +956,10 @@ int __init board_register_devices(void)
 
        if (board.has_udc0)
                bcm63xx_udc_register();
+
+       if (board.has_dsp)
+               bcm63xx_dsp_register(&board.dsp);
+       
        /* Generate MAC address for WLAN and
         * register our SPROM */
 #ifdef CONFIG_PCI
@@ -554,8 +972,12 @@ int __init board_register_devices(void)
 #endif
 
        /* read base address of boot chip select (0) */
-       val = bcm_mpi_readl(MPI_CSBASE_REG(0));
-       val &= MPI_CSBASE_BASE_MASK;
+       if (BCMCPU_IS_6345())
+               val = 0x1fc00000;
+       else {
+               val = bcm_mpi_readl(MPI_CSBASE_REG(0));
+               val &= MPI_CSBASE_BASE_MASK;
+       }
        mtd_resources[0].start = val;
        mtd_resources[0].end = 0x1FFFFFFF;
 
@@ -564,6 +986,18 @@ int __init board_register_devices(void)
        /* Register GPIODEV */
        platform_device_register_simple("GPIODEV", 0, &gpiodev_resource, 1);
 
+       bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
+       bcm63xx_led_data.leds = board.leds;
+
+       platform_device_register(&bcm63xx_gpio_leds);
+
+       if (board.reset_buttons) {
+               bcm63xx_gpio_buttons_data.nbuttons = ARRAY_SIZE(board.reset_buttons);
+               bcm63xx_gpio_buttons_data.buttons = board.reset_buttons;
+
+               platform_device_register(&bcm63xx_gpio_buttons_device);
+       }
+
        return 0;
 }