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 @@ -754,6 +762,596 @@ 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,
93 + .name = "NB4-SER-r0:white:adsl",
94 + .gpio = NB4_74HC64_GPIO(4),
98 + .name = "NB4-SER-r0:white:traffic",
103 + .name = "NB4-SER-r0:white:tel",
104 + .gpio = NB4_74HC64_GPIO(3),
108 + .name = "NB4-SER-r0:white:tv",
109 + .gpio = NB4_74HC64_GPIO(2),
113 + .name = "NB4-SER-r0:white:wifi",
118 + .name = "NB4-SER-r0:white:alarm",
119 + .gpio = NB4_74HC64_GPIO(0),
123 + .name = "NB4-SER-r0:red:service",
128 + .name = "NB4-SER-r0:green:service",
133 + .name = "NB4-SER-r0:blue:service",
143 + .code = KEY_RESTART,
145 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
151 + .code = KEY_WPS_BUTTON,
153 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
161 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
169 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
172 + .devs = nb4_devices,
173 + .num_devs = ARRAY_SIZE(nb4_devices),
174 + .spis = nb4_spi_devices,
175 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
178 +static struct board_info __initdata board_nb4_ser_r1 = {
179 + .name = "NB4-SER-r1",
180 + .expected_cpu_id = 0x6358,
189 + .use_internal_phy = 1,
195 + .force_speed_100 = 1,
196 + .force_duplex_full = 1,
206 + .name = "NB4-SER-r1:white:adsl",
207 + .gpio = NB4_74HC64_GPIO(4),
211 + .name = "NB4-SER-r1:white:traffic",
216 + .name = "NB4-SER-r1:white:tel",
217 + .gpio = NB4_74HC64_GPIO(3),
221 + .name = "NB4-SER-r1:white:tv",
222 + .gpio = NB4_74HC64_GPIO(2),
226 + .name = "NB4-SER-r1:white:wifi",
231 + .name = "NB4-SER-r1:white:alarm",
232 + .gpio = NB4_74HC64_GPIO(0),
236 + .name = "NB4-SER-r1:red:service",
241 + .name = "NB4-SER-r1:green:service",
246 + .name = "NB4-SER-r1:blue:service",
256 + .code = KEY_RESTART,
258 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
264 + .code = KEY_WPS_BUTTON,
266 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
274 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
282 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
285 + .devs = nb4_devices,
286 + .num_devs = ARRAY_SIZE(nb4_devices),
287 + .spis = nb4_spi_devices,
288 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
291 +static struct board_info __initdata board_nb4_ser_r2 = {
292 + .name = "NB4-SER-r2",
293 + .expected_cpu_id = 0x6358,
302 + .use_internal_phy = 1,
308 + .force_speed_100 = 1,
309 + .force_duplex_full = 1,
319 + .name = "NB4-SER-r2:white:adsl",
320 + .gpio = NB4_74HC64_GPIO(4),
324 + .name = "NB4-SER-r2:white:traffic",
329 + .name = "NB4-SER-r2:white:tel",
330 + .gpio = NB4_74HC64_GPIO(3),
334 + .name = "NB4-SER-r2:white:tv",
335 + .gpio = NB4_74HC64_GPIO(2),
339 + .name = "NB4-SER-r2:white:wifi",
344 + .name = "NB4-SER-r2:white:alarm",
345 + .gpio = NB4_74HC64_GPIO(0),
349 + .name = "NB4-SER-r2:red:service",
354 + .name = "NB4-SER-r2:green:service",
359 + .name = "NB4-SER-r2:blue:service",
369 + .code = KEY_RESTART,
371 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
377 + .code = KEY_WPS_BUTTON,
379 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
387 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
395 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
398 + .devs = nb4_devices,
399 + .num_devs = ARRAY_SIZE(nb4_devices),
400 + .spis = nb4_spi_devices,
401 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
404 +static struct board_info __initdata board_nb4_fxc_r1 = {
405 + .name = "NB4-FXC-r1",
406 + .expected_cpu_id = 0x6358,
415 + .use_internal_phy = 1,
421 + .force_speed_100 = 1,
422 + .force_duplex_full = 1,
432 + .name = "NB4-FXC-r1:white:adsl",
433 + .gpio = NB4_74HC64_GPIO(4),
437 + .name = "NB4-FXC-r1:white:traffic",
441 + .name = "NB4-FXC-r1:white:tel",
442 + .gpio = NB4_74HC64_GPIO(3),
446 + .name = "NB4-FXC-r1:white:tv",
447 + .gpio = NB4_74HC64_GPIO(2),
451 + .name = "NB4-FXC-r1:white:wifi",
455 + .name = "NB4-FXC-r1:white:alarm",
456 + .gpio = NB4_74HC64_GPIO(0),
460 + .name = "NB4-FXC-r1:red:service",
464 + .name = "NB4-FXC-r1:green:service",
468 + .name = "NB4-FXC-r1:blue:service",
477 + .code = KEY_RESTART,
479 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
485 + .code = KEY_WPS_BUTTON,
487 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
495 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
503 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
506 + .devs = nb4_devices,
507 + .num_devs = ARRAY_SIZE(nb4_devices),
508 + .spis = nb4_spi_devices,
509 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
512 +static struct board_info __initdata board_nb4_fxc_r2 = {
513 + .name = "NB4-FXC-r2",
514 + .expected_cpu_id = 0x6358,
523 + .use_internal_phy = 1,
529 + .force_speed_100 = 1,
530 + .force_duplex_full = 1,
540 + .name = "NB4-FXC-r2:white:adsl",
541 + .gpio = NB4_74HC64_GPIO(4),
545 + .name = "NB4-FXC-r2:white:traffic",
549 + .name = "NB4-FXC-r2:white:tel",
550 + .gpio = NB4_74HC64_GPIO(3),
554 + .name = "NB4-FXC-r2:white:tv",
555 + .gpio = NB4_74HC64_GPIO(2),
559 + .name = "NB4-FXC-r2:white:wifi",
563 + .name = "NB4-FXC-r2:white:alarm",
564 + .gpio = NB4_74HC64_GPIO(0),
568 + .name = "NB4-FXC-r2:red:service",
572 + .name = "NB4-FXC-r2:green:service",
576 + .name = "NB4-FXC-r2:blue:service",
585 + .code = KEY_RESTART,
587 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
593 + .code = KEY_WPS_BUTTON,
595 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
603 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
611 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
614 + .devs = nb4_devices,
615 + .num_devs = ARRAY_SIZE(nb4_devices),
616 + .spis = nb4_spi_devices,
617 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
622 @@ -790,6 +1388,11 @@ static const struct board_info __initcon
634 @@ -844,6 +1447,16 @@ static void __init boardid_fixup(u8 *boo
635 struct bcm_tag *tag = (struct bcm_tag *)(boot_addr + CFE_OFFSET_64K);
636 char *board_name = (char *)bcm63xx_nvram_get_name();
638 + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
639 + u8 *p = boot_addr + NB4_PID_OFFSET;
641 + /* Extract nb4 PID */
642 + if (!memcmp(p, "NB4-", 4)) {
643 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
648 /* check if bcm_tag is at 64k offset */
649 if (strncmp(board_name, tag->board_id, BOARDID_LEN) != 0) {