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,496 @@ 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,
142 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
148 + .code = KEY_WPS_BUTTON,
149 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
152 + .devs = nb4_devices,
153 + .num_devs = ARRAY_SIZE(nb4_devices),
154 + .spis = nb4_spi_devices,
155 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
158 +static struct board_info __initdata board_nb4_ser_r1 = {
159 + .name = "NB4-SER-r1",
160 + .expected_cpu_id = 0x6358,
169 + .use_internal_phy = 1,
173 + .force_speed_100 = 1,
174 + .force_duplex_full = 1,
184 + .name = "NB4-SER-r1:white:adsl",
185 + .gpio = NB4_74HC64_GPIO(4),
189 + .name = "NB4-SER-r1:white:traffic",
194 + .name = "NB4-SER-r1:white:tel",
195 + .gpio = NB4_74HC64_GPIO(3),
199 + .name = "NB4-SER-r1:white:tv",
200 + .gpio = NB4_74HC64_GPIO(2),
204 + .name = "NB4-SER-r1:white:wifi",
209 + .name = "NB4-SER-r1:white:alarm",
210 + .gpio = NB4_74HC64_GPIO(0),
214 + .name = "NB4-SER-r1:red:service",
219 + .name = "NB4-SER-r1:green:service",
224 + .name = "NB4-SER-r1:blue:service",
234 + .code = KEY_RESTART,
235 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
241 + .code = KEY_WPS_BUTTON,
242 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
245 + .devs = nb4_devices,
246 + .num_devs = ARRAY_SIZE(nb4_devices),
247 + .spis = nb4_spi_devices,
248 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
251 +static struct board_info __initdata board_nb4_ser_r2 = {
252 + .name = "NB4-SER-r2",
253 + .expected_cpu_id = 0x6358,
262 + .use_internal_phy = 1,
266 + .force_speed_100 = 1,
267 + .force_duplex_full = 1,
277 + .name = "NB4-SER-r2:white:adsl",
278 + .gpio = NB4_74HC64_GPIO(4),
282 + .name = "NB4-SER-r2:white:traffic",
287 + .name = "NB4-SER-r2:white:tel",
288 + .gpio = NB4_74HC64_GPIO(3),
292 + .name = "NB4-SER-r2:white:tv",
293 + .gpio = NB4_74HC64_GPIO(2),
297 + .name = "NB4-SER-r2:white:wifi",
302 + .name = "NB4-SER-r2:white:alarm",
303 + .gpio = NB4_74HC64_GPIO(0),
307 + .name = "NB4-SER-r2:red:service",
312 + .name = "NB4-SER-r2:green:service",
317 + .name = "NB4-SER-r2:blue:service",
327 + .code = KEY_RESTART,
328 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
334 + .code = KEY_WPS_BUTTON,
335 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
338 + .devs = nb4_devices,
339 + .num_devs = ARRAY_SIZE(nb4_devices),
340 + .spis = nb4_spi_devices,
341 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
344 +static struct board_info __initdata board_nb4_fxc_r1 = {
345 + .name = "NB4-FXC-r1",
346 + .expected_cpu_id = 0x6358,
355 + .use_internal_phy = 1,
359 + .force_speed_100 = 1,
360 + .force_duplex_full = 1,
370 + .name = "NB4-FXC-r1:white:adsl",
371 + .gpio = NB4_74HC64_GPIO(4),
375 + .name = "NB4-FXC-r1:white:traffic",
379 + .name = "NB4-FXC-r1:white:tel",
380 + .gpio = NB4_74HC64_GPIO(3),
384 + .name = "NB4-FXC-r1:white:tv",
385 + .gpio = NB4_74HC64_GPIO(2),
389 + .name = "NB4-FXC-r1:white:wifi",
393 + .name = "NB4-FXC-r1:white:alarm",
394 + .gpio = NB4_74HC64_GPIO(0),
398 + .name = "NB4-FXC-r1:red:service",
402 + .name = "NB4-FXC-r1:green:service",
406 + .name = "NB4-FXC-r1:blue:service",
415 + .code = KEY_RESTART,
416 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
422 + .code = KEY_WPS_BUTTON,
423 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
426 + .devs = nb4_devices,
427 + .num_devs = ARRAY_SIZE(nb4_devices),
428 + .spis = nb4_spi_devices,
429 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
432 +static struct board_info __initdata board_nb4_fxc_r2 = {
433 + .name = "NB4-FXC-r2",
434 + .expected_cpu_id = 0x6358,
443 + .use_internal_phy = 1,
447 + .force_speed_100 = 1,
448 + .force_duplex_full = 1,
458 + .name = "NB4-FXC-r2:white:adsl",
459 + .gpio = NB4_74HC64_GPIO(4),
463 + .name = "NB4-FXC-r2:white:traffic",
467 + .name = "NB4-FXC-r2:white:tel",
468 + .gpio = NB4_74HC64_GPIO(3),
472 + .name = "NB4-FXC-r2:white:tv",
473 + .gpio = NB4_74HC64_GPIO(2),
477 + .name = "NB4-FXC-r2:white:wifi",
481 + .name = "NB4-FXC-r2:white:alarm",
482 + .gpio = NB4_74HC64_GPIO(0),
486 + .name = "NB4-FXC-r2:red:service",
490 + .name = "NB4-FXC-r2:green:service",
494 + .name = "NB4-FXC-r2:blue:service",
503 + .code = KEY_RESTART,
504 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
510 + .code = KEY_WPS_BUTTON,
511 + .debounce_interval = BCM963XX_KEYS_DEBOUNCE_INTERVAL,
514 + .devs = nb4_devices,
515 + .num_devs = ARRAY_SIZE(nb4_devices),
516 + .spis = nb4_spi_devices,
517 + .num_spis = ARRAY_SIZE(nb4_spi_devices),
522 @@ -696,9 +1194,31 @@ static const struct board_info __initdat
534 +static void __init nb4_nvram_fixup(void)
538 + char *board_name = (char *)bcm63xx_nvram_get_name();
540 + if (BCMCPU_IS_6358() && (!strcmp(board_name, "96358VW"))) {
541 + val = bcm_mpi_readl(MPI_CSBASE_REG(0));
542 + val &= MPI_CSBASE_BASE_MASK;
543 + boot_addr = (u8 *)KSEG1ADDR(val);
544 + /* Extract nb4 PID */
545 + p = boot_addr + NB4_PID_OFFSET;
546 + if (!memcmp(p, "NB4-", 4))
547 + memcpy(board_name, p, sizeof("NB4-XXX-rX"));
552 * Register a sane SPROMv2 to make the on-board
554 @@ -808,6 +1328,9 @@ void __init board_prom_init(void)
555 boardid_fixup(boot_addr);
558 + /* Fixup broken nb4 board name */
561 board_name = bcm63xx_nvram_get_name();
562 /* find board by name */
563 for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) {