--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include #include #include @@ -46,6 +48,12 @@ #define CFE_OFFSET_64K 0x10000 #define CFE_OFFSET_128K 0x20000 +#define NB4_PID_OFFSET 0xff80 +#define NB4_74X164_GPIO_BASE 64 +#define NB4_SPI_GPIO_MOSI 7 +#define NB4_SPI_GPIO_CLK 6 +#define NB4_74HC64_GPIO(X) (NB4_74X164_GPIO_BASE + (X)) + static struct board_info board; /* @@ -719,6 +727,596 @@ static struct board_info __initdata boar .has_ohci0 = 1, }; + +struct spi_gpio_platform_data nb4_spi_gpio_data = { + .sck = NB4_SPI_GPIO_CLK, + .mosi = NB4_SPI_GPIO_MOSI, + .miso = SPI_GPIO_NO_MISO, + .num_chipselect = 1, +}; + + +static struct platform_device nb4_spi_gpio = { + .name = "spi_gpio", + .id = 1, + .dev = { + .platform_data = &nb4_spi_gpio_data, + }, +}; + +static struct platform_device * __initdata nb4_devices[] = { + &nb4_spi_gpio, +}; + +const struct gen_74x164_chip_platform_data nb4_74x164_platform_data = { + .base = NB4_74X164_GPIO_BASE +}; + +static struct spi_board_info nb4_spi_devices[] = { + { + .modalias = "74x164", + .max_speed_hz = 781000, + .bus_num = 1, + .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT, + .mode = SPI_MODE_0, + .platform_data = &nb4_74x164_platform_data + } +}; + +static struct board_info __initdata board_nb4_ser_r0 = { + .name = "NB4-SER-r0", + .expected_cpu_id = 0x6358, + + .has_uart0 = 1, + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .has_phy = 1, + .phy_id = 0, + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "NB4-SER-r0:white:adsl", + .gpio = NB4_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "NB4-SER-r0:white:traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "NB4-SER-r0:white:tel", + .gpio = NB4_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "NB4-SER-r0:white:tv", + .gpio = NB4_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "NB4-SER-r0:white:wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "NB4-SER-r0:white:alarm", + .gpio = NB4_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "NB4-SER-r0:red:service", + .gpio = 29, + .active_low = 1, + }, + { + .name = "NB4-SER-r0:green:service", + .gpio = 30, + .active_low = 1, + }, + { + .name = "NB4-SER-r0:blue:service", + .gpio = 4, + .active_low = 1, + }, + }, + .buttons = { + { + .desc = "reset", + .gpio = 34, + .type = EV_KEY, + .code = KEY_RESTART, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "wps", + .gpio = 37, + .type = EV_KEY, + .code = KEY_WPS_BUTTON, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "service", + .gpio = 27, + .type = EV_KEY, + .code = BTN_0, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "clip", + .gpio = 31, + .type = EV_KEY, + .code = BTN_1, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + }, + .devs = nb4_devices, + .num_devs = ARRAY_SIZE(nb4_devices), + .spis = nb4_spi_devices, + .num_spis = ARRAY_SIZE(nb4_spi_devices), +}; + +static struct board_info __initdata board_nb4_ser_r1 = { + .name = "NB4-SER-r1", + .expected_cpu_id = 0x6358, + + .has_uart0 = 1, + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .has_phy = 1, + .phy_id = 0, + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "NB4-SER-r1:white:adsl", + .gpio = NB4_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "NB4-SER-r1:white:traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "NB4-SER-r1:white:tel", + .gpio = NB4_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "NB4-SER-r1:white:tv", + .gpio = NB4_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "NB4-SER-r1:white:wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "NB4-SER-r1:white:alarm", + .gpio = NB4_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "NB4-SER-r1:red:service", + .gpio = 29, + .active_low = 1, + }, + { + .name = "NB4-SER-r1:green:service", + .gpio = 30, + .active_low = 1, + }, + { + .name = "NB4-SER-r1:blue:service", + .gpio = 4, + .active_low = 1, + }, + }, + .buttons = { + { + .desc = "reset", + .gpio = 34, + .type = EV_KEY, + .code = KEY_RESTART, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "wps", + .gpio = 37, + .type = EV_KEY, + .code = KEY_WPS_BUTTON, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "service", + .gpio = 27, + .type = EV_KEY, + .code = BTN_0, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "clip", + .gpio = 31, + .type = EV_KEY, + .code = BTN_1, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + }, + .devs = nb4_devices, + .num_devs = ARRAY_SIZE(nb4_devices), + .spis = nb4_spi_devices, + .num_spis = ARRAY_SIZE(nb4_spi_devices), +}; + +static struct board_info __initdata board_nb4_ser_r2 = { + .name = "NB4-SER-r2", + .expected_cpu_id = 0x6358, + + .has_uart0 = 1, + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .has_phy = 1, + .phy_id = 0, + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "NB4-SER-r2:white:adsl", + .gpio = NB4_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "NB4-SER-r2:white:traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "NB4-SER-r2:white:tel", + .gpio = NB4_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "NB4-SER-r2:white:tv", + .gpio = NB4_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "NB4-SER-r2:white:wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "NB4-SER-r2:white:alarm", + .gpio = NB4_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "NB4-SER-r2:red:service", + .gpio = 29, + .active_low = 1, + }, + { + .name = "NB4-SER-r2:green:service", + .gpio = 30, + .active_low = 1, + }, + { + .name = "NB4-SER-r2:blue:service", + .gpio = 4, + .active_low = 1, + }, + }, + .buttons = { + { + .desc = "reset", + .gpio = 34, + .type = EV_KEY, + .code = KEY_RESTART, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "wps", + .gpio = 37, + .type = EV_KEY, + .code = KEY_WPS_BUTTON, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "service", + .gpio = 27, + .type = EV_KEY, + .code = BTN_0, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "clip", + .gpio = 31, + .type = EV_KEY, + .code = BTN_1, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + }, + .devs = nb4_devices, + .num_devs = ARRAY_SIZE(nb4_devices), + .spis = nb4_spi_devices, + .num_spis = ARRAY_SIZE(nb4_spi_devices), +}; + +static struct board_info __initdata board_nb4_fxc_r1 = { + .name = "NB4-FXC-r1", + .expected_cpu_id = 0x6358, + + .has_uart0 = 1, + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .has_phy = 1, + .phy_id = 0, + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "NB4-FXC-r1:white:adsl", + .gpio = NB4_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "NB4-FXC-r1:white:traffic", + .gpio = 2, + }, + { + .name = "NB4-FXC-r1:white:tel", + .gpio = NB4_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "NB4-FXC-r1:white:tv", + .gpio = NB4_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "NB4-FXC-r1:white:wifi", + .gpio = 15, + }, + { + .name = "NB4-FXC-r1:white:alarm", + .gpio = NB4_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "NB4-FXC-r1:red:service", + .gpio = 29, + }, + { + .name = "NB4-FXC-r1:green:service", + .gpio = 30, + }, + { + .name = "NB4-FXC-r1:blue:service", + .gpio = 4, + }, + }, + .buttons = { + { + .desc = "reset", + .gpio = 34, + .type = EV_KEY, + .code = KEY_RESTART, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "wps", + .gpio = 37, + .type = EV_KEY, + .code = KEY_WPS_BUTTON, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "service", + .gpio = 27, + .type = EV_KEY, + .code = BTN_0, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "clip", + .gpio = 31, + .type = EV_KEY, + .code = BTN_1, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + }, + .devs = nb4_devices, + .num_devs = ARRAY_SIZE(nb4_devices), + .spis = nb4_spi_devices, + .num_spis = ARRAY_SIZE(nb4_spi_devices), +}; + +static struct board_info __initdata board_nb4_fxc_r2 = { + .name = "NB4-FXC-r2", + .expected_cpu_id = 0x6358, + + .has_uart0 = 1, + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .has_phy = 1, + .phy_id = 0, + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "NB4-FXC-r2:white:adsl", + .gpio = NB4_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "NB4-FXC-r2:white:traffic", + .gpio = 2, + }, + { + .name = "NB4-FXC-r2:white:tel", + .gpio = NB4_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "NB4-FXC-r2:white:tv", + .gpio = NB4_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "NB4-FXC-r2:white:wifi", + .gpio = 15, + }, + { + .name = "NB4-FXC-r2:white:alarm", + .gpio = NB4_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "NB4-FXC-r2:red:service", + .gpio = 29, + }, + { + .name = "NB4-FXC-r2:green:service", + .gpio = 30, + }, + { + .name = "NB4-FXC-r2:blue:service", + .gpio = 4, + }, + }, + .buttons = { + { + .desc = "reset", + .gpio = 34, + .type = EV_KEY, + .code = KEY_RESTART, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "wps", + .gpio = 37, + .type = EV_KEY, + .code = KEY_WPS_BUTTON, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "service", + .gpio = 27, + .type = EV_KEY, + .code = BTN_0, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + { + .desc = "clip", + .gpio = 31, + .type = EV_KEY, + .code = BTN_1, + .active_low = 1, + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL, + }, + }, + .devs = nb4_devices, + .num_devs = ARRAY_SIZE(nb4_devices), + .spis = nb4_spi_devices, + .num_spis = ARRAY_SIZE(nb4_spi_devices), +}; #endif /* @@ -752,6 +1350,11 @@ static const struct board_info __initcon &board_96358vw2, &board_AGPFS0, &board_DWVS0, + &board_nb4_ser_r0, + &board_nb4_ser_r1, + &board_nb4_ser_r2, + &board_nb4_fxc_r1, + &board_nb4_fxc_r2, #endif }; @@ -806,6 +1409,16 @@ static void __init boardid_fixup(u8 *boo struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K); char *board_name = (char *)bcm63xx_nvram_get_name(); + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) { + u8 *p = boot_addr + NB4_PID_OFFSET; + + /* Extract nb4 PID */ + if (!memcmp(p, "NB4-", 4)) { + memcpy(board_name, p, sizeof("NB4-XXX-rX")); + return; + } + } + /* check if bcm_tag is at 64k offset */ if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) { /* else try 128k */