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 @@ -755,6 +763,601 @@ 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,
82 + .force_speed_100 = 1,
83 + .force_duplex_full = 1,
90 + .num_usbh_ports = 2,
94 + .name = "NB4-SER-r0:white:adsl",
95 + .gpio = NB4_74HC64_GPIO(4),
99 + .name = "NB4-SER-r0:white:traffic",
104 + .name = "NB4-SER-r0:white:tel",
105 + .gpio = NB4_74HC64_GPIO(3),
109 + .name = "NB4-SER-r0:white:tv",
110 + .gpio = NB4_74HC64_GPIO(2),
114 + .name = "NB4-SER-r0:white:wifi",
119 + .name = "NB4-SER-r0:white:alarm",
120 + .gpio = NB4_74HC64_GPIO(0),
124 + .name = "NB4-SER-r0:red:service",
129 + .name = "NB4-SER-r0:green:service",
134 + .name = "NB4-SER-r0:blue:service",
144 + .code = KEY_RESTART,
146 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
152 + .code = KEY_WPS_BUTTON,
154 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
162 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
170 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
173 + .devs = nb4_devices,
174 + .num_devs = ARRAY_SIZE(nb4_devices),
175 + .spis = nb4_spi_devices,
176 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
179 +static struct board_info __initdata board_nb4_ser_r1 = {
180 + .name = "NB4-SER-r1",
181 + .expected_cpu_id = 0x6358,
190 + .use_internal_phy = 1,
196 + .force_speed_100 = 1,
197 + .force_duplex_full = 1,
204 + .num_usbh_ports = 2,
208 + .name = "NB4-SER-r1:white:adsl",
209 + .gpio = NB4_74HC64_GPIO(4),
213 + .name = "NB4-SER-r1:white:traffic",
218 + .name = "NB4-SER-r1:white:tel",
219 + .gpio = NB4_74HC64_GPIO(3),
223 + .name = "NB4-SER-r1:white:tv",
224 + .gpio = NB4_74HC64_GPIO(2),
228 + .name = "NB4-SER-r1:white:wifi",
233 + .name = "NB4-SER-r1:white:alarm",
234 + .gpio = NB4_74HC64_GPIO(0),
238 + .name = "NB4-SER-r1:red:service",
243 + .name = "NB4-SER-r1:green:service",
248 + .name = "NB4-SER-r1:blue:service",
258 + .code = KEY_RESTART,
260 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
266 + .code = KEY_WPS_BUTTON,
268 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
276 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
284 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
287 + .devs = nb4_devices,
288 + .num_devs = ARRAY_SIZE(nb4_devices),
289 + .spis = nb4_spi_devices,
290 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
293 +static struct board_info __initdata board_nb4_ser_r2 = {
294 + .name = "NB4-SER-r2",
295 + .expected_cpu_id = 0x6358,
304 + .use_internal_phy = 1,
310 + .force_speed_100 = 1,
311 + .force_duplex_full = 1,
318 + .num_usbh_ports = 2,
322 + .name = "NB4-SER-r2:white:adsl",
323 + .gpio = NB4_74HC64_GPIO(4),
327 + .name = "NB4-SER-r2:white:traffic",
332 + .name = "NB4-SER-r2:white:tel",
333 + .gpio = NB4_74HC64_GPIO(3),
337 + .name = "NB4-SER-r2:white:tv",
338 + .gpio = NB4_74HC64_GPIO(2),
342 + .name = "NB4-SER-r2:white:wifi",
347 + .name = "NB4-SER-r2:white:alarm",
348 + .gpio = NB4_74HC64_GPIO(0),
352 + .name = "NB4-SER-r2:red:service",
357 + .name = "NB4-SER-r2:green:service",
362 + .name = "NB4-SER-r2:blue:service",
372 + .code = KEY_RESTART,
374 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
380 + .code = KEY_WPS_BUTTON,
382 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
390 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
398 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
401 + .devs = nb4_devices,
402 + .num_devs = ARRAY_SIZE(nb4_devices),
403 + .spis = nb4_spi_devices,
404 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
407 +static struct board_info __initdata board_nb4_fxc_r1 = {
408 + .name = "NB4-FXC-r1",
409 + .expected_cpu_id = 0x6358,
418 + .use_internal_phy = 1,
424 + .force_speed_100 = 1,
425 + .force_duplex_full = 1,
432 + .num_usbh_ports = 2,
436 + .name = "NB4-FXC-r1:white:adsl",
437 + .gpio = NB4_74HC64_GPIO(4),
441 + .name = "NB4-FXC-r1:white:traffic",
445 + .name = "NB4-FXC-r1:white:tel",
446 + .gpio = NB4_74HC64_GPIO(3),
450 + .name = "NB4-FXC-r1:white:tv",
451 + .gpio = NB4_74HC64_GPIO(2),
455 + .name = "NB4-FXC-r1:white:wifi",
459 + .name = "NB4-FXC-r1:white:alarm",
460 + .gpio = NB4_74HC64_GPIO(0),
464 + .name = "NB4-FXC-r1:red:service",
468 + .name = "NB4-FXC-r1:green:service",
472 + .name = "NB4-FXC-r1:blue:service",
481 + .code = KEY_RESTART,
483 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
489 + .code = KEY_WPS_BUTTON,
491 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
499 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
507 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
510 + .devs = nb4_devices,
511 + .num_devs = ARRAY_SIZE(nb4_devices),
512 + .spis = nb4_spi_devices,
513 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
516 +static struct board_info __initdata board_nb4_fxc_r2 = {
517 + .name = "NB4-FXC-r2",
518 + .expected_cpu_id = 0x6358,
527 + .use_internal_phy = 1,
533 + .force_speed_100 = 1,
534 + .force_duplex_full = 1,
541 + .num_usbh_ports = 2,
545 + .name = "NB4-FXC-r2:white:adsl",
546 + .gpio = NB4_74HC64_GPIO(4),
550 + .name = "NB4-FXC-r2:white:traffic",
554 + .name = "NB4-FXC-r2:white:tel",
555 + .gpio = NB4_74HC64_GPIO(3),
559 + .name = "NB4-FXC-r2:white:tv",
560 + .gpio = NB4_74HC64_GPIO(2),
564 + .name = "NB4-FXC-r2:white:wifi",
568 + .name = "NB4-FXC-r2:white:alarm",
569 + .gpio = NB4_74HC64_GPIO(0),
573 + .name = "NB4-FXC-r2:red:service",
577 + .name = "NB4-FXC-r2:green:service",
581 + .name = "NB4-FXC-r2:blue:service",
590 + .code = KEY_RESTART,
592 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
598 + .code = KEY_WPS_BUTTON,
600 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
608 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
616 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
619 + .devs = nb4_devices,
620 + .num_devs = ARRAY_SIZE(nb4_devices),
621 + .spis = nb4_spi_devices,
622 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
627 @@ -791,6 +1394,11 @@ static const struct board_info __initcon
639 @@ -845,6 +1453,16 @@ static void __init boardid_fixup(u8 *boo
640 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
641 char *board_name = (char *)bcm63xx_nvram_get_name();
643 + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
644 + u8 *p = boot_addr + NB4_PID_OFFSET;
646 + /* Extract nb4 PID */
647 + if (!memcmp(p, "NB4-", 4)) {
648 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
653 /* check if bcm_tag is at 64k offset */
654 if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) {