1 --- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
2 +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
4 #include <linux/gpio_keys.h>
5 #include <linux/input.h>
6 #include <linux/spi/spi.h>
7 +#include <linux/spi/spi_gpio.h>
8 +#include <linux/spi/74x164.h>
9 #include <asm/addrspace.h>
10 #include <bcm63xx_board.h>
11 #include <bcm63xx_cpu.h>
13 #define CFE_OFFSET_64K 0x10000
14 #define CFE_OFFSET_128K 0x20000
16 +#define NB4_PID_OFFSET 0xff80
17 +#define NB4_74X164_GPIO_BASE 64
18 +#define NB4_SPI_GPIO_MOSI 7
19 +#define NB4_SPI_GPIO_CLK 6
20 +#define NB4_74HC64_GPIO(X) (NB4_74X164_GPIO_BASE + (X))
22 static struct board_info board;
25 @@ -666,6 +674,586 @@ static struct board_info __initdata boar
30 +struct spi_gpio_platform_data nb4_spi_gpio_data = {
31 + .sck = NB4_SPI_GPIO_CLK,
32 + .mosi = NB4_SPI_GPIO_MOSI,
33 + .miso = SPI_GPIO_NO_MISO,
34 + .num_chipselect = 1,
38 +static struct platform_device nb4_spi_gpio = {
42 + .platform_data = &nb4_spi_gpio_data,
46 +static struct platform_device * __initdata nb4_devices[] = {
50 +const struct gen_74x164_chip_platform_data nb4_74x164_platform_data = {
51 + .base = NB4_74X164_GPIO_BASE
54 +static struct spi_board_info nb4_spi_devices[] = {
56 + .modalias = "74x164",
57 + .max_speed_hz = 781000,
59 + .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT,
61 + .platform_data = &nb4_74x164_platform_data
65 +static struct board_info __initdata board_nb4_ser_r0 = {
66 + .name = "NB4-SER-r0",
67 + .expected_cpu_id = 0x6358,
76 + .use_internal_phy = 1,
80 + .force_speed_100 = 1,
81 + .force_duplex_full = 1,
91 + .name = "NB4-SER-r0:white:adsl",
92 + .gpio = NB4_74HC64_GPIO(4),
96 + .name = "NB4-SER-r0:white:traffic",
101 + .name = "NB4-SER-r0:white:tel",
102 + .gpio = NB4_74HC64_GPIO(3),
106 + .name = "NB4-SER-r0:white:tv",
107 + .gpio = NB4_74HC64_GPIO(2),
111 + .name = "NB4-SER-r0:white:wifi",
116 + .name = "NB4-SER-r0:white:alarm",
117 + .gpio = NB4_74HC64_GPIO(0),
121 + .name = "NB4-SER-r0:red:service",
126 + .name = "NB4-SER-r0:green:service",
131 + .name = "NB4-SER-r0:blue:service",
141 + .code = KEY_RESTART,
143 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
149 + .code = KEY_WPS_BUTTON,
151 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
159 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
167 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
170 + .devs = nb4_devices,
171 + .num_devs = ARRAY_SIZE(nb4_devices),
172 + .spis = nb4_spi_devices,
173 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
176 +static struct board_info __initdata board_nb4_ser_r1 = {
177 + .name = "NB4-SER-r1",
178 + .expected_cpu_id = 0x6358,
187 + .use_internal_phy = 1,
191 + .force_speed_100 = 1,
192 + .force_duplex_full = 1,
202 + .name = "NB4-SER-r1:white:adsl",
203 + .gpio = NB4_74HC64_GPIO(4),
207 + .name = "NB4-SER-r1:white:traffic",
212 + .name = "NB4-SER-r1:white:tel",
213 + .gpio = NB4_74HC64_GPIO(3),
217 + .name = "NB4-SER-r1:white:tv",
218 + .gpio = NB4_74HC64_GPIO(2),
222 + .name = "NB4-SER-r1:white:wifi",
227 + .name = "NB4-SER-r1:white:alarm",
228 + .gpio = NB4_74HC64_GPIO(0),
232 + .name = "NB4-SER-r1:red:service",
237 + .name = "NB4-SER-r1:green:service",
242 + .name = "NB4-SER-r1:blue:service",
252 + .code = KEY_RESTART,
254 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
260 + .code = KEY_WPS_BUTTON,
262 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
270 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
278 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
281 + .devs = nb4_devices,
282 + .num_devs = ARRAY_SIZE(nb4_devices),
283 + .spis = nb4_spi_devices,
284 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
287 +static struct board_info __initdata board_nb4_ser_r2 = {
288 + .name = "NB4-SER-r2",
289 + .expected_cpu_id = 0x6358,
298 + .use_internal_phy = 1,
302 + .force_speed_100 = 1,
303 + .force_duplex_full = 1,
313 + .name = "NB4-SER-r2:white:adsl",
314 + .gpio = NB4_74HC64_GPIO(4),
318 + .name = "NB4-SER-r2:white:traffic",
323 + .name = "NB4-SER-r2:white:tel",
324 + .gpio = NB4_74HC64_GPIO(3),
328 + .name = "NB4-SER-r2:white:tv",
329 + .gpio = NB4_74HC64_GPIO(2),
333 + .name = "NB4-SER-r2:white:wifi",
338 + .name = "NB4-SER-r2:white:alarm",
339 + .gpio = NB4_74HC64_GPIO(0),
343 + .name = "NB4-SER-r2:red:service",
348 + .name = "NB4-SER-r2:green:service",
353 + .name = "NB4-SER-r2:blue:service",
363 + .code = KEY_RESTART,
365 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
371 + .code = KEY_WPS_BUTTON,
373 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
381 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
389 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
392 + .devs = nb4_devices,
393 + .num_devs = ARRAY_SIZE(nb4_devices),
394 + .spis = nb4_spi_devices,
395 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
398 +static struct board_info __initdata board_nb4_fxc_r1 = {
399 + .name = "NB4-FXC-r1",
400 + .expected_cpu_id = 0x6358,
409 + .use_internal_phy = 1,
413 + .force_speed_100 = 1,
414 + .force_duplex_full = 1,
424 + .name = "NB4-FXC-r1:white:adsl",
425 + .gpio = NB4_74HC64_GPIO(4),
429 + .name = "NB4-FXC-r1:white:traffic",
433 + .name = "NB4-FXC-r1:white:tel",
434 + .gpio = NB4_74HC64_GPIO(3),
438 + .name = "NB4-FXC-r1:white:tv",
439 + .gpio = NB4_74HC64_GPIO(2),
443 + .name = "NB4-FXC-r1:white:wifi",
447 + .name = "NB4-FXC-r1:white:alarm",
448 + .gpio = NB4_74HC64_GPIO(0),
452 + .name = "NB4-FXC-r1:red:service",
456 + .name = "NB4-FXC-r1:green:service",
460 + .name = "NB4-FXC-r1:blue:service",
469 + .code = KEY_RESTART,
471 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
477 + .code = KEY_WPS_BUTTON,
479 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
487 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
495 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
498 + .devs = nb4_devices,
499 + .num_devs = ARRAY_SIZE(nb4_devices),
500 + .spis = nb4_spi_devices,
501 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
504 +static struct board_info __initdata board_nb4_fxc_r2 = {
505 + .name = "NB4-FXC-r2",
506 + .expected_cpu_id = 0x6358,
515 + .use_internal_phy = 1,
519 + .force_speed_100 = 1,
520 + .force_duplex_full = 1,
530 + .name = "NB4-FXC-r2:white:adsl",
531 + .gpio = NB4_74HC64_GPIO(4),
535 + .name = "NB4-FXC-r2:white:traffic",
539 + .name = "NB4-FXC-r2:white:tel",
540 + .gpio = NB4_74HC64_GPIO(3),
544 + .name = "NB4-FXC-r2:white:tv",
545 + .gpio = NB4_74HC64_GPIO(2),
549 + .name = "NB4-FXC-r2:white:wifi",
553 + .name = "NB4-FXC-r2:white:alarm",
554 + .gpio = NB4_74HC64_GPIO(0),
558 + .name = "NB4-FXC-r2:red:service",
562 + .name = "NB4-FXC-r2:green:service",
566 + .name = "NB4-FXC-r2:blue:service",
575 + .code = KEY_RESTART,
577 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
583 + .code = KEY_WPS_BUTTON,
585 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
593 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
601 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
604 + .devs = nb4_devices,
605 + .num_devs = ARRAY_SIZE(nb4_devices),
606 + .spis = nb4_spi_devices,
607 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
612 @@ -696,6 +1284,11 @@ static const struct board_info __initdat
624 @@ -750,6 +1343,16 @@ static void __init boardid_fixup(u8 *boo
625 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
626 char *board_name = (char *)bcm63xx_nvram_get_name();
628 + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
629 + u8 *p = boot_addr + NB4_PID_OFFSET;
631 + /* Extract nb4 PID */
632 + if (!memcmp(p, "NB4-", 4)) {
633 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
638 /* check if bcm_tag is at 64k offset */
639 if (strncmp(board_name, tag->boardid, BOARDID_LEN) != 0) {