--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c +++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,12 @@ #define PFX "board_bcm963xx: " +#define NEUFBOX4_PID_OFFSET 0xff80 +#define NEUFBOX4_EXP_GPIO_BASE 64 +#define NEUFBOX4_GPIO_74HC164_DATA 7 +#define NEUFBOX4_GPIO_74HC164_CLK 6 +#define NXP_74HC64_GPIO(X) (NEUFBOX4_EXP_GPIO_BASE + (X)) + static struct bcm963xx_nvram nvram; static unsigned int mac_addr_used; static struct board_info board; @@ -713,6 +720,441 @@ static struct board_info __initdata boar .has_ohci0 = 1, }; + +static struct nxp_74hc164_platform_data neufbox4_74hc164_data = { + .gpio_base = NEUFBOX4_EXP_GPIO_BASE, + .gpio_pin_data = NEUFBOX4_GPIO_74HC164_DATA, + .gpio_pin_clk = NEUFBOX4_GPIO_74HC164_CLK, + +}; + +static struct platform_device neufbox4_74hc164 = { + .name = NXP_74HC164_DRIVER_NAME, + .id = -1, + .dev = { + .platform_data = &neufbox4_74hc164_data, + } +}; + +static struct platform_device * __initdata neufbox4_devices[] = { + &neufbox4_74hc164, +}; + +static struct board_info __initdata board_nb4_ser_r0 = { + .name = "NB4-SER-r0", + .expected_cpu_id = 0x6358, + + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .has_udc0 = 1, + + .leds = { + { + .name = "adsl", + .gpio = NXP_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "tel", + .gpio = NXP_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "tv", + .gpio = NXP_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "alarm", + .gpio = NXP_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "service:red", + .gpio = 29, + .active_low = 1, + }, + { + .name = "service:green", + .gpio = 30, + .active_low = 1, + }, + { + .name = "service:blue", + .gpio = 4, + .active_low = 1, + }, + }, + .reset_buttons = { + { + .desc = "reset", + .gpio = 34, + .active_low = 1, + .type = EV_KEY, + .code = KEY_RESTART, + .threshold = 3, + }, + }, + .devs = neufbox4_devices, + .num_devs = ARRAY_SIZE(neufbox4_devices), +}; + +static struct board_info __initdata board_nb4_ser_r1 = { + .name = "NB4-SER-r1", + .expected_cpu_id = 0x6358, + + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .has_udc0 = 1, + + .leds = { + { + .name = "adsl", + .gpio = NXP_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "tel", + .gpio = NXP_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "tv", + .gpio = NXP_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "alarm", + .gpio = NXP_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "service:red", + .gpio = 29, + .active_low = 1, + }, + { + .name = "service:green", + .gpio = 30, + .active_low = 1, + }, + { + .name = "service:blue", + .gpio = 4, + .active_low = 1, + }, + }, + .reset_buttons = { + { + .desc = "reset", + .gpio = 34, + .active_low = 1, + .type = EV_KEY, + .code = KEY_RESTART, + .threshold = 3, + }, + }, + .devs = neufbox4_devices, + .num_devs = ARRAY_SIZE(neufbox4_devices), +}; + +static struct board_info __initdata board_nb4_ser_r2 = { + .name = "NB4-SER-r2", + .expected_cpu_id = 0x6358, + + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "adsl", + .gpio = NXP_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "traffic", + .gpio = 2, + .active_low = 1, + }, + { + .name = "tel", + .gpio = NXP_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "tv", + .gpio = NXP_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "wifi", + .gpio = 15, + .active_low = 1, + }, + { + .name = "alarm", + .gpio = NXP_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "service:red", + .gpio = 29, + .active_low = 1, + }, + { + .name = "service:green", + .gpio = 30, + .active_low = 1, + }, + { + .name = "service:blue", + .gpio = 4, + .active_low = 1, + }, + }, + .reset_buttons = { + { + .desc = "reset", + .gpio = 34, + .active_low = 1, + .type = EV_KEY, + .code = KEY_RESTART, + .threshold = 3, + }, + }, + .devs = neufbox4_devices, + .num_devs = ARRAY_SIZE(neufbox4_devices), +}; + +static struct board_info __initdata board_nb4_fxc_r1 = { + .name = "NB4-FXC-r1", + .expected_cpu_id = 0x6358, + + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .has_udc0 = 1, + + .leds = { + { + .name = "adsl", + .gpio = NXP_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "traffic", + .gpio = 2, + }, + { + .name = "tel", + .gpio = NXP_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "tv", + .gpio = NXP_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "wifi", + .gpio = 15, + }, + { + .name = "alarm", + .gpio = NXP_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "service:red", + .gpio = 29, + }, + { + .name = "service:green", + .gpio = 30, + }, + { + .name = "service:blue", + .gpio = 4, + }, + }, + .reset_buttons = { + { + .desc = "reset", + .gpio = 34, + .active_low = 1, + .type = EV_KEY, + .code = KEY_RESTART, + .threshold = 3, + }, + }, + .devs = neufbox4_devices, + .num_devs = ARRAY_SIZE(neufbox4_devices), +}; + +static struct board_info __initdata board_nb4_fxc_r2 = { + .name = "NB4-FXC-r2", + .expected_cpu_id = 0x6358, + + .has_enet0 = 1, + .has_enet1 = 1, + .has_pci = 1, + + .enet0 = { + .has_phy = 1, + .use_internal_phy = 1, + }, + + .enet1 = { + .force_speed_100 = 1, + .force_duplex_full = 1, + }, + + + .has_ohci0 = 1, + .has_pccard = 1, + .has_ehci0 = 1, + + .leds = { + { + .name = "adsl", + .gpio = NXP_74HC64_GPIO(4), + .active_low = 1, + }, + { + .name = "traffic", + .gpio = 2, + }, + { + .name = "tel", + .gpio = NXP_74HC64_GPIO(3), + .active_low = 1, + }, + { + .name = "tv", + .gpio = NXP_74HC64_GPIO(2), + .active_low = 1, + }, + { + .name = "wifi", + .gpio = 15, + }, + { + .name = "alarm", + .gpio = NXP_74HC64_GPIO(0), + .active_low = 1, + }, + { + .name = "service:red", + .gpio = 29, + }, + { + .name = "service:green", + .gpio = 30, + }, + { + .name = "service:blue", + .gpio = 4, + }, + }, + .reset_buttons = { + { + .desc = "reset", + .gpio = 34, + .active_low = 1, + .type = EV_KEY, + .code = KEY_RESTART, + .threshold = 3, + }, + }, + .devs = neufbox4_devices, + .num_devs = ARRAY_SIZE(neufbox4_devices), +}; #endif /* @@ -743,9 +1185,30 @@ static const struct board_info __initdat &board_96358vw2, &board_AGPFS0, &board_DWVS0, + &board_nb4_ser_r0, + &board_nb4_ser_r1, + &board_nb4_ser_r2, + &board_nb4_fxc_r1, + &board_nb4_fxc_r2, #endif }; +static void __init neufbox4_nvram_fixup(void) +{ + u8 *boot_addr, *p; + u32 val; + + if (BCMCPU_IS_6358() && (!strcmp(nvram.name, "96358VW"))) { + val = bcm_mpi_readl(MPI_CSBASE_REG(0)); + val &= MPI_CSBASE_BASE_MASK; + boot_addr = (u8 *)KSEG1ADDR(val); + /* Extract neufbox4 PID */ + p = boot_addr + NEUFBOX4_PID_OFFSET; + if (!memcmp(p, "NB4-", 4)) + memcpy(nvram.name, p, sizeof("NB4-XXX-rX")); + } +} + /* * early init callback, read nvram data from flash and checksum it */ @@ -793,6 +1256,9 @@ void __init board_prom_init(void) return; } + /* Fixup broken neufbox4 board name */ + neufbox4_nvram_fixup(); + /* find board by name */ for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) { if (strncmp(nvram.name, bcm963xx_boards[i]->name, --- a/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h +++ b/arch/mips/include/asm/mach-bcm63xx/board_bcm963xx.h @@ -55,7 +55,7 @@ struct board_info { struct bcm63xx_dsp_platform_data dsp; /* GPIO LEDs */ - struct gpio_led leds[8]; + struct gpio_led leds[9]; /* Reset button */ struct gpio_button reset_buttons[1];