--- a/arch/mips/bcm47xx/Kconfig +++ b/arch/mips/bcm47xx/Kconfig @@ -9,6 +9,7 @@ config BCM47XX_SSB select SSB_EMBEDDED select SSB_B43_PCI_BRIDGE if PCI select SSB_PCICORE_HOSTMODE if PCI + select SSB_SFLASH default y help Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support. @@ -23,6 +24,7 @@ config BCM47XX_BCMA select BCMA_DRIVER_MIPS select BCMA_HOST_PCI if PCI select BCMA_DRIVER_PCI_HOSTMODE if PCI + select BCMA_SFLASH default y help Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus. --- a/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c @@ -31,10 +31,12 @@ #include #include #include +#include #include #include #include #include +#include #include union bcm47xx_bus bcm47xx_bus; @@ -45,6 +47,32 @@ EXPORT_SYMBOL(bcm47xx_bus_type); struct bcm47xx_sflash bcm47xx_sflash; +static struct resource bcm47xx_pflash_resource = { + .name = "bcm47xx_pflash", + .start = 0, + .end = 0, + .flags = 0, +}; + +static struct platform_device bcm47xx_pflash_dev = { + .name = "bcm47xx_pflash", + .resource = &bcm47xx_pflash_resource, + .num_resources = 1, +}; + +static struct resource bcm47xx_sflash_resource = { + .name = "bcm47xx_sflash", + .start = 0, + .end = 0, + .flags = 0, +}; + +static struct platform_device bcm47xx_sflash_dev = { + .name = "bcm47xx_sflash", + .resource = &bcm47xx_sflash_resource, + .num_resources = 1, +}; + static void bcm47xx_machine_restart(char *command) { printk(KERN_ALERT "Please stand by while rebooting the system...\n"); @@ -156,6 +184,24 @@ static void __init bcm47xx_register_ssb( } } } + +static int __init bcm47xx_register_flash_ssb(void) +{ + struct ssb_chipcommon *chipco = &bcm47xx_bus.ssb.chipco; + + switch (chipco->flash_type) { + case SSB_PFLASH: + bcm47xx_pflash_resource.start = chipco->pflash.window; + bcm47xx_pflash_resource.end = chipco->pflash.window + chipco->pflash.window_size; + return platform_device_register(&bcm47xx_pflash_dev); + case SSB_SFLASH: + bcm47xx_sflash_dev.dev.platform_data = &bcm47xx_sflash; + return platform_device_register(&bcm47xx_sflash_dev); + default: + printk(KERN_ERR "No flash device found\n"); + return -1; + } +} #endif #ifdef CONFIG_BCM47XX_BCMA @@ -205,6 +251,24 @@ static void __init bcm47xx_register_bcma bcm47xx_fill_bcma_boardinfo(&bcm47xx_bus.bcma.bus.boardinfo, NULL); } + +static int __init bcm47xx_register_flash_bcma(void) +{ + struct bcma_drv_cc *drv_cc = &bcm47xx_bus.bcma.bus.drv_cc; + + switch (drv_cc->flash_type) { + case BCMA_PFLASH: + bcm47xx_pflash_resource.start = drv_cc->pflash.window; + bcm47xx_pflash_resource.end = drv_cc->pflash.window + drv_cc->pflash.window_size; + return platform_device_register(&bcm47xx_pflash_dev); + case BCMA_SFLASH: + bcm47xx_sflash_dev.dev.platform_data = &bcm47xx_sflash; + return platform_device_register(&bcm47xx_sflash_dev); + default: + printk(KERN_ERR "No flash device found\n"); + return -1; + } +} #endif void __init plat_mem_setup(void) @@ -247,3 +311,19 @@ static int __init bcm47xx_register_bus_c return 0; } device_initcall(bcm47xx_register_bus_complete); + +static int __init bcm47xx_register_flash(void) +{ + switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_SSB + case BCM47XX_BUS_TYPE_SSB: + return bcm47xx_register_flash_ssb(); +#endif +#ifdef CONFIG_BCM47XX_BCMA + case BCM47XX_BUS_TYPE_BCMA: + return bcm47xx_register_flash_bcma(); +#endif + } + return -1; +} +fs_initcall(bcm47xx_register_flash);