Changeset 33920


Ignore:
Timestamp:
2012-10-25T16:33:47+02:00 (5 years ago)
Author:
hauke
Message:

kernel: update bcma and ssb to master-2012-10-18 from wireless-testing

  • update the flash driver for bcm47xx to use the stubs already in bcma
  • do some misc enhancements to the flash drivers for bcm47xx
Location:
trunk
Files:
13 added
18 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/patches-3.3/114-MIPS-BCM47xx-Setup-and-register-serial-early.patch

    r33209 r33920  
    1616--- a/arch/mips/bcm47xx/setup.c 
    1717+++ b/arch/mips/bcm47xx/setup.c 
    18 @@ -33,6 +33,8 @@ 
     18@@ -31,6 +31,8 @@ 
     19 #include <linux/ssb/ssb.h> 
    1920 #include <linux/ssb/ssb_embedded.h> 
    2021 #include <linux/bcma/bcma_soc.h> 
    21  #include <linux/platform_device.h> 
    2222+#include <linux/serial.h> 
    2323+#include <linux/serial_8250.h> 
     
    2525 #include <asm/reboot.h> 
    2626 #include <asm/time.h> 
    27 @@ -152,6 +154,31 @@ static int bcm47xx_get_invariants(struct 
     27@@ -121,6 +123,31 @@ static int bcm47xx_get_invariants(struct 
    2828        return 0; 
    2929 } 
     
    5757 { 
    5858        int err; 
    59 @@ -184,6 +211,10 @@ static void __init bcm47xx_register_ssb( 
     59@@ -150,6 +177,10 @@ static void __init bcm47xx_register_ssb( 
    6060                        memcpy(&mcore->serial_ports[1], &port, sizeof(port)); 
    6161                } 
     
    6666+#endif 
    6767 } 
     68 #endif 
    6869  
    69  static int __init bcm47xx_register_flash_ssb(void) 
  • trunk/target/linux/brcm47xx/patches-3.3/194-MIPS-BCM47XX-read-sprom-without-prefix-if-no-ieee802.patch

    r33597 r33920  
    11--- a/arch/mips/bcm47xx/setup.c 
    22+++ b/arch/mips/bcm47xx/setup.c 
    3 @@ -258,6 +258,8 @@ static int bcm47xx_get_sprom_bcma(struct 
     3@@ -206,6 +206,8 @@ static int bcm47xx_get_sprom_bcma(struct 
    44                        snprintf(prefix, sizeof(prefix), "sb/%u/", 
    55                                 core->core_index); 
  • trunk/target/linux/brcm47xx/patches-3.3/195-MIPS-BCM47xx-sprom-read-values-without-prefix-as-fal.patch

    r33597 r33920  
    11--- a/arch/mips/bcm47xx/setup.c 
    22+++ b/arch/mips/bcm47xx/setup.c 
    3 @@ -127,7 +127,7 @@ static int bcm47xx_get_sprom_ssb(struct 
     3@@ -96,7 +96,7 @@ static int bcm47xx_get_sprom_ssb(struct 
    44                snprintf(prefix, sizeof(prefix), "pci/%u/%u/", 
    55                         bus->host_pci->bus->number + 1, 
     
    1010        } else { 
    1111                printk(KERN_WARNING "bcm47xx: unable to fill SPROM for given bustype.\n"); 
    12 @@ -146,7 +146,7 @@ static int bcm47xx_get_invariants(struct 
     12@@ -115,7 +115,7 @@ static int bcm47xx_get_invariants(struct 
    1313        bcm47xx_fill_ssb_boardinfo(&iv->boardinfo, NULL); 
    1414  
     
    1919        if (nvram_getenv("cardbus", buf, sizeof(buf)) >= 0) 
    2020                iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10); 
    21 @@ -248,18 +248,17 @@ static int bcm47xx_get_sprom_bcma(struct 
     21@@ -196,18 +196,17 @@ static int bcm47xx_get_sprom_bcma(struct 
    2222                snprintf(prefix, sizeof(prefix), "pci/%u/%u/", 
    2323                         bus->host_pci->bus->number + 1, 
  • trunk/target/linux/brcm47xx/patches-3.3/280-activate_ssb_support_in_usb.patch

    r29575 r33920  
    1212+       select USB_HCD_BCMA if USB_EHCI_HCD || USB_OHCI_HCD 
    1313  
    14  config BCMA_SFLASH 
    15         bool 
     14 config BCMA_DRIVER_MIPS 
     15        bool "BCMA Broadcom MIPS core driver" 
    1616--- a/drivers/ssb/Kconfig 
    1717+++ b/drivers/ssb/Kconfig 
    18 @@ -147,6 +147,7 @@ config SSB_SFLASH 
    19  config SSB_EMBEDDED 
     18@@ -146,6 +146,7 @@ config SSB_EMBEDDED 
     19 config SSB_SFLASH 
    2020        bool 
    2121        depends on SSB_DRIVER_MIPS 
  • trunk/target/linux/brcm47xx/patches-3.3/400-arch-bcm47xx.patch

    r33825 r33920  
    11--- a/arch/mips/bcm47xx/nvram.c 
    22+++ b/arch/mips/bcm47xx/nvram.c 
    3 @@ -274,3 +274,30 @@ int nvram_getenv(char *name, char *val, 
     3@@ -183,3 +183,30 @@ int nvram_getenv(char *name, char *val, 
    44        return NVRAM_ERR_ENVNOTFOUND; 
    55 } 
  • trunk/target/linux/brcm47xx/patches-3.3/501-bcma-add-gpio-driver.patch

    r33600 r33920  
    100100--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    101101+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    102 @@ -495,6 +495,9 @@ struct bcma_drv_cc { 
     102@@ -551,6 +551,9 @@ struct bcma_drv_cc { 
    103103        int nr_serial_ports; 
    104104        struct bcma_serial_port serial_ports[4]; 
     
    110110  
    111111 /* Register access */ 
    112 @@ -525,13 +528,22 @@ void bcma_chipco_irq_mask(struct bcma_dr 
     112@@ -581,13 +584,22 @@ void bcma_chipco_irq_mask(struct bcma_dr 
    113113  
    114114 u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask); 
  • trunk/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch

    r33597 r33920  
    277277--- a/arch/mips/bcm47xx/setup.c 
    278278+++ b/arch/mips/bcm47xx/setup.c 
    279 @@ -346,6 +346,8 @@ void __init plat_mem_setup(void) 
     279@@ -252,6 +252,8 @@ void __init plat_mem_setup(void) 
    280280        _machine_restart = bcm47xx_machine_restart; 
    281281        _machine_halt = bcm47xx_machine_halt; 
     
    308308                if (!request_irq(gpio_to_irq(WGT634U_GPIO_RESET), 
    309309                                 gpio_interrupt, IRQF_SHARED, 
    310                                  "WGT634U GPIO", ccore)) { 
     310                                 "WGT634U GPIO", &bcm47xx_bus.ssb.chipco)) { 
    311311--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h 
    312312+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h 
  • trunk/target/linux/brcm47xx/patches-3.3/812-disable_wgt634u_crap.patch

    r33208 r33920  
    44 # 
    55  
    6  obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o bus.o 
     6 obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o 
    77-obj-$(CONFIG_BCM47XX_SSB)      += wgt634u.o 
    88--- a/arch/mips/bcm47xx/wgt634u.c 
     
    154154-           ((et0mac[1] == 0x09 && et0mac[2] == 0x5b) || 
    155155-            (et0mac[1] == 0x0f && et0mac[2] == 0xb5))) { 
    156 -               struct ssb_chipcommon *ccore = &bcm47xx_bus.ssb.chipco; 
     156-               struct ssb_mipscore *mcore = &bcm47xx_bus.ssb.mipscore; 
    157157- 
    158158-               printk(KERN_INFO "WGT634U machine detected.\n"); 
     
    166166-               if (!request_irq(gpio_to_irq(WGT634U_GPIO_RESET), 
    167167-                                gpio_interrupt, IRQF_SHARED, 
    168 -                                "WGT634U GPIO", ccore)) { 
     168-                                "WGT634U GPIO", &bcm47xx_bus.ssb.chipco)) { 
    169169-                       gpio_direction_input(WGT634U_GPIO_RESET); 
    170170-                       gpio_intmask(WGT634U_GPIO_RESET, 1); 
    171 -                       ssb_chipco_irq_mask(ccore, 
     171-                       ssb_chipco_irq_mask(&bcm47xx_bus.ssb.chipco, 
    172172-                                           SSB_CHIPCO_IRQ_GPIO, 
    173173-                                           SSB_CHIPCO_IRQ_GPIO); 
    174174-               } 
    175175- 
    176 -               wgt634u_flash_data.width = ccore->pflash.buswidth; 
    177 -               wgt634u_flash_resource.start = ccore->pflash.window; 
    178 -               wgt634u_flash_resource.end = ccore->pflash.window 
    179 -                                          + ccore->pflash.window_size 
     176-               wgt634u_flash_data.width = mcore->pflash.buswidth; 
     177-               wgt634u_flash_resource.start = mcore->pflash.window; 
     178-               wgt634u_flash_resource.end = mcore->pflash.window 
     179-                                          + mcore->pflash.window_size 
    180180-                                          - 1; 
    181181-               return platform_add_devices(wgt634u_devices, 
  • trunk/target/linux/brcm47xx/patches-3.3/820-wgt634u-nvram-fix.patch

    r32845 r33920  
    1010 # 
    1111  
    12 -obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o bus.o 
    13 +obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o bus.o cfe_env.o 
     12-obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o 
     13+obj-y                          += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o cfe_env.o 
    1414--- /dev/null 
    1515+++ b/arch/mips/bcm47xx/cfe_env.c 
     
    246246--- a/arch/mips/bcm47xx/nvram.c 
    247247+++ b/arch/mips/bcm47xx/nvram.c 
    248 @@ -25,6 +25,8 @@ 
    249  #include <linux/mtd/bcm47xx_nand.h> 
     248@@ -22,6 +22,8 @@ 
     249 #include <asm/mach-bcm47xx/bcm47xx.h> 
    250250  
    251251 static char nvram_buf[NVRAM_SPACE]; 
     
    253253+extern char *cfe_env_get(char *nv_buf, const char *name); 
    254254  
    255  /* Probe for NVRAM header */ 
    256  static void early_nvram_init_pflash(void) 
    257 @@ -58,6 +60,25 @@ static void early_nvram_init_pflash(void 
    258                 break; 
    259  #endif 
     255 static u32 find_nvram_size(u32 end) 
     256 { 
     257@@ -59,6 +61,25 @@ static void early_nvram_init_fill(u32 ba 
     258                } 
     259                off <<= 1; 
    260260        } 
    261261+       cfe_env = 0; 
     
    279279+       } 
    280280  
    281         off = FLASH_MIN; 
    282         while (off <= lim) { 
    283 @@ -257,6 +278,12 @@ int nvram_getenv(char *name, char *val, 
     281        /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */ 
     282        header = (struct nvram_header *) KSEG1ADDR(base + 4096); 
     283@@ -166,6 +187,12 @@ int nvram_getenv(char *name, char *val, 
    284284        if (!nvram_buf[0]) 
    285285                early_nvram_init(); 
     
    294294        var = &nvram_buf[sizeof(struct nvram_header)]; 
    295295        end = nvram_buf + sizeof(nvram_buf) - 2; 
    296 @@ -285,6 +312,9 @@ char *nvram_get(const char *name) 
     296@@ -194,6 +221,9 @@ char *nvram_get(const char *name) 
    297297        if (!nvram_buf[0]) 
    298298                early_nvram_init(); 
  • trunk/target/linux/brcm47xx/patches-3.3/980-wnr834b_no_cardbus_invariant.patch

    r33209 r33920  
    11--- a/arch/mips/bcm47xx/setup.c 
    22+++ b/arch/mips/bcm47xx/setup.c 
    3 @@ -151,6 +151,10 @@ static int bcm47xx_get_invariants(struct 
     3@@ -120,6 +120,10 @@ static int bcm47xx_get_invariants(struct 
    44        if (nvram_getenv("cardbus", buf, sizeof(buf)) >= 0) 
    55                iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10); 
  • trunk/target/linux/brcm47xx/patches-3.3/999-wl_exports.patch

    r32580 r33920  
    11--- a/arch/mips/bcm47xx/nvram.c 
    22+++ b/arch/mips/bcm47xx/nvram.c 
    3 @@ -24,7 +24,8 @@ 
    4  #include <asm/mach-bcm47xx/bus.h> 
    5  #include <linux/mtd/bcm47xx_nand.h> 
     3@@ -21,7 +21,8 @@ 
     4 #include <asm/mach-bcm47xx/nvram.h> 
     5 #include <asm/mach-bcm47xx/bcm47xx.h> 
    66  
    77-static char nvram_buf[NVRAM_SPACE]; 
  • trunk/target/linux/generic/patches-3.3/020-ssb_update.patch

    r32580 r33920  
    101101--- a/drivers/ssb/driver_mipscore.c 
    102102+++ b/drivers/ssb/driver_mipscore.c 
    103 @@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m 
     103@@ -190,16 +190,32 @@ static void ssb_mips_flash_detect(struct 
     104 { 
     105        struct ssb_bus *bus = mcore->dev->bus; 
     106  
     107-       mcore->flash_buswidth = 2; 
     108-       if (bus->chipco.dev) { 
     109-               mcore->flash_window = 0x1c000000; 
     110-               mcore->flash_window_size = 0x02000000; 
     111+       /* When there is no chipcommon on the bus there is 4MB flash */ 
     112+       if (!bus->chipco.dev) { 
     113+               mcore->pflash.present = true; 
     114+               mcore->pflash.buswidth = 2; 
     115+               mcore->pflash.window = SSB_FLASH1; 
     116+               mcore->pflash.window_size = SSB_FLASH1_SZ; 
     117+               return; 
     118+       } 
     119+ 
     120+       /* There is ChipCommon, so use it to read info about flash */ 
     121+       switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) { 
     122+       case SSB_CHIPCO_FLASHT_STSER: 
     123+       case SSB_CHIPCO_FLASHT_ATSER: 
     124+               pr_err("Serial flash not supported\n"); 
     125+               break; 
     126+       case SSB_CHIPCO_FLASHT_PARA: 
     127+               pr_debug("Found parallel flash\n"); 
     128+               mcore->pflash.present = true; 
     129+               mcore->pflash.window = SSB_FLASH2; 
     130+               mcore->pflash.window_size = SSB_FLASH2_SZ; 
     131                if ((ssb_read32(bus->chipco.dev, SSB_CHIPCO_FLASH_CFG) 
     132                               & SSB_CHIPCO_CFG_DS16) == 0) 
     133-                       mcore->flash_buswidth = 1; 
     134-       } else { 
     135-               mcore->flash_window = 0x1fc00000; 
     136-               mcore->flash_window_size = 0x00400000; 
     137+                       mcore->pflash.buswidth = 1; 
     138+               else 
     139+                       mcore->pflash.buswidth = 2; 
     140+               break; 
     141        } 
     142 } 
     143  
     144@@ -208,6 +224,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m 
    104145        struct ssb_bus *bus = mcore->dev->bus; 
    105146        u32 pll_type, n, m, rate = 0; 
     
    674715 /* Vendor-ID values */ 
    675716 #define SSB_VENDOR_BROADCOM    0x4243 
     717--- a/include/linux/ssb/ssb_driver_chipcommon.h 
     718+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
     719@@ -504,7 +504,9 @@ 
     720 #define SSB_CHIPCO_FLASHCTL_ST_SE      0x02D8          /* Sector Erase */ 
     721 #define SSB_CHIPCO_FLASHCTL_ST_BE      0x00C7          /* Bulk Erase */ 
     722 #define SSB_CHIPCO_FLASHCTL_ST_DP      0x00B9          /* Deep Power-down */ 
     723-#define SSB_CHIPCO_FLASHCTL_ST_RSIG    0x03AB          /* Read Electronic Signature */ 
     724+#define SSB_CHIPCO_FLASHCTL_ST_RES     0x03AB          /* Read Electronic Signature */ 
     725+#define SSB_CHIPCO_FLASHCTL_ST_CSA     0x1000          /* Keep chip select asserted */ 
     726+#define SSB_CHIPCO_FLASHCTL_ST_SSE     0x0220          /* Sub-sector Erase */ 
     727  
     728 /* Status register bits for ST flashes */ 
     729 #define SSB_CHIPCO_FLASHSTA_ST_WIP     0x01            /* Write In Progress */ 
    676730--- a/include/linux/ssb/ssb_driver_gige.h 
    677731+++ b/include/linux/ssb/ssb_driver_gige.h 
     
    684738 #include <linux/spinlock.h> 
    685739  
     740--- a/include/linux/ssb/ssb_driver_mips.h 
     741+++ b/include/linux/ssb/ssb_driver_mips.h 
     742@@ -13,6 +13,12 @@ struct ssb_serial_port { 
     743        unsigned int reg_shift; 
     744 }; 
     745  
     746+struct ssb_pflash { 
     747+       bool present; 
     748+       u8 buswidth; 
     749+       u32 window; 
     750+       u32 window_size; 
     751+}; 
     752  
     753 struct ssb_mipscore { 
     754        struct ssb_device *dev; 
     755@@ -20,9 +26,7 @@ struct ssb_mipscore { 
     756        int nr_serial_ports; 
     757        struct ssb_serial_port serial_ports[4]; 
     758  
     759-       u8 flash_buswidth; 
     760-       u32 flash_window; 
     761-       u32 flash_window_size; 
     762+       struct ssb_pflash pflash; 
     763 }; 
     764  
     765 extern void ssb_mipscore_init(struct ssb_mipscore *mcore); 
    686766--- a/include/linux/ssb/ssb_regs.h 
    687767+++ b/include/linux/ssb/ssb_regs.h 
  • trunk/target/linux/generic/patches-3.3/025-bcma_backport.patch

    r32880 r33920  
     1--- a/arch/mips/bcm47xx/nvram.c 
     2+++ b/arch/mips/bcm47xx/nvram.c 
     3@@ -43,8 +43,8 @@ static void early_nvram_init(void) 
     4 #ifdef CONFIG_BCM47XX_SSB 
     5        case BCM47XX_BUS_TYPE_SSB: 
     6                mcore_ssb = &bcm47xx_bus.ssb.mipscore; 
     7-               base = mcore_ssb->flash_window; 
     8-               lim = mcore_ssb->flash_window_size; 
     9+               base = mcore_ssb->pflash.window; 
     10+               lim = mcore_ssb->pflash.window_size; 
     11                break; 
     12 #endif 
     13 #ifdef CONFIG_BCM47XX_BCMA 
     14--- a/arch/mips/bcm47xx/wgt634u.c 
     15+++ b/arch/mips/bcm47xx/wgt634u.c 
     16@@ -156,10 +156,10 @@ static int __init wgt634u_init(void) 
     17                                            SSB_CHIPCO_IRQ_GPIO); 
     18                } 
     19  
     20-               wgt634u_flash_data.width = mcore->flash_buswidth; 
     21-               wgt634u_flash_resource.start = mcore->flash_window; 
     22-               wgt634u_flash_resource.end = mcore->flash_window 
     23-                                          + mcore->flash_window_size 
     24+               wgt634u_flash_data.width = mcore->pflash.buswidth; 
     25+               wgt634u_flash_resource.start = mcore->pflash.window; 
     26+               wgt634u_flash_resource.end = mcore->pflash.window 
     27+                                          + mcore->pflash.window_size 
     28                                           - 1; 
     29                return platform_add_devices(wgt634u_devices, 
     30                                            ARRAY_SIZE(wgt634u_devices)); 
    131--- a/drivers/bcma/Kconfig 
    232+++ b/drivers/bcma/Kconfig 
     
    1040          PCI core hostmode operation (external PCI bus). 
    1141  
    12 @@ -46,6 +46,15 @@ config BCMA_DRIVER_MIPS 
     42@@ -46,6 +46,25 @@ config BCMA_DRIVER_MIPS 
    1343  
    1444          If unsure, say N 
    1545  
     46+config BCMA_SFLASH 
     47+       bool 
     48+       depends on BCMA_DRIVER_MIPS 
     49+       default y 
     50+ 
     51+config BCMA_NFLASH 
     52+       bool 
     53+       depends on BCMA_DRIVER_MIPS 
     54+       default y 
     55+ 
    1656+config BCMA_DRIVER_GMAC_CMN 
    1757+       bool "BCMA Broadcom GBIT MAC COMMON core driver" 
     
    2868--- a/drivers/bcma/Makefile 
    2969+++ b/drivers/bcma/Makefile 
    30 @@ -3,6 +3,7 @@ bcma-y                                  += driver_chipcommon.o driver 
     70@@ -1,8 +1,11 @@ 
     71 bcma-y                                 += main.o scan.o core.o sprom.o 
     72 bcma-y                                 += driver_chipcommon.o driver_chipcommon_pmu.o 
     73+bcma-$(CONFIG_BCMA_SFLASH)             += driver_chipcommon_sflash.o 
     74+bcma-$(CONFIG_BCMA_NFLASH)             += driver_chipcommon_nflash.o 
    3175 bcma-y                                 += driver_pci.o 
    3276 bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     
    59103 int __init bcma_bus_early_register(struct bcma_bus *bus, 
    60104                                   struct bcma_device *core_cc, 
    61 @@ -48,8 +57,12 @@ extern int __init bcma_host_pci_init(voi 
     105@@ -42,14 +51,42 @@ void bcma_chipco_serial_init(struct bcma 
     106 u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
     107 u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
     108  
     109+#ifdef CONFIG_BCMA_SFLASH 
     110+/* driver_chipcommon_sflash.c */ 
     111+int bcma_sflash_init(struct bcma_drv_cc *cc); 
     112+extern struct platform_device bcma_sflash_dev; 
     113+#else 
     114+static inline int bcma_sflash_init(struct bcma_drv_cc *cc) 
     115+{ 
     116+       bcma_err(cc->core->bus, "Serial flash not supported\n"); 
     117+       return 0; 
     118+} 
     119+#endif /* CONFIG_BCMA_SFLASH */ 
     120+ 
     121+#ifdef CONFIG_BCMA_NFLASH 
     122+/* driver_chipcommon_nflash.c */ 
     123+int bcma_nflash_init(struct bcma_drv_cc *cc); 
     124+extern struct platform_device bcma_nflash_dev; 
     125+#else 
     126+static inline int bcma_nflash_init(struct bcma_drv_cc *cc) 
     127+{ 
     128+       bcma_err(cc->core->bus, "NAND flash not supported\n"); 
     129+       return 0; 
     130+} 
     131+#endif /* CONFIG_BCMA_NFLASH */ 
     132+ 
     133 #ifdef CONFIG_BCMA_HOST_PCI 
     134 /* host_pci.c */ 
     135 extern int __init bcma_host_pci_init(void); 
    62136 extern void __exit bcma_host_pci_exit(void); 
    63137 #endif /* CONFIG_BCMA_HOST_PCI */ 
     
    83157 } 
    84158 EXPORT_SYMBOL_GPL(bcma_core_disable); 
     159@@ -64,7 +65,7 @@ void bcma_core_set_clockmode(struct bcma 
     160        switch (clkmode) { 
     161        case BCMA_CLKMODE_FAST: 
     162                bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); 
     163-               udelay(64); 
     164+               usleep_range(64, 300); 
     165                for (i = 0; i < 1500; i++) { 
     166                        if (bcma_read32(core, BCMA_CLKCTLST) & 
     167                            BCMA_CLKCTLST_HAVEHT) { 
    85168@@ -74,10 +75,10 @@ void bcma_core_set_clockmode(struct bcma 
    86169                        udelay(10); 
     
    121204--- a/drivers/bcma/driver_chipcommon.c 
    122205+++ b/drivers/bcma/driver_chipcommon.c 
    123 @@ -44,7 +44,7 @@ void bcma_core_chipcommon_init(struct bc 
     206@@ -22,12 +22,9 @@ static inline u32 bcma_cc_write32_masked 
     207        return value; 
     208 } 
     209  
     210-void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) 
     211+void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc) 
     212 { 
     213-       u32 leddc_on = 10; 
     214-       u32 leddc_off = 90; 
     215- 
     216-       if (cc->setup_done) 
     217+       if (cc->early_setup_done) 
     218                return; 
     219  
     220        if (cc->core->id.rev >= 11) 
     221@@ -36,6 +33,22 @@ void bcma_core_chipcommon_init(struct bc 
     222        if (cc->core->id.rev >= 35) 
     223                cc->capabilities_ext = bcma_cc_read32(cc, BCMA_CC_CAP_EXT); 
     224  
     225+       if (cc->capabilities & BCMA_CC_CAP_PMU) 
     226+               bcma_pmu_early_init(cc); 
     227+ 
     228+       cc->early_setup_done = true; 
     229+} 
     230+ 
     231+void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) 
     232+{ 
     233+       u32 leddc_on = 10; 
     234+       u32 leddc_off = 90; 
     235+ 
     236+       if (cc->setup_done) 
     237+               return; 
     238+ 
     239+       bcma_core_chipcommon_early_init(cc); 
     240+ 
     241        if (cc->core->id.rev >= 20) { 
     242                bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0); 
     243                bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0); 
     244@@ -44,7 +57,7 @@ void bcma_core_chipcommon_init(struct bc 
    124245        if (cc->capabilities & BCMA_CC_CAP_PMU) 
    125246                bcma_pmu_init(cc); 
     
    130251        if (cc->core->id.rev >= 16) { 
    131252                if (cc->core->bus->sprom.leddc_on_time && 
    132 @@ -137,8 +137,7 @@ void bcma_chipco_serial_init(struct bcma 
     253@@ -137,8 +150,7 @@ void bcma_chipco_serial_init(struct bcma 
    133254                                       | BCMA_CC_CORECTL_UARTCLKEN); 
    134255                } 
     
    140261        } 
    141262  
     263--- /dev/null 
     264+++ b/drivers/bcma/driver_chipcommon_nflash.c 
     265@@ -0,0 +1,44 @@ 
     266+/* 
     267+ * Broadcom specific AMBA 
     268+ * ChipCommon NAND flash interface 
     269+ * 
     270+ * Licensed under the GNU/GPL. See COPYING for details. 
     271+ */ 
     272+ 
     273+#include <linux/platform_device.h> 
     274+#include <linux/bcma/bcma.h> 
     275+ 
     276+#include "bcma_private.h" 
     277+ 
     278+struct platform_device bcma_nflash_dev = { 
     279+       .name           = "bcma_nflash", 
     280+       .num_resources  = 0, 
     281+}; 
     282+ 
     283+/* Initialize NAND flash access */ 
     284+int bcma_nflash_init(struct bcma_drv_cc *cc) 
     285+{ 
     286+       struct bcma_bus *bus = cc->core->bus; 
     287+ 
     288+       if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 && 
     289+           cc->core->id.rev != 0x38) { 
     290+               bcma_err(bus, "NAND flash on unsupported board!\n"); 
     291+               return -ENOTSUPP; 
     292+       } 
     293+ 
     294+       if (!(cc->capabilities & BCMA_CC_CAP_NFLASH)) { 
     295+               bcma_err(bus, "NAND flash not present according to ChipCommon\n"); 
     296+               return -ENODEV; 
     297+       } 
     298+ 
     299+       cc->nflash.present = true; 
     300+       if (cc->core->id.rev == 38 && 
     301+           (cc->status & BCMA_CC_CHIPST_5357_NAND_BOOT)) 
     302+               cc->nflash.boot = true; 
     303+ 
     304+       /* Prepare platform device, but don't register it yet. It's too early, 
     305+        * malloc (required by device_private_init) is not available yet. */ 
     306+       bcma_nflash_dev.dev.platform_data = &cc->nflash; 
     307+ 
     308+       return 0; 
     309+} 
    142310--- a/drivers/bcma/driver_chipcommon_pmu.c 
    143311+++ b/drivers/bcma/driver_chipcommon_pmu.c 
     
    194362  
    195363        /* Set the resource masks. */ 
    196 @@ -93,22 +75,9 @@ static void bcma_pmu_resources_init(stru 
     364@@ -93,22 +75,12 @@ static void bcma_pmu_resources_init(stru 
    197365                bcma_cc_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk); 
    198366        if (max_msk) 
     
    214382-                       "0x%04X\n", bus->chipinfo.id); 
    215383-       } 
    216 +       /* Add some delay; allow resources to come up and settle. */ 
     384+       /* 
     385+        * Add some delay; allow resources to come up and settle. 
     386+        * Delay is required for SoC (early init). 
     387+        */ 
    217388+       mdelay(2); 
    218389 } 
    219390  
    220391 /* Disable to allow reading SPROM. Don't know the adventages of enabling it. */ 
    221 @@ -122,8 +91,11 @@ void bcma_chipco_bcm4331_ext_pa_lines_ct 
     392@@ -122,51 +94,69 @@ void bcma_chipco_bcm4331_ext_pa_lines_ct 
    222393                val |= BCMA_CHIPCTL_4331_EXTPA_EN; 
    223394                if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11) 
     
    231402        } 
    232403        bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val); 
    233 @@ -134,26 +106,38 @@ void bcma_pmu_workarounds(struct bcma_dr 
     404 } 
     405  
     406-void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
     407+static void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
     408 { 
    234409        struct bcma_bus *bus = cc->core->bus; 
    235410  
     
    241416+                  register bit 1 */ 
    242417+               bcma_chipco_chipctl_maskset(cc, 0, 
    243 +                                           BCMA_CCTRL_4313_12MA_LED_DRIVE, 
     418+                                           ~BCMA_CCTRL_4313_12MA_LED_DRIVE, 
    244419+                                           BCMA_CCTRL_4313_12MA_LED_DRIVE); 
    245420                break; 
     
    261436-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x00F000F0); 
    262437+                       bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL, 
    263 +                                         BCMA_CCTRL_43224_GPIO_TOGGLE, 
     438+                                         ~BCMA_CCTRL_43224_GPIO_TOGGLE, 
    264439+                                         BCMA_CCTRL_43224_GPIO_TOGGLE); 
    265440+                       bcma_chipco_chipctl_maskset(cc, 0, 
    266 +                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 
     441+                                                   ~BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 
    267442+                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE); 
    268443                } else { 
    269444-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0xF0); 
    270445+                       bcma_chipco_chipctl_maskset(cc, 0, 
    271 +                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 
     446+                                                   ~BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 
    272447+                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE); 
    273448                } 
     
    283458 } 
    284459  
    285 @@ -164,8 +148,8 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
     460-void bcma_pmu_init(struct bcma_drv_cc *cc) 
     461+void bcma_pmu_early_init(struct bcma_drv_cc *cc) 
     462 { 
     463        u32 pmucap; 
     464  
    286465        pmucap = bcma_cc_read32(cc, BCMA_CC_PMU_CAP); 
    287466        cc->pmu.rev = (pmucap & BCMA_CC_PMU_CAP_REVISION); 
     
    291470+       bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n", 
    292471+                  cc->pmu.rev, pmucap); 
    293   
     472+} 
     473  
     474+void bcma_pmu_init(struct bcma_drv_cc *cc) 
     475+{ 
    294476        if (cc->pmu.rev == 1) 
    295477                bcma_cc_mask32(cc, BCMA_CC_PMU_CTL, 
    296 @@ -174,12 +158,7 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
     478                              ~BCMA_CC_PMU_CTL_NOILPONW); 
     479@@ -174,12 +164,7 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
    297480                bcma_cc_set32(cc, BCMA_CC_PMU_CTL, 
    298481                             BCMA_CC_PMU_CTL_NOILPONW); 
     
    307490 } 
    308491  
    309 @@ -188,23 +167,22 @@ u32 bcma_pmu_alp_clock(struct bcma_drv_c 
     492@@ -188,23 +173,22 @@ u32 bcma_pmu_alp_clock(struct bcma_drv_c 
    310493        struct bcma_bus *bus = cc->core->bus; 
    311494  
     
    342525        return BCMA_CC_PMU_ALP_CLOCK; 
    343526 } 
    344 @@ -221,7 +199,8 @@ static u32 bcma_pmu_clock(struct bcma_dr 
     527@@ -221,7 +205,8 @@ static u32 bcma_pmu_clock(struct bcma_dr 
    345528  
    346529        BUG_ON(!m || m > 4); 
     
    352535                tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT); 
    353536                if (tmp & 0x40000) 
    354 @@ -247,33 +226,62 @@ static u32 bcma_pmu_clock(struct bcma_dr 
     537@@ -247,33 +232,62 @@ static u32 bcma_pmu_clock(struct bcma_dr 
    355538        return (fc / div) * 1000000; 
    356539 } 
     
    387570+ 
    388571 /* query bus clock frequency for PMU-enabled chipcommon */ 
    389  u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     572-u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     573+static u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
    390574 { 
    391575        struct bcma_bus *bus = cc->core->bus; 
     
    428612        return BCMA_CC_PMU_HT_CLOCK; 
    429613 } 
    430 @@ -283,17 +291,21 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
     614@@ -283,17 +297,21 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
    431615 { 
    432616        struct bcma_bus *bus = cc->core->bus; 
     
    454638                        break; 
    455639                default: 
    456 @@ -301,10 +313,188 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
     640@@ -301,10 +319,188 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
    457641                        break; 
    458642                } 
     
    646830+EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate); 
    647831--- /dev/null 
     832+++ b/drivers/bcma/driver_chipcommon_sflash.c 
     833@@ -0,0 +1,165 @@ 
     834+/* 
     835+ * Broadcom specific AMBA 
     836+ * ChipCommon serial flash interface 
     837+ * 
     838+ * Licensed under the GNU/GPL. See COPYING for details. 
     839+ */ 
     840+ 
     841+#include <linux/platform_device.h> 
     842+#include <linux/bcma/bcma.h> 
     843+ 
     844+#include "bcma_private.h" 
     845+ 
     846+static struct resource bcma_sflash_resource = { 
     847+       .name   = "bcma_sflash", 
     848+       .start  = BCMA_SOC_FLASH2, 
     849+       .end    = 0, 
     850+       .flags  = IORESOURCE_MEM | IORESOURCE_READONLY, 
     851+}; 
     852+ 
     853+struct platform_device bcma_sflash_dev = { 
     854+       .name           = "bcma_sflash", 
     855+       .resource       = &bcma_sflash_resource, 
     856+       .num_resources  = 1, 
     857+}; 
     858+ 
     859+struct bcma_sflash_tbl_e { 
     860+       char *name; 
     861+       u32 id; 
     862+       u32 blocksize; 
     863+       u16 numblocks; 
     864+}; 
     865+ 
     866+static struct bcma_sflash_tbl_e bcma_sflash_st_tbl[] = { 
     867+       { "M25P20", 0x11, 0x10000, 4, }, 
     868+       { "M25P40", 0x12, 0x10000, 8, }, 
     869+ 
     870+       { "M25P16", 0x14, 0x10000, 32, }, 
     871+       { "M25P32", 0x14, 0x10000, 64, }, 
     872+       { "M25P64", 0x16, 0x10000, 128, }, 
     873+       { "M25FL128", 0x17, 0x10000, 256, }, 
     874+       { 0 }, 
     875+}; 
     876+ 
     877+static struct bcma_sflash_tbl_e bcma_sflash_sst_tbl[] = { 
     878+       { "SST25WF512", 1, 0x1000, 16, }, 
     879+       { "SST25VF512", 0x48, 0x1000, 16, }, 
     880+       { "SST25WF010", 2, 0x1000, 32, }, 
     881+       { "SST25VF010", 0x49, 0x1000, 32, }, 
     882+       { "SST25WF020", 3, 0x1000, 64, }, 
     883+       { "SST25VF020", 0x43, 0x1000, 64, }, 
     884+       { "SST25WF040", 4, 0x1000, 128, }, 
     885+       { "SST25VF040", 0x44, 0x1000, 128, }, 
     886+       { "SST25VF040B", 0x8d, 0x1000, 128, }, 
     887+       { "SST25WF080", 5, 0x1000, 256, }, 
     888+       { "SST25VF080B", 0x8e, 0x1000, 256, }, 
     889+       { "SST25VF016", 0x41, 0x1000, 512, }, 
     890+       { "SST25VF032", 0x4a, 0x1000, 1024, }, 
     891+       { "SST25VF064", 0x4b, 0x1000, 2048, }, 
     892+       { 0 }, 
     893+}; 
     894+ 
     895+static struct bcma_sflash_tbl_e bcma_sflash_at_tbl[] = { 
     896+       { "AT45DB011", 0xc, 256, 512, }, 
     897+       { "AT45DB021", 0x14, 256, 1024, }, 
     898+       { "AT45DB041", 0x1c, 256, 2048, }, 
     899+       { "AT45DB081", 0x24, 256, 4096, }, 
     900+       { "AT45DB161", 0x2c, 512, 4096, }, 
     901+       { "AT45DB321", 0x34, 512, 8192, }, 
     902+       { "AT45DB642", 0x3c, 1024, 8192, }, 
     903+       { 0 }, 
     904+}; 
     905+ 
     906+static void bcma_sflash_cmd(struct bcma_drv_cc *cc, u32 opcode) 
     907+{ 
     908+       int i; 
     909+       bcma_cc_write32(cc, BCMA_CC_FLASHCTL, 
     910+                       BCMA_CC_FLASHCTL_START | opcode); 
     911+       for (i = 0; i < 1000; i++) { 
     912+               if (!(bcma_cc_read32(cc, BCMA_CC_FLASHCTL) & 
     913+                     BCMA_CC_FLASHCTL_BUSY)) 
     914+                       return; 
     915+               cpu_relax(); 
     916+       } 
     917+       bcma_err(cc->core->bus, "SFLASH control command failed (timeout)!\n"); 
     918+} 
     919+ 
     920+/* Initialize serial flash access */ 
     921+int bcma_sflash_init(struct bcma_drv_cc *cc) 
     922+{ 
     923+       struct bcma_bus *bus = cc->core->bus; 
     924+       struct bcma_sflash *sflash = &cc->sflash; 
     925+       struct bcma_sflash_tbl_e *e; 
     926+       u32 id, id2; 
     927+ 
     928+       switch (cc->capabilities & BCMA_CC_CAP_FLASHT) { 
     929+       case BCMA_CC_FLASHT_STSER: 
     930+               bcma_sflash_cmd(cc, BCMA_CC_FLASHCTL_ST_DP); 
     931+ 
     932+               bcma_cc_write32(cc, BCMA_CC_FLASHADDR, 0); 
     933+               bcma_sflash_cmd(cc, BCMA_CC_FLASHCTL_ST_RES); 
     934+               id = bcma_cc_read32(cc, BCMA_CC_FLASHDATA); 
     935+ 
     936+               bcma_cc_write32(cc, BCMA_CC_FLASHADDR, 1); 
     937+               bcma_sflash_cmd(cc, BCMA_CC_FLASHCTL_ST_RES); 
     938+               id2 = bcma_cc_read32(cc, BCMA_CC_FLASHDATA); 
     939+ 
     940+               switch (id) { 
     941+               case 0xbf: 
     942+                       for (e = bcma_sflash_sst_tbl; e->name; e++) { 
     943+                               if (e->id == id2) 
     944+                                       break; 
     945+                       } 
     946+                       break; 
     947+               case 0x13: 
     948+                       return -ENOTSUPP; 
     949+               default: 
     950+                       for (e = bcma_sflash_st_tbl; e->name; e++) { 
     951+                               if (e->id == id) 
     952+                                       break; 
     953+                       } 
     954+                       break; 
     955+               } 
     956+               if (!e->name) { 
     957+                       bcma_err(bus, "Unsupported ST serial flash (id: 0x%X, id2: 0x%X)\n", id, id2); 
     958+                       return -ENOTSUPP; 
     959+               } 
     960+ 
     961+               break; 
     962+       case BCMA_CC_FLASHT_ATSER: 
     963+               bcma_sflash_cmd(cc, BCMA_CC_FLASHCTL_AT_STATUS); 
     964+               id = bcma_cc_read32(cc, BCMA_CC_FLASHDATA) & 0x3c; 
     965+ 
     966+               for (e = bcma_sflash_at_tbl; e->name; e++) { 
     967+                       if (e->id == id) 
     968+                               break; 
     969+               } 
     970+               if (!e->name) { 
     971+                       bcma_err(bus, "Unsupported Atmel serial flash (id: 0x%X)\n", id); 
     972+                       return -ENOTSUPP; 
     973+               } 
     974+ 
     975+               break; 
     976+       default: 
     977+               bcma_err(bus, "Unsupported flash type\n"); 
     978+               return -ENOTSUPP; 
     979+       } 
     980+ 
     981+       sflash->window = BCMA_SOC_FLASH2; 
     982+       sflash->blocksize = e->blocksize; 
     983+       sflash->numblocks = e->numblocks; 
     984+       sflash->size = sflash->blocksize * sflash->numblocks; 
     985+       sflash->present = true; 
     986+ 
     987+       bcma_info(bus, "Found %s serial flash (size: %dKiB, blocksize: 0x%X, blocks: %d)\n", 
     988+                 e->name, sflash->size / 1024, sflash->blocksize, 
     989+                 sflash->numblocks); 
     990+ 
     991+       /* Prepare platform device, but don't register it yet. It's too early, 
     992+        * malloc (required by device_private_init) is not available yet. */ 
     993+       bcma_sflash_dev.resource[0].end = bcma_sflash_dev.resource[0].start + 
     994+                                         sflash->size; 
     995+       bcma_sflash_dev.dev.platform_data = sflash; 
     996+ 
     997+       return 0; 
     998+} 
     999--- /dev/null 
    6481000+++ b/drivers/bcma/driver_gmac_cmn.c 
    6491001@@ -0,0 +1,14 @@ 
     
    6841036               dev->id.id == BCMA_CORE_USB20_HOST; 
    6851037 } 
     1038@@ -131,7 +131,7 @@ static void bcma_core_mips_set_irq(struc 
     1039                        /* backplane irq line is in use, find out who uses 
     1040                         * it and set user to irq 0 
     1041                         */ 
     1042-                       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1043+                       list_for_each_entry(core, &bus->cores, list) { 
     1044                                if ((1 << bcma_core_mips_irqflag(core)) == 
     1045                                    oldirqflag) { 
     1046                                        bcma_core_mips_set_irq(core, 0); 
    6861047@@ -143,8 +143,8 @@ static void bcma_core_mips_set_irq(struc 
    6871048                             1 << irqflag); 
     
    6951056  
    6961057 static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) 
     1058@@ -161,7 +161,7 @@ static void bcma_core_mips_dump_irq(stru 
     1059 { 
     1060        struct bcma_device *core; 
     1061  
     1062-       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1063+       list_for_each_entry(core, &bus->cores, list) { 
     1064                bcma_core_mips_print_irq(core, bcma_core_mips_irq(core)); 
     1065        } 
     1066 } 
    6971067@@ -173,7 +173,7 @@ u32 bcma_cpu_clock(struct bcma_drv_mips 
    6981068        if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU) 
     
    7041074 } 
    7051075 EXPORT_SYMBOL(bcma_cpu_clock); 
    706 @@ -185,10 +185,10 @@ static void bcma_core_mips_flash_detect( 
    707         switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
     1076@@ -181,26 +181,50 @@ EXPORT_SYMBOL(bcma_cpu_clock); 
     1077 static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore) 
     1078 { 
     1079        struct bcma_bus *bus = mcore->core->bus; 
     1080+       struct bcma_drv_cc *cc = &bus->drv_cc; 
     1081  
     1082-       switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
     1083+       switch (cc->capabilities & BCMA_CC_CAP_FLASHT) { 
    7081084        case BCMA_CC_FLASHT_STSER: 
    7091085        case BCMA_CC_FLASHT_ATSER: 
    7101086-               pr_err("Serial flash not supported.\n"); 
    711 +               bcma_err(bus, "Serial flash not supported.\n"); 
     1087+               bcma_debug(bus, "Found serial flash\n"); 
     1088+               bcma_sflash_init(cc); 
    7121089                break; 
    7131090        case BCMA_CC_FLASHT_PARA: 
    7141091-               pr_info("found parallel flash.\n"); 
    715 +               bcma_info(bus, "found parallel flash.\n"); 
    716                 bus->drv_cc.pflash.window = 0x1c000000; 
    717                 bus->drv_cc.pflash.window_size = 0x02000000; 
    718   
    719 @@ -199,7 +199,7 @@ static void bcma_core_mips_flash_detect( 
    720                         bus->drv_cc.pflash.buswidth = 2; 
     1092-               bus->drv_cc.pflash.window = 0x1c000000; 
     1093-               bus->drv_cc.pflash.window_size = 0x02000000; 
     1094+               bcma_debug(bus, "Found parallel flash\n"); 
     1095+               cc->pflash.present = true; 
     1096+               cc->pflash.window = BCMA_SOC_FLASH2; 
     1097+               cc->pflash.window_size = BCMA_SOC_FLASH2_SZ; 
     1098  
     1099-               if ((bcma_read32(bus->drv_cc.core, BCMA_CC_FLASH_CFG) & 
     1100+               if ((bcma_read32(cc->core, BCMA_CC_FLASH_CFG) & 
     1101                     BCMA_CC_FLASH_CFG_DS) == 0) 
     1102-                       bus->drv_cc.pflash.buswidth = 1; 
     1103+                       cc->pflash.buswidth = 1; 
     1104                else 
     1105-                       bus->drv_cc.pflash.buswidth = 2; 
     1106+                       cc->pflash.buswidth = 2; 
    7211107                break; 
    7221108        default: 
    7231109-               pr_err("flash not supported.\n"); 
    724 +               bcma_err(bus, "flash not supported.\n"); 
     1110+               bcma_err(bus, "Flash type not supported\n"); 
    7251111        } 
    726  } 
    727   
    728 @@ -209,7 +209,7 @@ void bcma_core_mips_init(struct bcma_drv 
     1112+ 
     1113+       if (cc->core->id.rev == 38 || 
     1114+           bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) { 
     1115+               if (cc->capabilities & BCMA_CC_CAP_NFLASH) { 
     1116+                       bcma_debug(bus, "Found NAND flash\n"); 
     1117+                       bcma_nflash_init(cc); 
     1118+               } 
     1119+       } 
     1120+} 
     1121+ 
     1122+void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) 
     1123+{ 
     1124+       struct bcma_bus *bus = mcore->core->bus; 
     1125+ 
     1126+       if (mcore->early_setup_done) 
     1127+               return; 
     1128+ 
     1129+       bcma_chipco_serial_init(&bus->drv_cc); 
     1130+       bcma_core_mips_flash_detect(mcore); 
     1131+ 
     1132+       mcore->early_setup_done = true; 
     1133 } 
     1134  
     1135 void bcma_core_mips_init(struct bcma_drv_mips *mcore) 
     1136@@ -209,13 +233,17 @@ void bcma_core_mips_init(struct bcma_drv 
    7291137        struct bcma_device *core; 
    7301138        bus = mcore->core->bus; 
    7311139  
    7321140-       pr_info("Initializing MIPS core...\n"); 
     1141+       if (mcore->setup_done) 
     1142+               return; 
     1143+ 
    7331144+       bcma_info(bus, "Initializing MIPS core...\n"); 
    734   
    735         if (!mcore->setup_done) 
    736                 mcore->assigned_irqs = 1; 
    737 @@ -244,7 +244,7 @@ void bcma_core_mips_init(struct bcma_drv 
     1145+ 
     1146+       bcma_core_mips_early_init(mcore); 
     1147  
     1148-       if (!mcore->setup_done) 
     1149-               mcore->assigned_irqs = 1; 
     1150+       mcore->assigned_irqs = 1; 
     1151  
     1152        /* Assign IRQs to all cores on the bus */ 
     1153-       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1154+       list_for_each_entry(core, &bus->cores, list) { 
     1155                int mips_irq; 
     1156                if (core->irq) 
     1157                        continue; 
     1158@@ -244,13 +272,8 @@ void bcma_core_mips_init(struct bcma_drv 
    7381159                        break; 
    7391160                } 
     
    7431164        bcma_core_mips_dump_irq(bus); 
    7441165  
    745         if (mcore->setup_done) 
     1166-       if (mcore->setup_done) 
     1167-               return; 
     1168- 
     1169-       bcma_chipco_serial_init(&bus->drv_cc); 
     1170-       bcma_core_mips_flash_detect(mcore); 
     1171        mcore->setup_done = true; 
     1172 } 
    7461173--- a/drivers/bcma/driver_pci.c 
    7471174+++ b/drivers/bcma/driver_pci.c 
     
    7571184  * Licensed under the GNU/GPL. See COPYING for details. 
    7581185  */ 
    759 @@ -16,40 +17,39 @@ 
     1186@@ -16,120 +17,124 @@ 
    7601187  * R/W ops. 
    7611188  **************************************************/ 
     
    8131240+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) 
    8141241                        break; 
    815                 msleep(1); 
     1242-               msleep(1); 
     1243+               usleep_range(1000, 2000); 
    8161244        } 
    817 @@ -57,79 +57,84 @@ static void bcma_pcie_mdio_set_phy(struc 
     1245 } 
    8181246  
    8191247 static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address) 
     
    8691297                        break; 
    8701298                } 
    871                 msleep(1); 
     1299-               msleep(1); 
     1300+               usleep_range(1000, 2000); 
    8721301        } 
    8731302-       pcicore_write32(pc, mdio_control, 0); 
     
    9241353+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) 
    9251354                        break; 
    926                 msleep(1); 
     1355-               msleep(1); 
     1356+               usleep_range(1000, 2000); 
    9271357        } 
    9281358-       pcicore_write32(pc, mdio_control, 0); 
     
    11041534--- a/drivers/bcma/driver_pci_host.c 
    11051535+++ b/drivers/bcma/driver_pci_host.c 
    1106 @@ -2,13 +2,592 @@ 
     1536@@ -2,13 +2,596 @@ 
    11071537  * Broadcom specific AMBA 
    11081538  * PCI Core in hostmode 
     
    11401570+           chipid_top != 0x5300) 
    11411571+               return false; 
    1142 + 
    1143 +       if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) { 
    1144 +               bcma_info(bus, "This PCI core is disabled and not working\n"); 
    1145 +               return false; 
    1146 +       } 
    11471572+ 
    11481573+       bcma_core_enable(pc->core, 0); 
     
    15041929+       bcma_info(bus, "PCIEcore in host mode found\n"); 
    15051930+ 
     1931+       if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) { 
     1932+               bcma_info(bus, "This PCIE core is disabled and not working\n"); 
     1933+               return; 
     1934+       } 
     1935+ 
    15061936+       pc_host = kzalloc(sizeof(*pc_host), GFP_KERNEL); 
    15071937+       if (!pc_host)  { 
     
    15331963+ 
    15341964+       /* Reset RC */ 
    1535 +       udelay(3000); 
     1965+       usleep_range(3000, 5000); 
    15361966+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST_OE); 
    1537 +       udelay(1000); 
     1967+       usleep_range(1000, 2000); 
    15381968+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST | 
    15391969+                       BCMA_CORE_PCI_CTL_RST_OE); 
     
    15601990+                       pc_host->mem_resource.end = BCMA_SOC_PCI_MEM + 
    15611991+                                                   BCMA_SOC_PCI_MEM_SZ - 1; 
     1992+                       pc_host->io_resource.start = 0x100; 
     1993+                       pc_host->io_resource.end = 0x47F; 
    15621994+                       pci_membase_1G = BCMA_SOC_PCIE_DMA_H32; 
    15631995+                       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0, 
     
    15671999+                       pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM + 
    15682000+                                                   BCMA_SOC_PCI_MEM_SZ - 1; 
     2001+                       pc_host->io_resource.start = 0x480; 
     2002+                       pc_host->io_resource.end = 0x7FF; 
    15692003+                       pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32; 
    15702004+                       pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG; 
     
    15892023+        * devices. 
    15902024+        */ 
    1591 +       udelay(100000); 
     2025+       msleep(100); 
    15922026+ 
    15932027+       bcma_core_pci_enable_crs(pc); 
     
    16092043+       /* Give some time to the PCI controller to configure itself with the new 
    16102044+        * values. Not waiting at this point causes crashes of the machine. */ 
    1611 +       mdelay(10); 
     2045+       usleep_range(10000, 15000); 
    16122046+       register_pci_controller(&pc_host->pci_controller); 
    16132047+       return; 
     
    17102144  
    17112145 /* Provides access to the requested core. Returns base offset that has to be 
    1712 @@ -154,8 +154,8 @@ const struct bcma_host_ops bcma_host_pci 
     2146@@ -77,8 +77,8 @@ static void bcma_host_pci_write32(struct 
     2147 } 
     2148  
     2149 #ifdef CONFIG_BCMA_BLOCKIO 
     2150-void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, 
     2151-                             size_t count, u16 offset, u8 reg_width) 
     2152+static void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, 
     2153+                                    size_t count, u16 offset, u8 reg_width) 
     2154 { 
     2155        void __iomem *addr = core->bus->mmio + offset; 
     2156        if (core->bus->mapped_core != core) 
     2157@@ -100,8 +100,9 @@ void bcma_host_pci_block_read(struct bcm 
     2158        } 
     2159 } 
     2160  
     2161-void bcma_host_pci_block_write(struct bcma_device *core, const void *buffer, 
     2162-                              size_t count, u16 offset, u8 reg_width) 
     2163+static void bcma_host_pci_block_write(struct bcma_device *core, 
     2164+                                     const void *buffer, size_t count, 
     2165+                                     u16 offset, u8 reg_width) 
     2166 { 
     2167        void __iomem *addr = core->bus->mmio + offset; 
     2168        if (core->bus->mapped_core != core) 
     2169@@ -139,7 +140,7 @@ static void bcma_host_pci_awrite32(struc 
     2170        iowrite32(value, core->bus->mmio + (1 * BCMA_CORE_SIZE) + offset); 
     2171 } 
     2172  
     2173-const struct bcma_host_ops bcma_host_pci_ops = { 
     2174+static const struct bcma_host_ops bcma_host_pci_ops = { 
     2175        .read8          = bcma_host_pci_read8, 
     2176        .read16         = bcma_host_pci_read16, 
     2177        .read32         = bcma_host_pci_read32, 
     2178@@ -154,8 +155,8 @@ const struct bcma_host_ops bcma_host_pci 
    17132179        .awrite32       = bcma_host_pci_awrite32, 
    17142180 }; 
     
    17212187        struct bcma_bus *bus; 
    17222188        int err = -ENOMEM; 
    1723 @@ -188,7 +188,7 @@ static int bcma_host_pci_probe(struct pc 
     2189@@ -188,7 +189,7 @@ static int bcma_host_pci_probe(struct pc 
    17242190  
    17252191        /* SSB needed additional powering up, do we have any AMBA PCI cards? */ 
     
    17302196        /* Map MMIO */ 
    17312197        err = -ENOMEM; 
    1732 @@ -201,6 +201,9 @@ static int bcma_host_pci_probe(struct pc 
     2198@@ -201,6 +202,9 @@ static int bcma_host_pci_probe(struct pc 
    17332199        bus->hosttype = BCMA_HOSTTYPE_PCI; 
    17342200        bus->ops = &bcma_host_pci_ops; 
     
    17402206        err = bcma_bus_register(bus); 
    17412207        if (err) 
    1742 @@ -222,7 +225,7 @@ err_kfree_bus: 
     2208@@ -222,7 +226,7 @@ err_kfree_bus: 
    17432209        return err; 
    17442210 } 
     
    17492215        struct bcma_bus *bus = pci_get_drvdata(dev); 
    17502216  
    1751 @@ -265,6 +268,7 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
     2217@@ -265,9 +269,12 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
    17522218  
    17532219 static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { 
     
    17572223        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, 
    17582224        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, 
    1759 @@ -277,7 +281,7 @@ static struct pci_driver bcma_pci_bridge 
     2225+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) }, 
     2226+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
     2227        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
     2228        { 0, }, 
     2229 }; 
     2230@@ -277,7 +284,7 @@ static struct pci_driver bcma_pci_bridge 
    17602231        .name = "bcma-pci-bridge", 
    17612232        .id_table = bcma_pci_bridge_tbl, 
     
    17662237 }; 
    17672238  
     2239--- a/drivers/bcma/host_soc.c 
     2240+++ b/drivers/bcma/host_soc.c 
     2241@@ -143,7 +143,7 @@ static void bcma_host_soc_awrite32(struc 
     2242        writel(value, core->io_wrap + offset); 
     2243 } 
     2244  
     2245-const struct bcma_host_ops bcma_host_soc_ops = { 
     2246+static const struct bcma_host_ops bcma_host_soc_ops = { 
     2247        .read8          = bcma_host_soc_read8, 
     2248        .read16         = bcma_host_soc_read16, 
     2249        .read32         = bcma_host_soc_read32, 
    17682250--- a/drivers/bcma/main.c 
    17692251+++ b/drivers/bcma/main.c 
    1770 @@ -13,6 +13,12 @@ 
     2252@@ -7,12 +7,19 @@ 
     2253  
     2254 #include "bcma_private.h" 
     2255 #include <linux/module.h> 
     2256+#include <linux/platform_device.h> 
     2257 #include <linux/bcma/bcma.h> 
     2258 #include <linux/slab.h> 
     2259  
    17712260 MODULE_DESCRIPTION("Broadcom's specific AMBA driver"); 
    17722261 MODULE_LICENSE("GPL"); 
     
    17812270 static int bcma_device_probe(struct device *dev); 
    17822271 static int bcma_device_remove(struct device *dev); 
    1783 @@ -55,7 +61,14 @@ static struct bus_type bcma_bus_type = { 
     2272@@ -55,7 +62,14 @@ static struct bus_type bcma_bus_type = { 
    17842273        .dev_attrs      = bcma_device_attrs, 
    17852274 }; 
     
    17972286        struct bcma_device *core; 
    17982287  
    1799 @@ -65,6 +78,7 @@ static struct bcma_device *bcma_find_cor 
     2288@@ -65,6 +79,19 @@ static struct bcma_device *bcma_find_cor 
    18002289        } 
    18012290        return NULL; 
    18022291 } 
    18032292+EXPORT_SYMBOL_GPL(bcma_find_core); 
     2293+ 
     2294+static struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid, 
     2295+                                              u8 unit) 
     2296+{ 
     2297+       struct bcma_device *core; 
     2298+ 
     2299+       list_for_each_entry(core, &bus->cores, list) { 
     2300+               if (core->id.id == coreid && core->core_unit == unit) 
     2301+                       return core; 
     2302+       } 
     2303+       return NULL; 
     2304+} 
    18042305  
    18052306 static void bcma_release_core_dev(struct device *dev) 
    18062307 { 
    1807 @@ -84,16 +98,18 @@ static int bcma_register_cores(struct bc 
     2308@@ -84,16 +111,18 @@ static int bcma_register_cores(struct bc 
    18082309        list_for_each_entry(core, &bus->cores, list) { 
    18092310                /* We support that cores ourself */ 
     
    18252326                switch (bus->hosttype) { 
    18262327                case BCMA_HOSTTYPE_PCI: 
    1827 @@ -111,8 +127,9 @@ static int bcma_register_cores(struct bc 
     2328@@ -111,41 +140,77 @@ static int bcma_register_cores(struct bc 
    18282329  
    18292330                err = device_register(&core->dev); 
     
    18372338                } 
    18382339                core->dev_registered = true; 
    1839 @@ -132,20 +149,24 @@ static void bcma_unregister_cores(struct 
     2340                dev_id++; 
     2341        } 
     2342  
     2343+#ifdef CONFIG_BCMA_SFLASH 
     2344+       if (bus->drv_cc.sflash.present) { 
     2345+               err = platform_device_register(&bcma_sflash_dev); 
     2346+               if (err) 
     2347+                       bcma_err(bus, "Error registering serial flash\n"); 
     2348+       } 
     2349+#endif 
     2350+ 
     2351+#ifdef CONFIG_BCMA_NFLASH 
     2352+       if (bus->drv_cc.nflash.present) { 
     2353+               err = platform_device_register(&bcma_nflash_dev); 
     2354+               if (err) 
     2355+                       bcma_err(bus, "Error registering NAND flash\n"); 
     2356+       } 
     2357+#endif 
     2358+ 
     2359        return 0; 
     2360 } 
     2361  
     2362 static void bcma_unregister_cores(struct bcma_bus *bus) 
     2363 { 
     2364-       struct bcma_device *core; 
     2365+       struct bcma_device *core, *tmp; 
     2366  
     2367-       list_for_each_entry(core, &bus->cores, list) { 
     2368+       list_for_each_entry_safe(core, tmp, &bus->cores, list) { 
     2369+               list_del(&core->list); 
     2370                if (core->dev_registered) 
     2371                        device_unregister(&core->dev); 
    18402372        } 
    18412373 } 
     
    18592391        } 
    18602392  
     2393+       /* Early init CC core */ 
     2394+       core = bcma_find_core(bus, bcma_cc_core_id(bus)); 
     2395+       if (core) { 
     2396+               bus->drv_cc.core = core; 
     2397+               bcma_core_chipcommon_early_init(&bus->drv_cc); 
     2398+       } 
     2399+ 
     2400+       /* Try to get SPROM */ 
     2401+       err = bcma_sprom_get(bus); 
     2402+       if (err == -ENOENT) { 
     2403+               bcma_err(bus, "No SPROM available\n"); 
     2404+       } else if (err) 
     2405+               bcma_err(bus, "Failed to get SPROM: %d\n", err); 
     2406+ 
    18612407        /* Init CC core */ 
    18622408-       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     
    18652411                bus->drv_cc.core = core; 
    18662412                bcma_core_chipcommon_init(&bus->drv_cc); 
    1867 @@ -165,17 +186,24 @@ int bcma_bus_register(struct bcma_bus *b 
    1868                 bcma_core_pci_init(&bus->drv_pci); 
     2413@@ -159,30 +224,47 @@ int bcma_bus_register(struct bcma_bus *b 
    18692414        } 
    18702415  
     2416        /* Init PCIE core */ 
     2417-       core = bcma_find_core(bus, BCMA_CORE_PCIE); 
     2418+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 0); 
     2419        if (core) { 
     2420-               bus->drv_pci.core = core; 
     2421-               bcma_core_pci_init(&bus->drv_pci); 
     2422+               bus->drv_pci[0].core = core; 
     2423+               bcma_core_pci_init(&bus->drv_pci[0]); 
     2424        } 
     2425  
     2426-       /* Try to get SPROM */ 
     2427-       err = bcma_sprom_get(bus); 
     2428-       if (err == -ENOENT) { 
     2429-               pr_err("No SPROM available\n"); 
     2430-       } else if (err) 
     2431-               pr_err("Failed to get SPROM: %d\n", err); 
     2432+       /* Init PCIE core */ 
     2433+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 1); 
     2434+       if (core) { 
     2435+               bus->drv_pci[1].core = core; 
     2436+               bcma_core_pci_init(&bus->drv_pci[1]); 
     2437+       } 
     2438+ 
    18712439+       /* Init GBIT MAC COMMON core */ 
    18722440+       core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     
    18752443+               bcma_core_gmac_cmn_init(&bus->drv_gmac_cmn); 
    18762444+       } 
    1877 + 
    1878         /* Try to get SPROM */ 
    1879         err = bcma_sprom_get(bus); 
    1880         if (err == -ENOENT) { 
    1881 -               pr_err("No SPROM available\n"); 
    1882 +               bcma_err(bus, "No SPROM available\n"); 
    1883         } else if (err) 
    1884 -               pr_err("Failed to get SPROM: %d\n", err); 
    1885 +               bcma_err(bus, "Failed to get SPROM: %d\n", err); 
    18862445  
    18872446        /* Register found cores */ 
     
    18932452        return 0; 
    18942453 } 
    1895 @@ -196,14 +224,14 @@ int __init bcma_bus_early_register(struc 
     2454  
     2455 void bcma_bus_unregister(struct bcma_bus *bus) 
     2456 { 
     2457+       struct bcma_device *cores[3]; 
     2458+ 
     2459+       cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     2460+       cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE); 
     2461+       cores[2] = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     2462+ 
     2463        bcma_unregister_cores(bus); 
     2464+ 
     2465+       kfree(cores[2]); 
     2466+       kfree(cores[1]); 
     2467+       kfree(cores[0]); 
     2468 } 
     2469  
     2470 int __init bcma_bus_early_register(struct bcma_bus *bus, 
     2471@@ -196,14 +278,14 @@ int __init bcma_bus_early_register(struc 
    18962472        bcma_init_bus(bus); 
    18972473  
     
    19102486        } 
    19112487  
    1912 @@ -215,12 +243,12 @@ int __init bcma_bus_early_register(struc 
     2488@@ -215,25 +297,25 @@ int __init bcma_bus_early_register(struc 
    19132489        /* Scan for mips core */ 
    19142490        err = bcma_bus_scan_early(bus, &match, core_mips); 
     
    19192495        } 
    19202496  
    1921         /* Init CC core */ 
     2497-       /* Init CC core */ 
    19222498-       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     2499+       /* Early init CC core */ 
    19232500+       core = bcma_find_core(bus, bcma_cc_core_id(bus)); 
    19242501        if (core) { 
    19252502                bus->drv_cc.core = core; 
    1926                 bcma_core_chipcommon_init(&bus->drv_cc); 
    1927 @@ -233,7 +261,7 @@ int __init bcma_bus_early_register(struc 
    1928                 bcma_core_mips_init(&bus->drv_mips); 
     2503-               bcma_core_chipcommon_init(&bus->drv_cc); 
     2504+               bcma_core_chipcommon_early_init(&bus->drv_cc); 
     2505        } 
     2506  
     2507-       /* Init MIPS core */ 
     2508+       /* Early init MIPS core */ 
     2509        core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     2510        if (core) { 
     2511                bus->drv_mips.core = core; 
     2512-               bcma_core_mips_init(&bus->drv_mips); 
     2513+               bcma_core_mips_early_init(&bus->drv_mips); 
    19292514        } 
    19302515  
     
    19342519        return 0; 
    19352520 } 
    1936 @@ -259,8 +287,7 @@ int bcma_bus_resume(struct bcma_bus *bus 
     2521@@ -259,8 +341,7 @@ int bcma_bus_resume(struct bcma_bus *bus 
    19372522        struct bcma_device *core; 
    19382523  
     
    20392624+       default: 
    20402625+               return "UNKNOWN"; 
    2041 +       } 
     2626        } 
    20422627+ 
    20432628+       for (i = 0; i < size; i++) { 
    20442629+               if (names[i].id == id->id) 
    20452630+                       return names[i].name; 
    2046         } 
     2631+       } 
    20472632+ 
    20482633        return "UNKNOWN"; 
     
    21452730 } 
    21462731  
    2147 @@ -392,6 +460,7 @@ int bcma_bus_scan(struct bcma_bus *bus) 
     2732@@ -392,9 +460,12 @@ int bcma_bus_scan(struct bcma_bus *bus) 
    21482733        bcma_scan_switch_core(bus, erombase); 
    21492734  
     
    21512736+               struct bcma_device *other_core; 
    21522737                struct bcma_device *core = kzalloc(sizeof(*core), GFP_KERNEL); 
    2153                 if (!core) 
    2154                         return -ENOMEM; 
    2155 @@ -414,14 +483,15 @@ int bcma_bus_scan(struct bcma_bus *bus) 
     2738-               if (!core) 
     2739-                       return -ENOMEM; 
     2740+               if (!core) { 
     2741+                       err = -ENOMEM; 
     2742+                       goto out; 
     2743+               } 
     2744                INIT_LIST_HEAD(&core->list); 
     2745                core->bus = bus; 
     2746  
     2747@@ -409,25 +480,28 @@ int bcma_bus_scan(struct bcma_bus *bus) 
     2748                        } else if (err == -ESPIPE) { 
     2749                                break; 
     2750                        } 
     2751-                       return err; 
     2752+                       goto out; 
     2753                } 
    21562754  
    21572755                core->core_index = core_num++; 
     
    21742772        } 
    21752773  
     2774+       err = 0; 
     2775+out: 
    21762776        if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
    2177 @@ -471,13 +541,12 @@ int __init bcma_bus_scan_early(struct bc 
     2777                iounmap(eromptr); 
     2778  
     2779-       return 0; 
     2780+       return err; 
     2781 } 
     2782  
     2783 int __init bcma_bus_scan_early(struct bcma_bus *bus, 
     2784@@ -467,21 +541,21 @@ int __init bcma_bus_scan_early(struct bc 
     2785                else if (err == -ESPIPE) 
     2786                        break; 
     2787                else if (err < 0) 
     2788-                       return err; 
     2789+                       goto out; 
    21782790  
    21792791                core->core_index = core_num++; 
     
    21942806                break; 
    21952807        } 
     2808  
     2809+out: 
     2810        if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2811                iounmap(eromptr); 
     2812  
    21962813--- a/drivers/bcma/scan.h 
    21972814+++ b/drivers/bcma/scan.h 
     
    23142931        bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 
    23152932                SSB_SPROM_REVISION_REV; 
    2316 @@ -137,102 +216,378 @@ static void bcma_sprom_extract_r8(struct 
     2933@@ -137,107 +216,390 @@ static void bcma_sprom_extract_r8(struct 
    23172934                *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v); 
    23182935        } 
     
    23202937-       bus->sprom.board_rev = sprom[SPOFF(SSB_SPROM8_BOARDREV)]; 
    23212938+       SPEX(board_rev, SSB_SPROM8_BOARDREV, ~0, 0); 
     2939+ 
     2940+       SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G0, 
     2941+            SSB_SPROM4_TXPID2G0_SHIFT); 
     2942+       SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G1, 
     2943+            SSB_SPROM4_TXPID2G1_SHIFT); 
     2944+       SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G2, 
     2945+            SSB_SPROM4_TXPID2G2_SHIFT); 
     2946+       SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G3, 
     2947+            SSB_SPROM4_TXPID2G3_SHIFT); 
     2948+ 
     2949+       SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL0, 
     2950+            SSB_SPROM4_TXPID5GL0_SHIFT); 
     2951+       SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL1, 
     2952+            SSB_SPROM4_TXPID5GL1_SHIFT); 
     2953+       SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL2, 
     2954+            SSB_SPROM4_TXPID5GL2_SHIFT); 
     2955+       SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL3, 
     2956+            SSB_SPROM4_TXPID5GL3_SHIFT); 
     2957+ 
     2958+       SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G0, 
     2959+            SSB_SPROM4_TXPID5G0_SHIFT); 
     2960+       SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G1, 
     2961+            SSB_SPROM4_TXPID5G1_SHIFT); 
     2962+       SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G2, 
     2963+            SSB_SPROM4_TXPID5G2_SHIFT); 
     2964+       SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G3, 
     2965+            SSB_SPROM4_TXPID5G3_SHIFT); 
     2966+ 
     2967+       SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH0, 
     2968+            SSB_SPROM4_TXPID5GH0_SHIFT); 
     2969+       SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH1, 
     2970+            SSB_SPROM4_TXPID5GH1_SHIFT); 
     2971+       SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH2, 
     2972+            SSB_SPROM4_TXPID5GH2_SHIFT); 
     2973+       SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH3, 
     2974+            SSB_SPROM4_TXPID5GH3_SHIFT); 
     2975+ 
     2976+       SPEX(boardflags_lo, SSB_SPROM8_BFLLO, ~0, 0); 
     2977+       SPEX(boardflags_hi, SSB_SPROM8_BFLHI, ~0, 0); 
     2978+       SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, ~0, 0); 
     2979+       SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, ~0, 0); 
     2980+ 
     2981+       SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); 
     2982+       SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); 
     2983+ 
     2984+       /* Extract cores power info info */ 
     2985+       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
     2986+               o = pwr_info_offset[i]; 
     2987+               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI, 
     2988+                       SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT); 
     2989+               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI, 
     2990+                       SSB_SPROM8_2G_MAXP, 0); 
     2991+ 
     2992+               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0); 
     2993+               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0); 
     2994+               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0); 
     2995+ 
     2996+               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI, 
     2997+                       SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT); 
     2998+               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI, 
     2999+                       SSB_SPROM8_5G_MAXP, 0); 
     3000+               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP, 
     3001+                       SSB_SPROM8_5GH_MAXP, 0); 
     3002+               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP, 
     3003+                       SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT); 
     3004+ 
     3005+               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0); 
     3006+               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0); 
     3007+               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0); 
     3008+               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0); 
     3009+               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0); 
     3010+               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0); 
     3011+               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0); 
     3012+               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0); 
     3013+               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0); 
     3014+       } 
    23223015  
    23233016-       bus->sprom.txpid2g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] & 
     
    23853078-       bus->sprom.fem.ghz5.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
    23863079-               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT; 
    2387 +       SPEX(txpid2g[0], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G0, 
    2388 +            SSB_SPROM4_TXPID2G0_SHIFT); 
    2389 +       SPEX(txpid2g[1], SSB_SPROM4_TXPID2G01, SSB_SPROM4_TXPID2G1, 
    2390 +            SSB_SPROM4_TXPID2G1_SHIFT); 
    2391 +       SPEX(txpid2g[2], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G2, 
    2392 +            SSB_SPROM4_TXPID2G2_SHIFT); 
    2393 +       SPEX(txpid2g[3], SSB_SPROM4_TXPID2G23, SSB_SPROM4_TXPID2G3, 
    2394 +            SSB_SPROM4_TXPID2G3_SHIFT); 
    2395 + 
    2396 +       SPEX(txpid5gl[0], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL0, 
    2397 +            SSB_SPROM4_TXPID5GL0_SHIFT); 
    2398 +       SPEX(txpid5gl[1], SSB_SPROM4_TXPID5GL01, SSB_SPROM4_TXPID5GL1, 
    2399 +            SSB_SPROM4_TXPID5GL1_SHIFT); 
    2400 +       SPEX(txpid5gl[2], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL2, 
    2401 +            SSB_SPROM4_TXPID5GL2_SHIFT); 
    2402 +       SPEX(txpid5gl[3], SSB_SPROM4_TXPID5GL23, SSB_SPROM4_TXPID5GL3, 
    2403 +            SSB_SPROM4_TXPID5GL3_SHIFT); 
    2404 + 
    2405 +       SPEX(txpid5g[0], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G0, 
    2406 +            SSB_SPROM4_TXPID5G0_SHIFT); 
    2407 +       SPEX(txpid5g[1], SSB_SPROM4_TXPID5G01, SSB_SPROM4_TXPID5G1, 
    2408 +            SSB_SPROM4_TXPID5G1_SHIFT); 
    2409 +       SPEX(txpid5g[2], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G2, 
    2410 +            SSB_SPROM4_TXPID5G2_SHIFT); 
    2411 +       SPEX(txpid5g[3], SSB_SPROM4_TXPID5G23, SSB_SPROM4_TXPID5G3, 
    2412 +            SSB_SPROM4_TXPID5G3_SHIFT); 
    2413 + 
    2414 +       SPEX(txpid5gh[0], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH0, 
    2415 +            SSB_SPROM4_TXPID5GH0_SHIFT); 
    2416 +       SPEX(txpid5gh[1], SSB_SPROM4_TXPID5GH01, SSB_SPROM4_TXPID5GH1, 
    2417 +            SSB_SPROM4_TXPID5GH1_SHIFT); 
    2418 +       SPEX(txpid5gh[2], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH2, 
    2419 +            SSB_SPROM4_TXPID5GH2_SHIFT); 
    2420 +       SPEX(txpid5gh[3], SSB_SPROM4_TXPID5GH23, SSB_SPROM4_TXPID5GH3, 
    2421 +            SSB_SPROM4_TXPID5GH3_SHIFT); 
    2422 + 
    2423 +       SPEX(boardflags_lo, SSB_SPROM8_BFLLO, ~0, 0); 
    2424 +       SPEX(boardflags_hi, SSB_SPROM8_BFLHI, ~0, 0); 
    2425 +       SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, ~0, 0); 
    2426 +       SPEX(boardflags2_hi, SSB_SPROM8_BFL2HI, ~0, 0); 
    2427 + 
    2428 +       SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); 
    2429 +       SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); 
    2430 + 
    2431 +       /* Extract cores power info info */ 
    2432 +       for (i = 0; i < ARRAY_SIZE(pwr_info_offset); i++) { 
    2433 +               o = pwr_info_offset[i]; 
    2434 +               SPEX(core_pwr_info[i].itssi_2g, o + SSB_SROM8_2G_MAXP_ITSSI, 
    2435 +                       SSB_SPROM8_2G_ITSSI, SSB_SPROM8_2G_ITSSI_SHIFT); 
    2436 +               SPEX(core_pwr_info[i].maxpwr_2g, o + SSB_SROM8_2G_MAXP_ITSSI, 
    2437 +                       SSB_SPROM8_2G_MAXP, 0); 
    2438 + 
    2439 +               SPEX(core_pwr_info[i].pa_2g[0], o + SSB_SROM8_2G_PA_0, ~0, 0); 
    2440 +               SPEX(core_pwr_info[i].pa_2g[1], o + SSB_SROM8_2G_PA_1, ~0, 0); 
    2441 +               SPEX(core_pwr_info[i].pa_2g[2], o + SSB_SROM8_2G_PA_2, ~0, 0); 
    2442 + 
    2443 +               SPEX(core_pwr_info[i].itssi_5g, o + SSB_SROM8_5G_MAXP_ITSSI, 
    2444 +                       SSB_SPROM8_5G_ITSSI, SSB_SPROM8_5G_ITSSI_SHIFT); 
    2445 +               SPEX(core_pwr_info[i].maxpwr_5g, o + SSB_SROM8_5G_MAXP_ITSSI, 
    2446 +                       SSB_SPROM8_5G_MAXP, 0); 
    2447 +               SPEX(core_pwr_info[i].maxpwr_5gh, o + SSB_SPROM8_5GHL_MAXP, 
    2448 +                       SSB_SPROM8_5GH_MAXP, 0); 
    2449 +               SPEX(core_pwr_info[i].maxpwr_5gl, o + SSB_SPROM8_5GHL_MAXP, 
    2450 +                       SSB_SPROM8_5GL_MAXP, SSB_SPROM8_5GL_MAXP_SHIFT); 
    2451 + 
    2452 +               SPEX(core_pwr_info[i].pa_5gl[0], o + SSB_SROM8_5GL_PA_0, ~0, 0); 
    2453 +               SPEX(core_pwr_info[i].pa_5gl[1], o + SSB_SROM8_5GL_PA_1, ~0, 0); 
    2454 +               SPEX(core_pwr_info[i].pa_5gl[2], o + SSB_SROM8_5GL_PA_2, ~0, 0); 
    2455 +               SPEX(core_pwr_info[i].pa_5g[0], o + SSB_SROM8_5G_PA_0, ~0, 0); 
    2456 +               SPEX(core_pwr_info[i].pa_5g[1], o + SSB_SROM8_5G_PA_1, ~0, 0); 
    2457 +               SPEX(core_pwr_info[i].pa_5g[2], o + SSB_SROM8_5G_PA_2, ~0, 0); 
    2458 +               SPEX(core_pwr_info[i].pa_5gh[0], o + SSB_SROM8_5GH_PA_0, ~0, 0); 
    2459 +               SPEX(core_pwr_info[i].pa_5gh[1], o + SSB_SROM8_5GH_PA_1, ~0, 0); 
    2460 +               SPEX(core_pwr_info[i].pa_5gh[2], o + SSB_SROM8_5GH_PA_2, ~0, 0); 
    2461 +       } 
    2462 + 
    24633080+       SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, SSB_SROM8_FEM_TSSIPOS, 
    24643081+            SSB_SROM8_FEM_TSSIPOS_SHIFT); 
     
    26743291+               present = true; 
    26753292+               break; 
    2676 + 
     3293+       case BCMA_CHIP_ID_BCM43227: 
     3294+       case BCMA_CHIP_ID_BCM43228: 
     3295+       case BCMA_CHIP_ID_BCM43428: 
     3296+               present = chip_status & BCMA_CC_CHIPST_43228_OTP_PRESENT; 
     3297+               break; 
    26773298+       default: 
    26783299+               present = false; 
     
    27683389  
    27693390        err = bcma_sprom_valid(sprom); 
     3391-       if (err) 
     3392+       if (err) { 
     3393+               bcma_warn(bus, "invalid sprom read from the PCIe card, try to use fallback sprom\n"); 
     3394+               err = bcma_fill_sprom_with_fallback(bus, &bus->sprom); 
     3395                goto out; 
     3396+       } 
     3397  
     3398        bcma_sprom_extract_r8(bus, sprom); 
     3399  
    27703400--- a/include/linux/bcma/bcma.h 
    27713401+++ b/include/linux/bcma/bcma.h 
    2772 @@ -7,6 +7,7 @@ 
     3402@@ -7,9 +7,10 @@ 
    27733403 #include <linux/bcma/bcma_driver_chipcommon.h> 
    27743404 #include <linux/bcma/bcma_driver_pci.h> 
     
    27773407 #include <linux/ssb/ssb.h> /* SPROM sharing */ 
    27783408  
    2779  #include "bcma_regs.h" 
     3409-#include "bcma_regs.h" 
     3410+#include <linux/bcma/bcma_regs.h> 
     3411  
     3412 struct bcma_device; 
     3413 struct bcma_bus; 
    27803414@@ -26,6 +27,11 @@ struct bcma_chipinfo { 
    27813415        u8 pkg; 
     
    28783512  
    28793513        struct bcma_drv_cc drv_cc; 
    2880         struct bcma_drv_pci drv_pci; 
     3514-       struct bcma_drv_pci drv_pci; 
     3515+       struct bcma_drv_pci drv_pci[2]; 
    28813516        struct bcma_drv_mips drv_mips; 
    28823517+       struct bcma_drv_gmac_cmn drv_gmac_cmn; 
     
    28943529--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    28953530+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    2896 @@ -56,6 +56,9 @@ 
     3531@@ -24,7 +24,7 @@ 
     3532 #define   BCMA_CC_FLASHT_NONE          0x00000000      /* No flash */ 
     3533 #define   BCMA_CC_FLASHT_STSER         0x00000100      /* ST serial flash */ 
     3534 #define   BCMA_CC_FLASHT_ATSER         0x00000200      /* Atmel serial flash */ 
     3535-#define   BCMA_CC_FLASHT_NFLASH                0x00000200 
     3536+#define   BCMA_CC_FLASHT_NFLASH                0x00000200      /* NAND flash */ 
     3537 #define          BCMA_CC_FLASHT_PARA           0x00000700      /* Parallel flash */ 
     3538 #define  BCMA_CC_CAP_PLLT              0x00038000      /* PLL Type */ 
     3539 #define   BCMA_PLLTYPE_NONE            0x00000000 
     3540@@ -45,6 +45,7 @@ 
     3541 #define  BCMA_CC_CAP_PMU               0x10000000      /* PMU available (rev >= 20) */ 
     3542 #define  BCMA_CC_CAP_ECI               0x20000000      /* ECI available (rev >= 20) */ 
     3543 #define  BCMA_CC_CAP_SPROM             0x40000000      /* SPROM present */ 
     3544+#define  BCMA_CC_CAP_NFLASH            0x80000000      /* NAND flash present (rev >= 35 or BCM4706?) */ 
     3545 #define BCMA_CC_CORECTL                        0x0008 
     3546 #define  BCMA_CC_CORECTL_UARTCLK0      0x00000001      /* Drive UART with internal clock */ 
     3547 #define         BCMA_CC_CORECTL_SE             0x00000002      /* sync clk out enable (corerev >= 3) */ 
     3548@@ -56,6 +57,9 @@ 
    28973549 #define         BCMA_CC_OTPS_HW_PROTECT        0x00000001 
    28983550 #define         BCMA_CC_OTPS_SW_PROTECT        0x00000002 
     
    29043556 #define         BCMA_CC_OTPC_RECWAIT           0xFF000000 
    29053557 #define         BCMA_CC_OTPC_PROGWAIT          0x00FFFF00 
    2906 @@ -72,6 +75,8 @@ 
     3558@@ -72,6 +76,8 @@ 
    29073559 #define         BCMA_CC_OTPP_READ              0x40000000 
    29083560 #define         BCMA_CC_OTPP_START             0x80000000 
     
    29133565 #define BCMA_CC_IRQMASK                        0x0024 
    29143566 #define         BCMA_CC_IRQ_GPIO               0x00000001      /* gpio intr */ 
    2915 @@ -79,6 +84,15 @@ 
     3567@@ -79,6 +85,22 @@ 
    29163568 #define         BCMA_CC_IRQ_WDRESET            0x80000000      /* watchdog reset occurred */ 
    29173569 #define BCMA_CC_CHIPCTL                        0x0028          /* Rev >= 11 only */ 
     
    29213573+#define  BCMA_CC_CHIPST_4331_SPROM_PRESENT     2 
    29223574+#define  BCMA_CC_CHIPST_4331_OTP_PRESENT       4 
     3575+#define  BCMA_CC_CHIPST_43228_ILP_DIV_EN       0x00000001 
     3576+#define  BCMA_CC_CHIPST_43228_OTP_PRESENT      0x00000002 
     3577+#define  BCMA_CC_CHIPST_43228_SERDES_REFCLK_PADSEL     0x00000004 
     3578+#define  BCMA_CC_CHIPST_43228_SDIO_MODE                0x00000008 
     3579+#define  BCMA_CC_CHIPST_43228_SDIO_OTP_PRESENT 0x00000010 
     3580+#define  BCMA_CC_CHIPST_43228_SDIO_RESET       0x00000020 
    29233581+#define  BCMA_CC_CHIPST_4706_PKG_OPTION                BIT(0) /* 0: full-featured package 1: low-cost package */ 
    29243582+#define  BCMA_CC_CHIPST_4706_SFLASH_PRESENT    BIT(1) /* 0: parallel, 1: serial flash is present */ 
     
    29263584+#define  BCMA_CC_CHIPST_4706_MIPS_BENDIAN      BIT(3) /* 0: little, 1: big endian */ 
    29273585+#define  BCMA_CC_CHIPST_4706_PCIE1_DISABLE     BIT(5) /* PCIE1 enable strap pin */ 
     3586+#define  BCMA_CC_CHIPST_5357_NAND_BOOT         BIT(4) /* NAND boot, valid for CC rev 38 and/or BCM5357 */ 
    29283587 #define BCMA_CC_JCMD                   0x0030          /* Rev >= 10 only */ 
    29293588 #define  BCMA_CC_JCMD_START            0x80000000 
    29303589 #define  BCMA_CC_JCMD_BUSY             0x80000000 
    2931 @@ -181,6 +195,22 @@ 
     3590@@ -108,10 +130,58 @@ 
     3591 #define  BCMA_CC_JCTL_EXT_EN           2               /* Enable external targets */ 
     3592 #define  BCMA_CC_JCTL_EN               1               /* Enable Jtag master */ 
     3593 #define BCMA_CC_FLASHCTL               0x0040 
     3594+/* Start/busy bit in flashcontrol */ 
     3595+#define  BCMA_CC_FLASHCTL_OPCODE       0x000000ff 
     3596+#define  BCMA_CC_FLASHCTL_ACTION       0x00000700 
     3597+#define  BCMA_CC_FLASHCTL_CS_ACTIVE    0x00001000      /* Chip Select Active, rev >= 20 */ 
     3598 #define  BCMA_CC_FLASHCTL_START                0x80000000 
     3599 #define  BCMA_CC_FLASHCTL_BUSY         BCMA_CC_FLASHCTL_START 
     3600+/* Flashcontrol action + opcodes for ST flashes */ 
     3601+#define  BCMA_CC_FLASHCTL_ST_WREN      0x0006          /* Write Enable */ 
     3602+#define  BCMA_CC_FLASHCTL_ST_WRDIS     0x0004          /* Write Disable */ 
     3603+#define  BCMA_CC_FLASHCTL_ST_RDSR      0x0105          /* Read Status Register */ 
     3604+#define  BCMA_CC_FLASHCTL_ST_WRSR      0x0101          /* Write Status Register */ 
     3605+#define  BCMA_CC_FLASHCTL_ST_READ      0x0303          /* Read Data Bytes */ 
     3606+#define  BCMA_CC_FLASHCTL_ST_PP                0x0302          /* Page Program */ 
     3607+#define  BCMA_CC_FLASHCTL_ST_SE                0x02d8          /* Sector Erase */ 
     3608+#define  BCMA_CC_FLASHCTL_ST_BE                0x00c7          /* Bulk Erase */ 
     3609+#define  BCMA_CC_FLASHCTL_ST_DP                0x00b9          /* Deep Power-down */ 
     3610+#define  BCMA_CC_FLASHCTL_ST_RES       0x03ab          /* Read Electronic Signature */ 
     3611+#define  BCMA_CC_FLASHCTL_ST_CSA       0x1000          /* Keep chip select asserted */ 
     3612+#define  BCMA_CC_FLASHCTL_ST_SSE       0x0220          /* Sub-sector Erase */ 
     3613+/* Flashcontrol action + opcodes for Atmel flashes */ 
     3614+#define  BCMA_CC_FLASHCTL_AT_READ                      0x07e8 
     3615+#define  BCMA_CC_FLASHCTL_AT_PAGE_READ                 0x07d2 
     3616+#define  BCMA_CC_FLASHCTL_AT_STATUS                    0x01d7 
     3617+#define  BCMA_CC_FLASHCTL_AT_BUF1_WRITE                        0x0384 
     3618+#define  BCMA_CC_FLASHCTL_AT_BUF2_WRITE                        0x0387 
     3619+#define  BCMA_CC_FLASHCTL_AT_BUF1_ERASE_PROGRAM                0x0283 
     3620+#define  BCMA_CC_FLASHCTL_AT_BUF2_ERASE_PROGRAM                0x0286 
     3621+#define  BCMA_CC_FLASHCTL_AT_BUF1_PROGRAM              0x0288 
     3622+#define  BCMA_CC_FLASHCTL_AT_BUF2_PROGRAM              0x0289 
     3623+#define  BCMA_CC_FLASHCTL_AT_PAGE_ERASE                        0x0281 
     3624+#define  BCMA_CC_FLASHCTL_AT_BLOCK_ERASE               0x0250 
     3625+#define  BCMA_CC_FLASHCTL_AT_BUF1_WRITE_ERASE_PROGRAM  0x0382 
     3626+#define  BCMA_CC_FLASHCTL_AT_BUF2_WRITE_ERASE_PROGRAM  0x0385 
     3627+#define  BCMA_CC_FLASHCTL_AT_BUF1_LOAD                 0x0253 
     3628+#define  BCMA_CC_FLASHCTL_AT_BUF2_LOAD                 0x0255 
     3629+#define  BCMA_CC_FLASHCTL_AT_BUF1_COMPARE              0x0260 
     3630+#define  BCMA_CC_FLASHCTL_AT_BUF2_COMPARE              0x0261 
     3631+#define  BCMA_CC_FLASHCTL_AT_BUF1_REPROGRAM            0x0258 
     3632+#define  BCMA_CC_FLASHCTL_AT_BUF2_REPROGRAM            0x0259 
     3633 #define BCMA_CC_FLASHADDR              0x0044 
     3634 #define BCMA_CC_FLASHDATA              0x0048 
     3635+/* Status register bits for ST flashes */ 
     3636+#define  BCMA_CC_FLASHDATA_ST_WIP      0x01            /* Write In Progress */ 
     3637+#define  BCMA_CC_FLASHDATA_ST_WEL      0x02            /* Write Enable Latch */ 
     3638+#define  BCMA_CC_FLASHDATA_ST_BP_MASK  0x1c            /* Block Protect */ 
     3639+#define  BCMA_CC_FLASHDATA_ST_BP_SHIFT 2 
     3640+#define  BCMA_CC_FLASHDATA_ST_SRWD     0x80            /* Status Register Write Disable */ 
     3641+/* Status register bits for Atmel flashes */ 
     3642+#define  BCMA_CC_FLASHDATA_AT_READY    0x80 
     3643+#define  BCMA_CC_FLASHDATA_AT_MISMATCH 0x40 
     3644+#define  BCMA_CC_FLASHDATA_AT_ID_MASK  0x38 
     3645+#define  BCMA_CC_FLASHDATA_AT_ID_SHIFT 3 
     3646 #define BCMA_CC_BCAST_ADDR             0x0050 
     3647 #define BCMA_CC_BCAST_DATA             0x0054 
     3648 #define BCMA_CC_GPIOPULLUP             0x0058          /* Rev >= 20 only */ 
     3649@@ -181,6 +251,45 @@ 
    29323650 #define BCMA_CC_FLASH_CFG              0x0128 
    29333651 #define  BCMA_CC_FLASH_CFG_DS          0x0010  /* Data size, 0=8bit, 1=16bit */ 
     
    29493667+#define  BCMA_CC_SROM_CONTROL_SIZE_SHIFT       1 
    29503668+#define  BCMA_CC_SROM_CONTROL_PRESENT  0x00000001 
     3669+/* Block 0x140 - 0x190 registers are chipset specific */ 
     3670+#define BCMA_CC_4706_FLASHSCFG         0x18C           /* Flash struct configuration */ 
     3671+#define  BCMA_CC_4706_FLASHSCFG_MASK   0x000000ff 
     3672+#define  BCMA_CC_4706_FLASHSCFG_SF1    0x00000001      /* 2nd serial flash present */ 
     3673+#define  BCMA_CC_4706_FLASHSCFG_PF1    0x00000002      /* 2nd parallel flash present */ 
     3674+#define  BCMA_CC_4706_FLASHSCFG_SF1_TYPE       0x00000004      /* 2nd serial flash type : 0 : ST, 1 : Atmel */ 
     3675+#define  BCMA_CC_4706_FLASHSCFG_NF1    0x00000008      /* 2nd NAND flash present */ 
     3676+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_MASK     0x000000f0 
     3677+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_4MB      0x00000010      /* 4MB */ 
     3678+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_8MB      0x00000020      /* 8MB */ 
     3679+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_16MB     0x00000030      /* 16MB */ 
     3680+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_32MB     0x00000040      /* 32MB */ 
     3681+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_64MB     0x00000050      /* 64MB */ 
     3682+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_128MB    0x00000060      /* 128MB */ 
     3683+#define  BCMA_CC_4706_FLASHSCFG_1ST_MADDR_SEG_256MB    0x00000070      /* 256MB */ 
     3684+/* NAND flash registers for BCM4706 (corerev = 31) */ 
     3685+#define BCMA_CC_NFLASH_CTL             0x01A0 
     3686+#define  BCMA_CC_NFLASH_CTL_ERR                0x08000000 
     3687+#define BCMA_CC_NFLASH_CONF            0x01A4 
     3688+#define BCMA_CC_NFLASH_COL_ADDR                0x01A8 
     3689+#define BCMA_CC_NFLASH_ROW_ADDR                0x01AC 
     3690+#define BCMA_CC_NFLASH_DATA            0x01B0 
     3691+#define BCMA_CC_NFLASH_WAITCNT0                0x01B4 
    29513692 /* 0x1E0 is defined as shared BCMA_CLKCTLST */ 
    29523693 #define BCMA_CC_HW_WORKAROUND          0x01E4 /* Hardware workaround (rev >= 20) */ 
    29533694 #define BCMA_CC_UART0_DATA             0x0300 
    2954 @@ -240,7 +270,6 @@ 
     3695@@ -240,7 +349,60 @@ 
    29553696 #define BCMA_CC_PLLCTL_ADDR            0x0660 
    29563697 #define BCMA_CC_PLLCTL_DATA            0x0664 
    29573698 #define BCMA_CC_SPROM                  0x0800 /* SPROM beginning */ 
    29583699-#define BCMA_CC_SPROM_PCIE6            0x0830 /* SPROM beginning on PCIe rev >= 6 */ 
     3700+/* NAND flash MLC controller registers (corerev >= 38) */ 
     3701+#define BCMA_CC_NAND_REVISION          0x0C00 
     3702+#define BCMA_CC_NAND_CMD_START         0x0C04 
     3703+#define BCMA_CC_NAND_CMD_ADDR_X                0x0C08 
     3704+#define BCMA_CC_NAND_CMD_ADDR          0x0C0C 
     3705+#define BCMA_CC_NAND_CMD_END_ADDR      0x0C10 
     3706+#define BCMA_CC_NAND_CS_NAND_SELECT    0x0C14 
     3707+#define BCMA_CC_NAND_CS_NAND_XOR       0x0C18 
     3708+#define BCMA_CC_NAND_SPARE_RD0         0x0C20 
     3709+#define BCMA_CC_NAND_SPARE_RD4         0x0C24 
     3710+#define BCMA_CC_NAND_SPARE_RD8         0x0C28 
     3711+#define BCMA_CC_NAND_SPARE_RD12                0x0C2C 
     3712+#define BCMA_CC_NAND_SPARE_WR0         0x0C30 
     3713+#define BCMA_CC_NAND_SPARE_WR4         0x0C34 
     3714+#define BCMA_CC_NAND_SPARE_WR8         0x0C38 
     3715+#define BCMA_CC_NAND_SPARE_WR12                0x0C3C 
     3716+#define BCMA_CC_NAND_ACC_CONTROL       0x0C40 
     3717+#define BCMA_CC_NAND_CONFIG            0x0C48 
     3718+#define BCMA_CC_NAND_TIMING_1          0x0C50 
     3719+#define BCMA_CC_NAND_TIMING_2          0x0C54 
     3720+#define BCMA_CC_NAND_SEMAPHORE         0x0C58 
     3721+#define BCMA_CC_NAND_DEVID             0x0C60 
     3722+#define BCMA_CC_NAND_DEVID_X           0x0C64 
     3723+#define BCMA_CC_NAND_BLOCK_LOCK_STATUS 0x0C68 
     3724+#define BCMA_CC_NAND_INTFC_STATUS      0x0C6C 
     3725+#define BCMA_CC_NAND_ECC_CORR_ADDR_X   0x0C70 
     3726+#define BCMA_CC_NAND_ECC_CORR_ADDR     0x0C74 
     3727+#define BCMA_CC_NAND_ECC_UNC_ADDR_X    0x0C78 
     3728+#define BCMA_CC_NAND_ECC_UNC_ADDR      0x0C7C 
     3729+#define BCMA_CC_NAND_READ_ERROR_COUNT  0x0C80 
     3730+#define BCMA_CC_NAND_CORR_STAT_THRESHOLD       0x0C84 
     3731+#define BCMA_CC_NAND_READ_ADDR_X       0x0C90 
     3732+#define BCMA_CC_NAND_READ_ADDR         0x0C94 
     3733+#define BCMA_CC_NAND_PAGE_PROGRAM_ADDR_X       0x0C98 
     3734+#define BCMA_CC_NAND_PAGE_PROGRAM_ADDR 0x0C9C 
     3735+#define BCMA_CC_NAND_COPY_BACK_ADDR_X  0x0CA0 
     3736+#define BCMA_CC_NAND_COPY_BACK_ADDR    0x0CA4 
     3737+#define BCMA_CC_NAND_BLOCK_ERASE_ADDR_X        0x0CA8 
     3738+#define BCMA_CC_NAND_BLOCK_ERASE_ADDR  0x0CAC 
     3739+#define BCMA_CC_NAND_INV_READ_ADDR_X   0x0CB0 
     3740+#define BCMA_CC_NAND_INV_READ_ADDR     0x0CB4 
     3741+#define BCMA_CC_NAND_BLK_WR_PROTECT    0x0CC0 
     3742+#define BCMA_CC_NAND_ACC_CONTROL_CS1   0x0CD0 
     3743+#define BCMA_CC_NAND_CONFIG_CS1                0x0CD4 
     3744+#define BCMA_CC_NAND_TIMING_1_CS1      0x0CD8 
     3745+#define BCMA_CC_NAND_TIMING_2_CS1      0x0CDC 
     3746+#define BCMA_CC_NAND_SPARE_RD16                0x0D30 
     3747+#define BCMA_CC_NAND_SPARE_RD20                0x0D34 
     3748+#define BCMA_CC_NAND_SPARE_RD24                0x0D38 
     3749+#define BCMA_CC_NAND_SPARE_RD28                0x0D3C 
     3750+#define BCMA_CC_NAND_CACHE_ADDR                0x0D40 
     3751+#define BCMA_CC_NAND_CACHE_DATA                0x0D44 
     3752+#define BCMA_CC_NAND_CTRL_CONFIG       0x0D48 
     3753+#define BCMA_CC_NAND_CTRL_STATUS       0x0D4C 
    29593754  
    29603755 /* Divider allocation in 4716/47162/5356 */ 
    29613756 #define BCMA_CC_PMU5_MAINPLL_CPU       1 
    2962 @@ -256,6 +285,15 @@ 
     3757@@ -256,6 +418,15 @@ 
    29633758  
    29643759 /* 4706 PMU */ 
     
    29763771 /* ALP clock on pre-PMU chips */ 
    29773772 #define BCMA_CC_PMU_ALP_CLOCK          20000000 
    2978 @@ -284,6 +322,19 @@ 
     3773@@ -284,6 +455,19 @@ 
    29793774 #define BCMA_CC_PPL_PCHI_OFF           5 
    29803775 #define BCMA_CC_PPL_PCHI_MASK          0x0000003f 
     
    29963791 #define BCMA_CHIPCTL_4331_BT_COEXIST           BIT(0)  /* 0 disable */ 
    29973792 #define BCMA_CHIPCTL_4331_SECI                 BIT(1)  /* 0 SECI is disabled (JATG functional) */ 
    2998 @@ -297,9 +348,18 @@ 
     3793@@ -297,9 +481,25 @@ 
    29993794 #define BCMA_CHIPCTL_4331_OVR_PIPEAUXPWRDOWN   BIT(9)  /* override core control on pipe_AuxPowerDown */ 
    30003795 #define BCMA_CHIPCTL_4331_PCIE_AUXCLKEN                BIT(10) /* pcie_auxclkenable */ 
     
    30123807+#define BCMA_CCTRL_4313_12MA_LED_DRIVE         0x00000007      /* 12 mA drive strengh for later 4313 */ 
    30133808+ 
     3809+/* BCM5357 ChipControl register bits */ 
     3810+#define BCMA_CHIPCTL_5357_EXTPA                        BIT(14) 
     3811+#define BCMA_CHIPCTL_5357_ANT_MUX_2O3          BIT(15) 
     3812+#define BCMA_CHIPCTL_5357_NFLASH               BIT(16) 
     3813+#define BCMA_CHIPCTL_5357_I2S_PINS_ENABLE      BIT(18) 
     3814+#define BCMA_CHIPCTL_5357_I2CSPI_PINS_ENABLE   BIT(19) 
     3815+ 
    30143816 /* Data for the PMU, if available. 
    30153817  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) 
    30163818  */ 
    3017 @@ -387,5 +447,6 @@ extern void bcma_chipco_chipctl_maskset( 
     3819@@ -310,11 +510,35 @@ struct bcma_chipcommon_pmu { 
     3820  
     3821 #ifdef CONFIG_BCMA_DRIVER_MIPS 
     3822 struct bcma_pflash { 
     3823+       bool present; 
     3824        u8 buswidth; 
     3825        u32 window; 
     3826        u32 window_size; 
     3827 }; 
     3828  
     3829+#ifdef CONFIG_BCMA_SFLASH 
     3830+struct bcma_sflash { 
     3831+       bool present; 
     3832+       u32 window; 
     3833+       u32 blocksize; 
     3834+       u16 numblocks; 
     3835+       u32 size; 
     3836+ 
     3837+       struct mtd_info *mtd; 
     3838+}; 
     3839+#endif 
     3840+ 
     3841+#ifdef CONFIG_BCMA_NFLASH 
     3842+struct mtd_info; 
     3843+ 
     3844+struct bcma_nflash { 
     3845+       bool present; 
     3846+       bool boot;              /* This is the flash the SoC boots from */ 
     3847+ 
     3848+       struct mtd_info *mtd; 
     3849+}; 
     3850+#endif 
     3851+ 
     3852 struct bcma_serial_port { 
     3853        void *regs; 
     3854        unsigned long clockspeed; 
     3855@@ -330,11 +554,18 @@ struct bcma_drv_cc { 
     3856        u32 capabilities; 
     3857        u32 capabilities_ext; 
     3858        u8 setup_done:1; 
     3859+       u8 early_setup_done:1; 
     3860        /* Fast Powerup Delay constant */ 
     3861        u16 fast_pwrup_delay; 
     3862        struct bcma_chipcommon_pmu pmu; 
     3863 #ifdef CONFIG_BCMA_DRIVER_MIPS 
     3864        struct bcma_pflash pflash; 
     3865+#ifdef CONFIG_BCMA_SFLASH 
     3866+       struct bcma_sflash sflash; 
     3867+#endif 
     3868+#ifdef CONFIG_BCMA_NFLASH 
     3869+       struct bcma_nflash nflash; 
     3870+#endif 
     3871  
     3872        int nr_serial_ports; 
     3873        struct bcma_serial_port serial_ports[4]; 
     3874@@ -355,6 +586,7 @@ struct bcma_drv_cc { 
     3875        bcma_cc_write32(cc, offset, (bcma_cc_read32(cc, offset) & (mask)) | (set)) 
     3876  
     3877 extern void bcma_core_chipcommon_init(struct bcma_drv_cc *cc); 
     3878+extern void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc); 
     3879  
     3880 extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); 
     3881 extern void bcma_chipco_resume(struct bcma_drv_cc *cc); 
     3882@@ -378,6 +610,7 @@ u32 bcma_chipco_gpio_polarity(struct bcm 
     3883  
     3884 /* PMU support */ 
     3885 extern void bcma_pmu_init(struct bcma_drv_cc *cc); 
     3886+extern void bcma_pmu_early_init(struct bcma_drv_cc *cc); 
     3887  
     3888 extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, 
     3889                                  u32 value); 
     3890@@ -387,5 +620,6 @@ extern void bcma_chipco_chipctl_maskset( 
    30183891                                        u32 offset, u32 mask, u32 set); 
    30193892 extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, 
     
    31253998+ 
    31263999+#endif /* LINUX_BCMA_DRIVER_GMAC_CMN_H_ */ 
     4000--- a/include/linux/bcma/bcma_driver_mips.h 
     4001+++ b/include/linux/bcma/bcma_driver_mips.h 
     4002@@ -35,13 +35,16 @@ struct bcma_device; 
     4003 struct bcma_drv_mips { 
     4004        struct bcma_device *core; 
     4005        u8 setup_done:1; 
     4006+       u8 early_setup_done:1; 
     4007        unsigned int assigned_irqs; 
     4008 }; 
     4009  
     4010 #ifdef CONFIG_BCMA_DRIVER_MIPS 
     4011 extern void bcma_core_mips_init(struct bcma_drv_mips *mcore); 
     4012+extern void bcma_core_mips_early_init(struct bcma_drv_mips *mcore); 
     4013 #else 
     4014 static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { } 
     4015+static inline void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) { } 
     4016 #endif 
     4017  
     4018 extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore); 
    31274019--- a/include/linux/bcma/bcma_driver_pci.h 
    31284020+++ b/include/linux/bcma/bcma_driver_pci.h 
     
    32974189--- a/include/linux/bcma/bcma_regs.h 
    32984190+++ b/include/linux/bcma/bcma_regs.h 
    3299 @@ -56,4 +56,31 @@ 
     4191@@ -11,11 +11,13 @@ 
     4192 #define  BCMA_CLKCTLST_HAVEHTREQ       0x00000010 /* HT available request */ 
     4193 #define  BCMA_CLKCTLST_HWCROFF         0x00000020 /* Force HW clock request off */ 
     4194 #define  BCMA_CLKCTLST_EXTRESREQ       0x00000700 /* Mask of external resource requests */ 
     4195+#define  BCMA_CLKCTLST_EXTRESREQ_SHIFT 8 
     4196 #define  BCMA_CLKCTLST_HAVEALP         0x00010000 /* ALP available */ 
     4197 #define  BCMA_CLKCTLST_HAVEHT          0x00020000 /* HT available */ 
     4198 #define  BCMA_CLKCTLST_BP_ON_ALP       0x00040000 /* RO: running on ALP clock */ 
     4199 #define  BCMA_CLKCTLST_BP_ON_HT                0x00080000 /* RO: running on HT clock */ 
     4200 #define  BCMA_CLKCTLST_EXTRESST                0x07000000 /* Mask of external resource status */ 
     4201+#define  BCMA_CLKCTLST_EXTRESST_SHIFT  24 
     4202 /* Is there any BCM4328 on BCMA bus? */ 
     4203 #define  BCMA_CLKCTLST_4328A0_HAVEHT   0x00010000 /* 4328a0 has reversed bits */ 
     4204 #define  BCMA_CLKCTLST_4328A0_HAVEALP  0x00020000 /* 4328a0 has reversed bits */ 
     4205@@ -56,4 +58,36 @@ 
    33004206 #define  BCMA_PCI_GPIO_XTAL            0x40    /* PCI config space GPIO 14 for Xtal powerup */ 
    33014207 #define  BCMA_PCI_GPIO_PLL             0x80    /* PCI config space GPIO 15 for PLL powerdown */ 
     
    33284234+                                                        */ 
    33294235+ 
     4236+#define BCMA_SOC_FLASH1                        0x1fc00000      /* MIPS Flash Region 1 */ 
     4237+#define BCMA_SOC_FLASH1_SZ             0x00400000      /* MIPS Size of Flash Region 1 */ 
     4238+#define BCMA_SOC_FLASH2                        0x1c000000      /* Flash Region 2 (region 1 shadowed here) */ 
     4239+#define BCMA_SOC_FLASH2_SZ             0x02000000      /* Size of Flash Region 2 */ 
     4240+ 
    33304241 #endif /* LINUX_BCMA_REGS_H_ */ 
Note: See TracChangeset for help on using the changeset viewer.