1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
4 #include <linux/string.h>
5 #include <linux/gpio_keys.h>
6 #include <linux/input.h>
7 +#include <linux/platform_device.h>
8 +#include <linux/spi/spi.h>
9 +#include <linux/spi/spi_gpio.h>
10 +#include <linux/spi/74x164.h>
11 #include <asm/addrspace.h>
12 #include <bcm63xx_board.h>
13 #include <bcm63xx_cpu.h>
15 #define CFE_OFFSET_64K 0x10000
16 #define CFE_OFFSET_128K 0x20000
18 +#define NB4_PID_OFFSET 0xff80
19 +#define NB4_74X164_GPIO_BASE 64
20 +#define NB4_SPI_GPIO_MOSI 7
21 +#define NB4_SPI_GPIO_CLK 6
22 +#define NB4_74HC64_GPIO(X) (NB4_74X164_GPIO_BASE + (X))
27 @@ -739,6 +749,601 @@ static struct board_info __initdata boar
32 +struct spi_gpio_platform_data nb4_spi_gpio_data = {
33 + .sck = NB4_SPI_GPIO_CLK,
34 + .mosi = NB4_SPI_GPIO_MOSI,
35 + .miso = SPI_GPIO_NO_MISO,
36 + .num_chipselect = 1,
40 +static struct platform_device nb4_spi_gpio = {
44 + .platform_data = &nb4_spi_gpio_data,
48 +static struct platform_device * __initdata nb4_devices[] = {
52 +const struct gen_74x164_chip_platform_data nb4_74x164_platform_data = {
53 + .base = NB4_74X164_GPIO_BASE
56 +static struct spi_board_info nb4_spi_devices[] = {
58 + .modalias = "74x164",
59 + .max_speed_hz = 781000,
61 + .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT,
63 + .platform_data = &nb4_74x164_platform_data
67 +static struct board_info __initdata board_nb4_ser_r0 = {
68 + .name = "NB4-SER-r0",
69 + .expected_cpu_id = 0x6358,
78 + .use_internal_phy = 1,
84 + .force_speed_100 = 1,
85 + .force_duplex_full = 1,
92 + .num_usbh_ports = 2,
96 + .name = "NB4-SER-r0:white:adsl",
97 + .gpio = NB4_74HC64_GPIO(4),
101 + .name = "NB4-SER-r0:white:traffic",
106 + .name = "NB4-SER-r0:white:tel",
107 + .gpio = NB4_74HC64_GPIO(3),
111 + .name = "NB4-SER-r0:white:tv",
112 + .gpio = NB4_74HC64_GPIO(2),
116 + .name = "NB4-SER-r0:white:wifi",
121 + .name = "NB4-SER-r0:white:alarm",
122 + .gpio = NB4_74HC64_GPIO(0),
126 + .name = "NB4-SER-r0:red:service",
131 + .name = "NB4-SER-r0:green:service",
136 + .name = "NB4-SER-r0:blue:service",
146 + .code = KEY_RESTART,
148 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
154 + .code = KEY_WPS_BUTTON,
156 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
164 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
172 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
175 + .devs = nb4_devices,
176 + .num_devs = ARRAY_SIZE(nb4_devices),
177 + .spis = nb4_spi_devices,
178 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
181 +static struct board_info __initdata board_nb4_ser_r1 = {
182 + .name = "NB4-SER-r1",
183 + .expected_cpu_id = 0x6358,
192 + .use_internal_phy = 1,
198 + .force_speed_100 = 1,
199 + .force_duplex_full = 1,
206 + .num_usbh_ports = 2,
210 + .name = "NB4-SER-r1:white:adsl",
211 + .gpio = NB4_74HC64_GPIO(4),
215 + .name = "NB4-SER-r1:white:traffic",
220 + .name = "NB4-SER-r1:white:tel",
221 + .gpio = NB4_74HC64_GPIO(3),
225 + .name = "NB4-SER-r1:white:tv",
226 + .gpio = NB4_74HC64_GPIO(2),
230 + .name = "NB4-SER-r1:white:wifi",
235 + .name = "NB4-SER-r1:white:alarm",
236 + .gpio = NB4_74HC64_GPIO(0),
240 + .name = "NB4-SER-r1:red:service",
245 + .name = "NB4-SER-r1:green:service",
250 + .name = "NB4-SER-r1:blue:service",
260 + .code = KEY_RESTART,
262 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
268 + .code = KEY_WPS_BUTTON,
270 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
278 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
286 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
289 + .devs = nb4_devices,
290 + .num_devs = ARRAY_SIZE(nb4_devices),
291 + .spis = nb4_spi_devices,
292 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
295 +static struct board_info __initdata board_nb4_ser_r2 = {
296 + .name = "NB4-SER-r2",
297 + .expected_cpu_id = 0x6358,
306 + .use_internal_phy = 1,
312 + .force_speed_100 = 1,
313 + .force_duplex_full = 1,
320 + .num_usbh_ports = 2,
324 + .name = "NB4-SER-r2:white:adsl",
325 + .gpio = NB4_74HC64_GPIO(4),
329 + .name = "NB4-SER-r2:white:traffic",
334 + .name = "NB4-SER-r2:white:tel",
335 + .gpio = NB4_74HC64_GPIO(3),
339 + .name = "NB4-SER-r2:white:tv",
340 + .gpio = NB4_74HC64_GPIO(2),
344 + .name = "NB4-SER-r2:white:wifi",
349 + .name = "NB4-SER-r2:white:alarm",
350 + .gpio = NB4_74HC64_GPIO(0),
354 + .name = "NB4-SER-r2:red:service",
359 + .name = "NB4-SER-r2:green:service",
364 + .name = "NB4-SER-r2:blue:service",
374 + .code = KEY_RESTART,
376 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
382 + .code = KEY_WPS_BUTTON,
384 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
392 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
400 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
403 + .devs = nb4_devices,
404 + .num_devs = ARRAY_SIZE(nb4_devices),
405 + .spis = nb4_spi_devices,
406 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
409 +static struct board_info __initdata board_nb4_fxc_r1 = {
410 + .name = "NB4-FXC-r1",
411 + .expected_cpu_id = 0x6358,
420 + .use_internal_phy = 1,
426 + .force_speed_100 = 1,
427 + .force_duplex_full = 1,
434 + .num_usbh_ports = 2,
438 + .name = "NB4-FXC-r1:white:adsl",
439 + .gpio = NB4_74HC64_GPIO(4),
443 + .name = "NB4-FXC-r1:white:traffic",
447 + .name = "NB4-FXC-r1:white:tel",
448 + .gpio = NB4_74HC64_GPIO(3),
452 + .name = "NB4-FXC-r1:white:tv",
453 + .gpio = NB4_74HC64_GPIO(2),
457 + .name = "NB4-FXC-r1:white:wifi",
461 + .name = "NB4-FXC-r1:white:alarm",
462 + .gpio = NB4_74HC64_GPIO(0),
466 + .name = "NB4-FXC-r1:red:service",
470 + .name = "NB4-FXC-r1:green:service",
474 + .name = "NB4-FXC-r1:blue:service",
483 + .code = KEY_RESTART,
485 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
491 + .code = KEY_WPS_BUTTON,
493 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
501 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
509 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
512 + .devs = nb4_devices,
513 + .num_devs = ARRAY_SIZE(nb4_devices),
514 + .spis = nb4_spi_devices,
515 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
518 +static struct board_info __initdata board_nb4_fxc_r2 = {
519 + .name = "NB4-FXC-r2",
520 + .expected_cpu_id = 0x6358,
529 + .use_internal_phy = 1,
535 + .force_speed_100 = 1,
536 + .force_duplex_full = 1,
543 + .num_usbh_ports = 2,
547 + .name = "NB4-FXC-r2:white:adsl",
548 + .gpio = NB4_74HC64_GPIO(4),
552 + .name = "NB4-FXC-r2:white:traffic",
556 + .name = "NB4-FXC-r2:white:tel",
557 + .gpio = NB4_74HC64_GPIO(3),
561 + .name = "NB4-FXC-r2:white:tv",
562 + .gpio = NB4_74HC64_GPIO(2),
566 + .name = "NB4-FXC-r2:white:wifi",
570 + .name = "NB4-FXC-r2:white:alarm",
571 + .gpio = NB4_74HC64_GPIO(0),
575 + .name = "NB4-FXC-r2:red:service",
579 + .name = "NB4-FXC-r2:green:service",
583 + .name = "NB4-FXC-r2:blue:service",
592 + .code = KEY_RESTART,
594 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
600 + .code = KEY_WPS_BUTTON,
602 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
610 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
618 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
621 + .devs = nb4_devices,
622 + .num_devs = ARRAY_SIZE(nb4_devices),
623 + .spis = nb4_spi_devices,
624 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
629 @@ -775,6 +1380,11 @@ static const struct board_info __initcon
641 @@ -783,6 +1393,16 @@ static void __init boardid_fixup(u8 *boo
642 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
643 char *board_name = (char *)bcm63xx_nvram_get_name();
645 + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
646 + u8 *p = boot_addr + NB4_PID_OFFSET;
648 + /* Extract nb4 PID */
649 + if (!memcmp(p, "NB4-", 4)) {
650 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
655 /* check if bcm_tag is at 64k offset */
656 if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) {