Changeset 29574


Ignore:
Timestamp:
2011-12-20T00:33:03+01:00 (6 years ago)
Author:
hauke
Message:

kernel: update bcma and ssb to version master-2011-12-16 from wireless-testing

Location:
trunk/target/linux
Files:
2 added
8 deleted
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/patches-3.0/0012-bcma-move-parallel-flash-into-a-union.patch

    r27902 r29574  
    105105 #define BCMA_CC_BCAST_DATA             0x0054 
    106106 #define BCMA_CC_GPIOPULLUP             0x0058          /* Rev >= 20 only */ 
    107 @@ -283,6 +341,12 @@ 
    108  #define BCMA_CC_PPL_PCHI_OFF           5 
    109  #define BCMA_CC_PPL_PCHI_MASK          0x0000003f 
     107@@ -300,6 +358,12 @@ 
     108 #define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4     BIT(16) /* enable bt_shd0 at gpio4 */ 
     109 #define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5     BIT(17) /* enable bt_shd1 at gpio5 */ 
    110110  
    111111+#define        BCMA_FLASH2                     0x1c000000      /* Flash Region 2 (region 1 shadowed here) */ 
     
    118118  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) 
    119119  */ 
    120 @@ -292,6 +356,10 @@ struct bcma_chipcommon_pmu { 
     120@@ -309,6 +373,10 @@ struct bcma_chipcommon_pmu { 
    121121 }; 
    122122  
     
    129129        u8 buswidth; 
    130130        u32 window; 
    131 @@ -317,7 +385,10 @@ struct bcma_drv_cc { 
     131@@ -334,7 +402,10 @@ struct bcma_drv_cc { 
    132132        u16 fast_pwrup_delay; 
    133133        struct bcma_chipcommon_pmu pmu; 
  • trunk/target/linux/brcm47xx/patches-3.0/0013-bcma-add-serial-flash-support-to-bcma.patch

    r27902 r29574  
    4141--- a/drivers/bcma/bcma_private.h 
    4242+++ b/drivers/bcma/bcma_private.h 
    43 @@ -38,6 +38,11 @@ void bcma_chipco_serial_init(struct bcma 
     43@@ -41,6 +41,11 @@ void bcma_chipco_serial_init(struct bcma 
    4444 u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
    4545 u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
     
    630630--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    631631+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    632 @@ -358,6 +358,7 @@ struct bcma_chipcommon_pmu { 
     632@@ -375,6 +375,7 @@ struct bcma_chipcommon_pmu { 
    633633 #ifdef CONFIG_BCMA_DRIVER_MIPS 
    634634 enum bcma_flash_type { 
     
    638638  
    639639 struct bcma_pflash { 
    640 @@ -366,6 +367,14 @@ struct bcma_pflash { 
     640@@ -383,6 +384,14 @@ struct bcma_pflash { 
    641641        u32 window_size; 
    642642 }; 
     
    653653        void *regs; 
    654654        unsigned long clockspeed; 
    655 @@ -388,6 +397,9 @@ struct bcma_drv_cc { 
     655@@ -405,6 +414,9 @@ struct bcma_drv_cc { 
    656656        enum bcma_flash_type flash_type; 
    657657        union { 
     
    663663  
    664664        int nr_serial_ports; 
    665 @@ -431,4 +443,16 @@ u32 bcma_chipco_gpio_polarity(struct bcm 
    666  /* PMU support */ 
    667  extern void bcma_pmu_init(struct bcma_drv_cc *cc); 
     665@@ -459,4 +471,16 @@ extern void bcma_chipco_chipctl_maskset( 
     666 extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, 
     667                                       u32 offset, u32 mask, u32 set); 
    668668  
    669669+#ifdef CONFIG_BCMA_SFLASH 
  • trunk/target/linux/brcm47xx/patches-3.0/0023-bcma-use-randoom-mac-address-as-long-as-reading-it-o.patch

    r27902 r29574  
    2020 #define SPOFF(offset)  ((offset) / sizeof(u16)) 
    2121  
    22 @@ -144,8 +145,10 @@ int bcma_sprom_get(struct bcma_bus *bus) 
     22@@ -214,8 +215,10 @@ int bcma_sprom_get(struct bcma_bus *bus) 
    2323        if (!bus->drv_cc.core) 
    2424                return -EOPNOTSUPP; 
  • trunk/target/linux/brcm47xx/patches-3.0/220-bcm5354.patch

    r28043 r29574  
    3232--- a/drivers/ssb/main.c 
    3333+++ b/drivers/ssb/main.c 
    34 @@ -1104,6 +1104,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
     34@@ -1105,6 +1105,8 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
    3535  
    3636        if (bus->chip_id == 0x5365) { 
  • trunk/target/linux/brcm47xx/patches-3.0/951-brcm4716-defines.patch

    r27723 r29574  
    2626--- a/include/linux/ssb/ssb.h 
    2727+++ b/include/linux/ssb/ssb.h 
    28 @@ -157,9 +157,16 @@ struct ssb_bus_ops { 
     28@@ -166,9 +166,16 @@ struct ssb_bus_ops { 
    2929 #define SSB_DEV_MINI_MACPHY    0x823 
    3030 #define SSB_DEV_ARM_1176       0x824 
     
    6161 /* Enumeration space constants */ 
    6262 #define SSB_CORE_SIZE          0x1000  /* Size of a core MMIO area */ 
    63 @@ -499,5 +501,41 @@ enum { 
     63@@ -556,5 +558,41 @@ enum { 
    6464 #define SSB_ADM_BASE2                  0xFFFF0000      /* Type2 base address for the core */ 
    6565 #define SSB_ADM_BASE2_SHIFT            16 
  • trunk/target/linux/generic/patches-2.6.30/025-bcma_backport.patch

    r27731 r29574  
    7272--- /dev/null 
    7373+++ b/drivers/bcma/Kconfig 
    74 @@ -0,0 +1,44 @@ 
     74@@ -0,0 +1,57 @@ 
    7575+config BCMA_POSSIBLE 
    7676+       bool 
     
    108108+         PCI core hostmode operation (external PCI bus). 
    109109+ 
     110+config BCMA_HOST_SOC 
     111+       bool 
     112+       depends on BCMA_DRIVER_MIPS 
     113+ 
     114+config BCMA_DRIVER_MIPS 
     115+       bool "BCMA Broadcom MIPS core driver" 
     116+       depends on BCMA && MIPS 
     117+       help 
     118+         Driver for the Broadcom MIPS core attached to Broadcom specific 
     119+         Advanced Microcontroller Bus. 
     120+ 
     121+         If unsure, say N 
     122+ 
    110123+config BCMA_DEBUG 
    111124+       bool "BCMA debugging" 
     
    119132--- /dev/null 
    120133+++ b/drivers/bcma/Makefile 
    121 @@ -0,0 +1,8 @@ 
     134@@ -0,0 +1,10 @@ 
    122135+bcma-y                                 += main.o scan.o core.o sprom.o 
    123136+bcma-y                                 += driver_chipcommon.o driver_chipcommon_pmu.o 
    124137+bcma-y                                 += driver_pci.o 
    125138+bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     139+bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
    126140+bcma-$(CONFIG_BCMA_HOST_PCI)           += host_pci.o 
     141+bcma-$(CONFIG_BCMA_HOST_SOC)           += host_soc.o 
    127142+obj-$(CONFIG_BCMA)                     += bcma.o 
    128143+ 
     
    158173--- /dev/null 
    159174+++ b/drivers/bcma/bcma_private.h 
    160 @@ -0,0 +1,35 @@ 
     175@@ -0,0 +1,54 @@ 
    161176+#ifndef LINUX_BCMA_PRIVATE_H_ 
    162177+#define LINUX_BCMA_PRIVATE_H_ 
     
    176191+int bcma_bus_register(struct bcma_bus *bus); 
    177192+void bcma_bus_unregister(struct bcma_bus *bus); 
     193+int __init bcma_bus_early_register(struct bcma_bus *bus, 
     194+                                  struct bcma_device *core_cc, 
     195+                                  struct bcma_device *core_mips); 
     196+#ifdef CONFIG_PM 
     197+int bcma_bus_resume(struct bcma_bus *bus); 
     198+#endif 
    178199+ 
    179200+/* scan.c */ 
    180201+int bcma_bus_scan(struct bcma_bus *bus); 
     202+int __init bcma_bus_scan_early(struct bcma_bus *bus, 
     203+                              struct bcma_device_id *match, 
     204+                              struct bcma_device *core); 
     205+void bcma_init_bus(struct bcma_bus *bus); 
    181206+ 
    182207+/* sprom.c */ 
    183208+int bcma_sprom_get(struct bcma_bus *bus); 
     209+ 
     210+/* driver_chipcommon.c */ 
     211+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     212+void bcma_chipco_serial_init(struct bcma_drv_cc *cc); 
     213+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     214+ 
     215+/* driver_chipcommon_pmu.c */ 
     216+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
     217+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
    184218+ 
    185219+#ifdef CONFIG_BCMA_HOST_PCI 
     
    196230--- /dev/null 
    197231+++ b/drivers/bcma/core.c 
    198 @@ -0,0 +1,124 @@ 
     232@@ -0,0 +1,126 @@ 
    199233+/* 
    200234+ * Broadcom specific AMBA 
     
    309343+{ 
    310344+       switch (core->bus->hosttype) { 
     345+       case BCMA_HOSTTYPE_SOC: 
     346+               return 0; 
    311347+       case BCMA_HOSTTYPE_PCI: 
    312348+               if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64) 
     
    323359--- /dev/null 
    324360+++ b/drivers/bcma/driver_chipcommon.c 
    325 @@ -0,0 +1,103 @@ 
     361@@ -0,0 +1,156 @@ 
    326362+/* 
    327363+ * Broadcom specific AMBA 
     
    329365+ * 
    330366+ * Copyright 2005, Broadcom Corporation 
    331 + * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     367+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
    332368+ * 
    333369+ * Licensed under the GNU/GPL. See COPYING for details. 
     
    351387+       u32 leddc_on = 10; 
    352388+       u32 leddc_off = 90; 
     389+ 
     390+       if (cc->setup_done) 
     391+               return; 
    353392+ 
    354393+       if (cc->core->id.rev >= 11) 
     
    378417+                        (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); 
    379418+       } 
     419+ 
     420+       cc->setup_done = true; 
    380421+} 
    381422+ 
     
    427468+       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
    428469+} 
     470+ 
     471+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     472+void bcma_chipco_serial_init(struct bcma_drv_cc *cc) 
     473+{ 
     474+       unsigned int irq; 
     475+       u32 baud_base; 
     476+       u32 i; 
     477+       unsigned int ccrev = cc->core->id.rev; 
     478+       struct bcma_serial_port *ports = cc->serial_ports; 
     479+ 
     480+       if (ccrev >= 11 && ccrev != 15) { 
     481+               /* Fixed ALP clock */ 
     482+               baud_base = bcma_pmu_alp_clock(cc); 
     483+               if (ccrev >= 21) { 
     484+                       /* Turn off UART clock before switching clocksource. */ 
     485+                       bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     486+                                      bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     487+                                      & ~BCMA_CC_CORECTL_UARTCLKEN); 
     488+               } 
     489+               /* Set the override bit so we don't divide it */ 
     490+               bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     491+                              bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     492+                              | BCMA_CC_CORECTL_UARTCLK0); 
     493+               if (ccrev >= 21) { 
     494+                       /* Re-enable the UART clock. */ 
     495+                       bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     496+                                      bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     497+                                      | BCMA_CC_CORECTL_UARTCLKEN); 
     498+               } 
     499+       } else { 
     500+               pr_err("serial not supported on this device ccrev: 0x%x\n", 
     501+                      ccrev); 
     502+               return; 
     503+       } 
     504+ 
     505+       irq = bcma_core_mips_irq(cc->core); 
     506+ 
     507+       /* Determine the registers of the UARTs */ 
     508+       cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART); 
     509+       for (i = 0; i < cc->nr_serial_ports; i++) { 
     510+               ports[i].regs = cc->core->io_addr + BCMA_CC_UART0_DATA + 
     511+                               (i * 256); 
     512+               ports[i].irq = irq; 
     513+               ports[i].baud_base = baud_base; 
     514+               ports[i].reg_shift = 0; 
     515+       } 
     516+} 
     517+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    429518--- /dev/null 
    430519+++ b/drivers/bcma/driver_chipcommon_pmu.c 
    431 @@ -0,0 +1,138 @@ 
     520@@ -0,0 +1,309 @@ 
    432521+/* 
    433522+ * Broadcom specific AMBA 
    434523+ * ChipCommon Power Management Unit driver 
    435524+ * 
    436 + * Copyright 2009, Michael Buesch <mb@bu3sch.de> 
     525+ * Copyright 2009, Michael Buesch <m@bues.ch> 
    437526+ * Copyright 2007, Broadcom Corporation 
    438527+ * 
     
    443532+#include <linux/bcma/bcma.h> 
    444533+ 
    445 +static void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
    446 +                                       u32 offset, u32 mask, u32 set) 
    447 +{ 
    448 +       u32 value; 
    449 + 
    450 +       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR); 
     534+static u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset) 
     535+{ 
     536+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     537+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     538+       return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA); 
     539+} 
     540+ 
     541+void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value) 
     542+{ 
     543+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     544+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     545+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, value); 
     546+} 
     547+EXPORT_SYMBOL_GPL(bcma_chipco_pll_write); 
     548+ 
     549+void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask, 
     550+                            u32 set) 
     551+{ 
     552+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     553+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     554+       bcma_cc_maskset32(cc, BCMA_CC_PLLCTL_DATA, mask, set); 
     555+} 
     556+EXPORT_SYMBOL_GPL(bcma_chipco_pll_maskset); 
     557+ 
     558+void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
     559+                                u32 offset, u32 mask, u32 set) 
     560+{ 
    451561+       bcma_cc_write32(cc, BCMA_CC_CHIPCTL_ADDR, offset); 
    452562+       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR); 
    453 +       value = bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA); 
    454 +       value &= mask; 
    455 +       value |= set; 
    456 +       bcma_cc_write32(cc, BCMA_CC_CHIPCTL_DATA, value); 
    457 +       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA); 
    458 +} 
     563+       bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL_DATA, mask, set); 
     564+} 
     565+EXPORT_SYMBOL_GPL(bcma_chipco_chipctl_maskset); 
     566+ 
     567+void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask, 
     568+                               u32 set) 
     569+{ 
     570+       bcma_cc_write32(cc, BCMA_CC_REGCTL_ADDR, offset); 
     571+       bcma_cc_read32(cc, BCMA_CC_REGCTL_ADDR); 
     572+       bcma_cc_maskset32(cc, BCMA_CC_REGCTL_DATA, mask, set); 
     573+} 
     574+EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset); 
    459575+ 
    460576+static void bcma_pmu_pll_init(struct bcma_drv_cc *cc) 
     
    515631+} 
    516632+ 
     633+/* Disable to allow reading SPROM. Don't know the adventages of enabling it. */ 
     634+void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable) 
     635+{ 
     636+       struct bcma_bus *bus = cc->core->bus; 
     637+       u32 val; 
     638+ 
     639+       val = bcma_cc_read32(cc, BCMA_CC_CHIPCTL); 
     640+       if (enable) { 
     641+               val |= BCMA_CHIPCTL_4331_EXTPA_EN; 
     642+               if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11) 
     643+                       val |= BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; 
     644+       } else { 
     645+               val &= ~BCMA_CHIPCTL_4331_EXTPA_EN; 
     646+               val &= ~BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; 
     647+       } 
     648+       bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val); 
     649+} 
     650+ 
    517651+void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
    518652+{ 
     
    524658+               break; 
    525659+       case 0x4331: 
    526 +               pr_err("Enabling Ext PA lines not implemented\n"); 
     660+               /* BCM4331 workaround is SPROM-related, we put it in sprom.c */ 
    527661+               break; 
    528662+       case 43224: 
     
    568702+       bcma_pmu_workarounds(cc); 
    569703+} 
     704+ 
     705+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc) 
     706+{ 
     707+       struct bcma_bus *bus = cc->core->bus; 
     708+ 
     709+       switch (bus->chipinfo.id) { 
     710+       case 0x4716: 
     711+       case 0x4748: 
     712+       case 47162: 
     713+       case 0x4313: 
     714+       case 0x5357: 
     715+       case 0x4749: 
     716+       case 53572: 
     717+               /* always 20Mhz */ 
     718+               return 20000 * 1000; 
     719+       case 0x5356: 
     720+       case 0x5300: 
     721+               /* always 25Mhz */ 
     722+               return 25000 * 1000; 
     723+       default: 
     724+               pr_warning("No ALP clock specified for %04X device, " 
     725+                       "pmu rev. %d, using default %d Hz\n", 
     726+                       bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_ALP_CLOCK); 
     727+       } 
     728+       return BCMA_CC_PMU_ALP_CLOCK; 
     729+} 
     730+ 
     731+/* Find the output of the "m" pll divider given pll controls that start with 
     732+ * pllreg "pll0" i.e. 12 for main 6 for phy, 0 for misc. 
     733+ */ 
     734+static u32 bcma_pmu_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
     735+{ 
     736+       u32 tmp, div, ndiv, p1, p2, fc; 
     737+       struct bcma_bus *bus = cc->core->bus; 
     738+ 
     739+       BUG_ON((pll0 & 3) || (pll0 > BCMA_CC_PMU4716_MAINPLL_PLL0)); 
     740+ 
     741+       BUG_ON(!m || m > 4); 
     742+ 
     743+       if (bus->chipinfo.id == 0x5357 || bus->chipinfo.id == 0x4749) { 
     744+               /* Detect failure in clock setting */ 
     745+               tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT); 
     746+               if (tmp & 0x40000) 
     747+                       return 133 * 1000000; 
     748+       } 
     749+ 
     750+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_P1P2_OFF); 
     751+       p1 = (tmp & BCMA_CC_PPL_P1_MASK) >> BCMA_CC_PPL_P1_SHIFT; 
     752+       p2 = (tmp & BCMA_CC_PPL_P2_MASK) >> BCMA_CC_PPL_P2_SHIFT; 
     753+ 
     754+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_M14_OFF); 
     755+       div = (tmp >> ((m - 1) * BCMA_CC_PPL_MDIV_WIDTH)) & 
     756+               BCMA_CC_PPL_MDIV_MASK; 
     757+ 
     758+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_NM5_OFF); 
     759+       ndiv = (tmp & BCMA_CC_PPL_NDIV_MASK) >> BCMA_CC_PPL_NDIV_SHIFT; 
     760+ 
     761+       /* Do calculation in Mhz */ 
     762+       fc = bcma_pmu_alp_clock(cc) / 1000000; 
     763+       fc = (p1 * ndiv * fc) / p2; 
     764+ 
     765+       /* Return clock in Hertz */ 
     766+       return (fc / div) * 1000000; 
     767+} 
     768+ 
     769+/* query bus clock frequency for PMU-enabled chipcommon */ 
     770+u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     771+{ 
     772+       struct bcma_bus *bus = cc->core->bus; 
     773+ 
     774+       switch (bus->chipinfo.id) { 
     775+       case 0x4716: 
     776+       case 0x4748: 
     777+       case 47162: 
     778+               return bcma_pmu_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0, 
     779+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     780+       case 0x5356: 
     781+               return bcma_pmu_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0, 
     782+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     783+       case 0x5357: 
     784+       case 0x4749: 
     785+               return bcma_pmu_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0, 
     786+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     787+       case 0x5300: 
     788+               return bcma_pmu_clock(cc, BCMA_CC_PMU4706_MAINPLL_PLL0, 
     789+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     790+       case 53572: 
     791+               return 75000000; 
     792+       default: 
     793+               pr_warning("No backplane clock specified for %04X device, " 
     794+                       "pmu rev. %d, using default %d Hz\n", 
     795+                       bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK); 
     796+       } 
     797+       return BCMA_CC_PMU_HT_CLOCK; 
     798+} 
     799+ 
     800+/* query cpu clock frequency for PMU-enabled chipcommon */ 
     801+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc) 
     802+{ 
     803+       struct bcma_bus *bus = cc->core->bus; 
     804+ 
     805+       if (bus->chipinfo.id == 53572) 
     806+               return 300000000; 
     807+ 
     808+       if (cc->pmu.rev >= 5) { 
     809+               u32 pll; 
     810+               switch (bus->chipinfo.id) { 
     811+               case 0x5356: 
     812+                       pll = BCMA_CC_PMU5356_MAINPLL_PLL0; 
     813+                       break; 
     814+               case 0x5357: 
     815+               case 0x4749: 
     816+                       pll = BCMA_CC_PMU5357_MAINPLL_PLL0; 
     817+                       break; 
     818+               default: 
     819+                       pll = BCMA_CC_PMU4716_MAINPLL_PLL0; 
     820+                       break; 
     821+               } 
     822+ 
     823+               /* TODO: if (bus->chipinfo.id == 0x5300) 
     824+                 return si_4706_pmu_clock(sih, osh, cc, PMU4706_MAINPLL_PLL0, PMU5_MAINPLL_CPU); */ 
     825+               return bcma_pmu_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU); 
     826+       } 
     827+ 
     828+       return bcma_pmu_get_clockcontrol(cc); 
     829+} 
    570830--- /dev/null 
    571831+++ b/drivers/bcma/driver_pci.c 
    572 @@ -0,0 +1,223 @@ 
     832@@ -0,0 +1,237 @@ 
    573833+/* 
    574834+ * Broadcom specific AMBA 
     
    576836+ * 
    577837+ * Copyright 2005, Broadcom Corporation 
    578 + * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     838+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
    579839+ * 
    580840+ * Licensed under the GNU/GPL. See COPYING for details. 
     
    7451005+               return false; 
    7461006+ 
    747 +       if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI) 
     1007+#ifdef CONFIG_SSB_DRIVER_PCICORE 
     1008+       if (bus->sprom.boardflags_lo & SSB_BFL_NOPCI) 
    7481009+               return false; 
     1010+#endif /* CONFIG_SSB_DRIVER_PCICORE */ 
    7491011+ 
    7501012+#if 0 
     
    7601022+void bcma_core_pci_init(struct bcma_drv_pci *pc) 
    7611023+{ 
     1024+       if (pc->setup_done) 
     1025+               return; 
     1026+ 
    7621027+       if (bcma_core_pci_is_in_hostmode(pc)) { 
    7631028+#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE 
     
    7691034+               bcma_core_pci_clientmode_init(pc); 
    7701035+       } 
     1036+ 
     1037+       pc->setup_done = true; 
    7711038+} 
    7721039+ 
     
    7761043+       struct pci_dev *pdev = pc->core->bus->host_pci; 
    7771044+       u32 coremask, tmp; 
    778 +       int err; 
     1045+       int err = 0; 
     1046+ 
     1047+       if (core->bus->hosttype != BCMA_HOSTTYPE_PCI) { 
     1048+               /* This bcma device is not on a PCI host-bus. So the IRQs are 
     1049+                * not routed through the PCI core. 
     1050+                * So we must not enable routing through the PCI core. */ 
     1051+               goto out; 
     1052+       } 
    7791053+ 
    7801054+       err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp); 
     
    7961070--- /dev/null 
    7971071+++ b/drivers/bcma/host_pci.c 
    798 @@ -0,0 +1,251 @@ 
     1072@@ -0,0 +1,299 @@ 
    7991073+/* 
    8001074+ * Broadcom specific AMBA 
     
    8081082+#include <linux/bcma/bcma.h> 
    8091083+#include <linux/pci.h> 
     1084+#include <linux/module.h> 
    8101085+ 
    8111086+static void bcma_host_pci_switch_core(struct bcma_device *core) 
     
    8191094+} 
    8201095+ 
    821 +static u8 bcma_host_pci_read8(struct bcma_device *core, u16 offset) 
    822 +{ 
     1096+/* Provides access to the requested core. Returns base offset that has to be 
     1097+ * used. It makes use of fixed windows when possible. */ 
     1098+static u16 bcma_host_pci_provide_access_to_core(struct bcma_device *core) 
     1099+{ 
     1100+       switch (core->id.id) { 
     1101+       case BCMA_CORE_CHIPCOMMON: 
     1102+               return 3 * BCMA_CORE_SIZE; 
     1103+       case BCMA_CORE_PCIE: 
     1104+               return 2 * BCMA_CORE_SIZE; 
     1105+       } 
     1106+ 
    8231107+       if (core->bus->mapped_core != core) 
    8241108+               bcma_host_pci_switch_core(core); 
     1109+       return 0; 
     1110+} 
     1111+ 
     1112+static u8 bcma_host_pci_read8(struct bcma_device *core, u16 offset) 
     1113+{ 
     1114+       offset += bcma_host_pci_provide_access_to_core(core); 
    8251115+       return ioread8(core->bus->mmio + offset); 
    8261116+} 
     
    8281118+static u16 bcma_host_pci_read16(struct bcma_device *core, u16 offset) 
    8291119+{ 
    830 +       if (core->bus->mapped_core != core) 
    831 +               bcma_host_pci_switch_core(core); 
     1120+       offset += bcma_host_pci_provide_access_to_core(core); 
    8321121+       return ioread16(core->bus->mmio + offset); 
    8331122+} 
     
    8351124+static u32 bcma_host_pci_read32(struct bcma_device *core, u16 offset) 
    8361125+{ 
    837 +       if (core->bus->mapped_core != core) 
    838 +               bcma_host_pci_switch_core(core); 
     1126+       offset += bcma_host_pci_provide_access_to_core(core); 
    8391127+       return ioread32(core->bus->mmio + offset); 
    8401128+} 
     
    8431131+                                u8 value) 
    8441132+{ 
    845 +       if (core->bus->mapped_core != core) 
    846 +               bcma_host_pci_switch_core(core); 
     1133+       offset += bcma_host_pci_provide_access_to_core(core); 
    8471134+       iowrite8(value, core->bus->mmio + offset); 
    8481135+} 
     
    8511138+                                u16 value) 
    8521139+{ 
    853 +       if (core->bus->mapped_core != core) 
    854 +               bcma_host_pci_switch_core(core); 
     1140+       offset += bcma_host_pci_provide_access_to_core(core); 
    8551141+       iowrite16(value, core->bus->mmio + offset); 
    8561142+} 
     
    8591145+                                u32 value) 
    8601146+{ 
    861 +       if (core->bus->mapped_core != core) 
    862 +               bcma_host_pci_switch_core(core); 
     1147+       offset += bcma_host_pci_provide_access_to_core(core); 
    8631148+       iowrite32(value, core->bus->mmio + offset); 
    8641149+} 
     
    10221307+} 
    10231308+ 
     1309+#ifdef CONFIG_PM 
     1310+static int bcma_host_pci_suspend(struct pci_dev *dev, pm_message_t state) 
     1311+{ 
     1312+       /* Host specific */ 
     1313+       pci_save_state(dev); 
     1314+       pci_disable_device(dev); 
     1315+       pci_set_power_state(dev, pci_choose_state(dev, state)); 
     1316+ 
     1317+       return 0; 
     1318+} 
     1319+ 
     1320+static int bcma_host_pci_resume(struct pci_dev *dev) 
     1321+{ 
     1322+       struct bcma_bus *bus = pci_get_drvdata(dev); 
     1323+       int err; 
     1324+ 
     1325+       /* Host specific */ 
     1326+       pci_set_power_state(dev, 0); 
     1327+       err = pci_enable_device(dev); 
     1328+       if (err) 
     1329+               return err; 
     1330+       pci_restore_state(dev); 
     1331+ 
     1332+       /* Bus specific */ 
     1333+       err = bcma_bus_resume(bus); 
     1334+       if (err) 
     1335+               return err; 
     1336+ 
     1337+       return 0; 
     1338+} 
     1339+#else /* CONFIG_PM */ 
     1340+# define bcma_host_pci_suspend NULL 
     1341+# define bcma_host_pci_resume  NULL 
     1342+#endif /* CONFIG_PM */ 
     1343+ 
    10241344+static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { 
    10251345+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) }, 
     
    10371357+       .probe = bcma_host_pci_probe, 
    10381358+       .remove = bcma_host_pci_remove, 
     1359+       .suspend = bcma_host_pci_suspend, 
     1360+       .resume = bcma_host_pci_resume, 
    10391361+}; 
    10401362+ 
     
    10501372--- /dev/null 
    10511373+++ b/drivers/bcma/main.c 
    1052 @@ -0,0 +1,257 @@ 
     1374@@ -0,0 +1,354 @@ 
    10531375+/* 
    10541376+ * Broadcom specific AMBA 
     
    10591381+ 
    10601382+#include "bcma_private.h" 
     1383+#include <linux/module.h> 
    10611384+#include <linux/bcma/bcma.h> 
    10621385+#include <linux/slab.h> 
     
    10681391+static int bcma_device_probe(struct device *dev); 
    10691392+static int bcma_device_remove(struct device *dev); 
     1393+static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env); 
    10701394+ 
    10711395+static ssize_t manuf_show(struct device *dev, struct device_attribute *attr, char *buf) 
     
    11021426+       .probe          = bcma_device_probe, 
    11031427+       .remove         = bcma_device_remove, 
     1428+       .uevent         = bcma_device_uevent, 
    11041429+       .dev_attrs      = bcma_device_attrs, 
    11051430+}; 
     
    11191444+{ 
    11201445+       struct bcma_device *core = container_of(dev, struct bcma_device, dev); 
     1446+       if (core->io_addr) 
     1447+               iounmap(core->io_addr); 
     1448+       if (core->io_wrap) 
     1449+               iounmap(core->io_wrap); 
    11211450+       kfree(core); 
    11221451+} 
     
    11331462+               case BCMA_CORE_PCI: 
    11341463+               case BCMA_CORE_PCIE: 
     1464+               case BCMA_CORE_MIPS_74K: 
    11351465+                       continue; 
    11361466+               } 
     
    11461476+                       core->irq = bus->host_pci->irq; 
    11471477+                       break; 
    1148 +               case BCMA_HOSTTYPE_NONE: 
     1478+               case BCMA_HOSTTYPE_SOC: 
     1479+                       core->dev.dma_mask = &core->dev.coherent_dma_mask; 
     1480+                       core->dma_dev = &core->dev; 
     1481+                       break; 
    11491482+               case BCMA_HOSTTYPE_SDIO: 
    11501483+                       break; 
     
    11931526+       } 
    11941527+ 
     1528+       /* Init MIPS core */ 
     1529+       core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     1530+       if (core) { 
     1531+               bus->drv_mips.core = core; 
     1532+               bcma_core_mips_init(&bus->drv_mips); 
     1533+       } 
     1534+ 
    11951535+       /* Init PCIE core */ 
    11961536+       core = bcma_find_core(bus, BCMA_CORE_PCIE); 
     
    12221562+} 
    12231563+ 
     1564+int __init bcma_bus_early_register(struct bcma_bus *bus, 
     1565+                                  struct bcma_device *core_cc, 
     1566+                                  struct bcma_device *core_mips) 
     1567+{ 
     1568+       int err; 
     1569+       struct bcma_device *core; 
     1570+       struct bcma_device_id match; 
     1571+ 
     1572+       bcma_init_bus(bus); 
     1573+ 
     1574+       match.manuf = BCMA_MANUF_BCM; 
     1575+       match.id = BCMA_CORE_CHIPCOMMON; 
     1576+       match.class = BCMA_CL_SIM; 
     1577+       match.rev = BCMA_ANY_REV; 
     1578+ 
     1579+       /* Scan for chip common core */ 
     1580+       err = bcma_bus_scan_early(bus, &match, core_cc); 
     1581+       if (err) { 
     1582+               pr_err("Failed to scan for common core: %d\n", err); 
     1583+               return -1; 
     1584+       } 
     1585+ 
     1586+       match.manuf = BCMA_MANUF_MIPS; 
     1587+       match.id = BCMA_CORE_MIPS_74K; 
     1588+       match.class = BCMA_CL_SIM; 
     1589+       match.rev = BCMA_ANY_REV; 
     1590+ 
     1591+       /* Scan for mips core */ 
     1592+       err = bcma_bus_scan_early(bus, &match, core_mips); 
     1593+       if (err) { 
     1594+               pr_err("Failed to scan for mips core: %d\n", err); 
     1595+               return -1; 
     1596+       } 
     1597+ 
     1598+       /* Init CC core */ 
     1599+       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     1600+       if (core) { 
     1601+               bus->drv_cc.core = core; 
     1602+               bcma_core_chipcommon_init(&bus->drv_cc); 
     1603+       } 
     1604+ 
     1605+       /* Init MIPS core */ 
     1606+       core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     1607+       if (core) { 
     1608+               bus->drv_mips.core = core; 
     1609+               bcma_core_mips_init(&bus->drv_mips); 
     1610+       } 
     1611+ 
     1612+       pr_info("Early bus registered\n"); 
     1613+ 
     1614+       return 0; 
     1615+} 
     1616+ 
     1617+#ifdef CONFIG_PM 
     1618+int bcma_bus_resume(struct bcma_bus *bus) 
     1619+{ 
     1620+       struct bcma_device *core; 
     1621+ 
     1622+       /* Init CC core */ 
     1623+       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     1624+       if (core) { 
     1625+               bus->drv_cc.setup_done = false; 
     1626+               bcma_core_chipcommon_init(&bus->drv_cc); 
     1627+       } 
     1628+ 
     1629+       return 0; 
     1630+} 
     1631+#endif 
     1632+ 
    12241633+int __bcma_driver_register(struct bcma_driver *drv, struct module *owner) 
    12251634+{ 
     
    12801689+} 
    12811690+ 
     1691+static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env) 
     1692+{ 
     1693+       struct bcma_device *core = container_of(dev, struct bcma_device, dev); 
     1694+ 
     1695+       return add_uevent_var(env, 
     1696+                             "MODALIAS=bcma:m%04Xid%04Xrev%02Xcl%02X", 
     1697+                             core->id.manuf, core->id.id, 
     1698+                             core->id.rev, core->id.class); 
     1699+} 
     1700+ 
    12821701+static int __init bcma_modinit(void) 
    12831702+{ 
     
    13101729--- /dev/null 
    13111730+++ b/drivers/bcma/scan.c 
    1312 @@ -0,0 +1,360 @@ 
     1731@@ -0,0 +1,486 @@ 
    13131732+/* 
    13141733+ * Broadcom specific AMBA 
     
    15131932+} 
    15141933+ 
    1515 +int bcma_bus_scan(struct bcma_bus *bus) 
    1516 +{ 
    1517 +       u32 erombase; 
    1518 +       u32 __iomem *eromptr, *eromend; 
    1519 + 
     1934+static struct bcma_device *bcma_find_core_by_index(struct bcma_bus *bus, 
     1935+                                                  u16 index) 
     1936+{ 
     1937+       struct bcma_device *core; 
     1938+ 
     1939+       list_for_each_entry(core, &bus->cores, list) { 
     1940+               if (core->core_index == index) 
     1941+                       return core; 
     1942+       } 
     1943+       return NULL; 
     1944+} 
     1945+ 
     1946+static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, 
     1947+                             struct bcma_device_id *match, int core_num, 
     1948+                             struct bcma_device *core) 
     1949+{ 
     1950+       s32 tmp; 
     1951+       u8 i, j; 
    15201952+       s32 cia, cib; 
    15211953+       u8 ports[2], wrappers[2]; 
    15221954+ 
     1955+       /* get CIs */ 
     1956+       cia = bcma_erom_get_ci(bus, eromptr); 
     1957+       if (cia < 0) { 
     1958+               bcma_erom_push_ent(eromptr); 
     1959+               if (bcma_erom_is_end(bus, eromptr)) 
     1960+                       return -ESPIPE; 
     1961+               return -EILSEQ; 
     1962+       } 
     1963+       cib = bcma_erom_get_ci(bus, eromptr); 
     1964+       if (cib < 0) 
     1965+               return -EILSEQ; 
     1966+ 
     1967+       /* parse CIs */ 
     1968+       core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT; 
     1969+       core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT; 
     1970+       core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT; 
     1971+       ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT; 
     1972+       ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT; 
     1973+       wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT; 
     1974+       wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT; 
     1975+       core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT; 
     1976+ 
     1977+       if (((core->id.manuf == BCMA_MANUF_ARM) && 
     1978+            (core->id.id == 0xFFF)) || 
     1979+           (ports[1] == 0)) { 
     1980+               bcma_erom_skip_component(bus, eromptr); 
     1981+               return -ENXIO; 
     1982+       } 
     1983+ 
     1984+       /* check if component is a core at all */ 
     1985+       if (wrappers[0] + wrappers[1] == 0) { 
     1986+               /* we could save addrl of the router 
     1987+               if (cid == BCMA_CORE_OOB_ROUTER) 
     1988+                */ 
     1989+               bcma_erom_skip_component(bus, eromptr); 
     1990+               return -ENXIO; 
     1991+       } 
     1992+ 
     1993+       if (bcma_erom_is_bridge(bus, eromptr)) { 
     1994+               bcma_erom_skip_component(bus, eromptr); 
     1995+               return -ENXIO; 
     1996+       } 
     1997+ 
     1998+       if (bcma_find_core_by_index(bus, core_num)) { 
     1999+               bcma_erom_skip_component(bus, eromptr); 
     2000+               return -ENODEV; 
     2001+       } 
     2002+ 
     2003+       if (match && ((match->manuf != BCMA_ANY_MANUF && 
     2004+             match->manuf != core->id.manuf) || 
     2005+            (match->id != BCMA_ANY_ID && match->id != core->id.id) || 
     2006+            (match->rev != BCMA_ANY_REV && match->rev != core->id.rev) || 
     2007+            (match->class != BCMA_ANY_CLASS && match->class != core->id.class) 
     2008+           )) { 
     2009+               bcma_erom_skip_component(bus, eromptr); 
     2010+               return -ENODEV; 
     2011+       } 
     2012+ 
     2013+       /* get & parse master ports */ 
     2014+       for (i = 0; i < ports[0]; i++) { 
     2015+               s32 mst_port_d = bcma_erom_get_mst_port(bus, eromptr); 
     2016+               if (mst_port_d < 0) 
     2017+                       return -EILSEQ; 
     2018+       } 
     2019+ 
     2020+       /* get & parse slave ports */ 
     2021+       for (i = 0; i < ports[1]; i++) { 
     2022+               for (j = 0; ; j++) { 
     2023+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2024+                               SCAN_ADDR_TYPE_SLAVE, i); 
     2025+                       if (tmp < 0) { 
     2026+                               /* no more entries for port _i_ */ 
     2027+                               /* pr_debug("erom: slave port %d " 
     2028+                                * "has %d descriptors\n", i, j); */ 
     2029+                               break; 
     2030+                       } else { 
     2031+                               if (i == 0 && j == 0) 
     2032+                                       core->addr = tmp; 
     2033+                       } 
     2034+               } 
     2035+       } 
     2036+ 
     2037+       /* get & parse master wrappers */ 
     2038+       for (i = 0; i < wrappers[0]; i++) { 
     2039+               for (j = 0; ; j++) { 
     2040+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2041+                               SCAN_ADDR_TYPE_MWRAP, i); 
     2042+                       if (tmp < 0) { 
     2043+                               /* no more entries for port _i_ */ 
     2044+                               /* pr_debug("erom: master wrapper %d " 
     2045+                                * "has %d descriptors\n", i, j); */ 
     2046+                               break; 
     2047+                       } else { 
     2048+                               if (i == 0 && j == 0) 
     2049+                                       core->wrap = tmp; 
     2050+                       } 
     2051+               } 
     2052+       } 
     2053+ 
     2054+       /* get & parse slave wrappers */ 
     2055+       for (i = 0; i < wrappers[1]; i++) { 
     2056+               u8 hack = (ports[1] == 1) ? 0 : 1; 
     2057+               for (j = 0; ; j++) { 
     2058+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2059+                               SCAN_ADDR_TYPE_SWRAP, i + hack); 
     2060+                       if (tmp < 0) { 
     2061+                               /* no more entries for port _i_ */ 
     2062+                               /* pr_debug("erom: master wrapper %d " 
     2063+                                * has %d descriptors\n", i, j); */ 
     2064+                               break; 
     2065+                       } else { 
     2066+                               if (wrappers[0] == 0 && !i && !j) 
     2067+                                       core->wrap = tmp; 
     2068+                       } 
     2069+               } 
     2070+       } 
     2071+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2072+               core->io_addr = ioremap_nocache(core->addr, BCMA_CORE_SIZE); 
     2073+               if (!core->io_addr) 
     2074+                       return -ENOMEM; 
     2075+               core->io_wrap = ioremap_nocache(core->wrap, BCMA_CORE_SIZE); 
     2076+               if (!core->io_wrap) { 
     2077+                       iounmap(core->io_addr); 
     2078+                       return -ENOMEM; 
     2079+               } 
     2080+       } 
     2081+       return 0; 
     2082+} 
     2083+ 
     2084+void bcma_init_bus(struct bcma_bus *bus) 
     2085+{ 
    15232086+       s32 tmp; 
    1524 +       u8 i, j; 
    1525 + 
    1526 +       int err; 
     2087+ 
     2088+       if (bus->init_done) 
     2089+               return; 
    15272090+ 
    15282091+       INIT_LIST_HEAD(&bus->cores); 
     
    15352098+       bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT; 
    15362099+       bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT; 
     2100+       bus->init_done = true; 
     2101+} 
     2102+ 
     2103+int bcma_bus_scan(struct bcma_bus *bus) 
     2104+{ 
     2105+       u32 erombase; 
     2106+       u32 __iomem *eromptr, *eromend; 
     2107+ 
     2108+       int err, core_num = 0; 
     2109+ 
     2110+       bcma_init_bus(bus); 
    15372111+ 
    15382112+       erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); 
    1539 +       eromptr = bus->mmio; 
     2113+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2114+               eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); 
     2115+               if (!eromptr) 
     2116+                       return -ENOMEM; 
     2117+       } else { 
     2118+               eromptr = bus->mmio; 
     2119+       } 
     2120+ 
    15402121+       eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); 
    15412122+ 
     
    15492130+               core->bus = bus; 
    15502131+ 
    1551 +               /* get CIs */ 
    1552 +               cia = bcma_erom_get_ci(bus, &eromptr); 
    1553 +               if (cia < 0) { 
    1554 +                       bcma_erom_push_ent(&eromptr); 
    1555 +                       if (bcma_erom_is_end(bus, &eromptr)) 
    1556 +                               break; 
    1557 +                       err= -EILSEQ; 
    1558 +                       goto out; 
    1559 +               } 
    1560 +               cib = bcma_erom_get_ci(bus, &eromptr); 
    1561 +               if (cib < 0) { 
    1562 +                       err= -EILSEQ; 
    1563 +                       goto out; 
    1564 +               } 
    1565 + 
    1566 +               /* parse CIs */ 
    1567 +               core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT; 
    1568 +               core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT; 
    1569 +               core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT; 
    1570 +               ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT; 
    1571 +               ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT; 
    1572 +               wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT; 
    1573 +               wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT; 
    1574 +               core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT; 
    1575 + 
    1576 +               if (((core->id.manuf == BCMA_MANUF_ARM) && 
    1577 +                    (core->id.id == 0xFFF)) || 
    1578 +                   (ports[1] == 0)) { 
    1579 +                       bcma_erom_skip_component(bus, &eromptr); 
     2132+               err = bcma_get_next_core(bus, &eromptr, NULL, core_num, core); 
     2133+               if (err == -ENODEV) { 
     2134+                       core_num++; 
    15802135+                       continue; 
    1581 +               } 
    1582 + 
    1583 +               /* check if component is a core at all */ 
    1584 +               if (wrappers[0] + wrappers[1] == 0) { 
    1585 +                       /* we could save addrl of the router 
    1586 +                       if (cid == BCMA_CORE_OOB_ROUTER) 
    1587 +                        */ 
    1588 +                       bcma_erom_skip_component(bus, &eromptr); 
     2136+               } else if (err == -ENXIO) 
    15892137+                       continue; 
    1590 +               } 
    1591 + 
    1592 +               if (bcma_erom_is_bridge(bus, &eromptr)) { 
    1593 +                       bcma_erom_skip_component(bus, &eromptr); 
    1594 +                       continue; 
    1595 +               } 
    1596 + 
    1597 +               /* get & parse master ports */ 
    1598 +               for (i = 0; i < ports[0]; i++) { 
    1599 +                       u32 mst_port_d = bcma_erom_get_mst_port(bus, &eromptr); 
    1600 +                       if (mst_port_d < 0) { 
    1601 +                               err= -EILSEQ; 
    1602 +                               goto out; 
    1603 +                       } 
    1604 +               } 
    1605 + 
    1606 +               /* get & parse slave ports */ 
    1607 +               for (i = 0; i < ports[1]; i++) { 
    1608 +                       for (j = 0; ; j++) { 
    1609 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1610 +                                       SCAN_ADDR_TYPE_SLAVE, i); 
    1611 +                               if (tmp < 0) { 
    1612 +                                       /* no more entries for port _i_ */ 
    1613 +                                       /* pr_debug("erom: slave port %d " 
    1614 +                                        * "has %d descriptors\n", i, j); */ 
    1615 +                                       break; 
    1616 +                               } else { 
    1617 +                                       if (i == 0 && j == 0) 
    1618 +                                               core->addr = tmp; 
    1619 +                               } 
    1620 +                       } 
    1621 +               } 
    1622 + 
    1623 +               /* get & parse master wrappers */ 
    1624 +               for (i = 0; i < wrappers[0]; i++) { 
    1625 +                       for (j = 0; ; j++) { 
    1626 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1627 +                                       SCAN_ADDR_TYPE_MWRAP, i); 
    1628 +                               if (tmp < 0) { 
    1629 +                                       /* no more entries for port _i_ */ 
    1630 +                                       /* pr_debug("erom: master wrapper %d " 
    1631 +                                        * "has %d descriptors\n", i, j); */ 
    1632 +                                       break; 
    1633 +                               } else { 
    1634 +                                       if (i == 0 && j == 0) 
    1635 +                                               core->wrap = tmp; 
    1636 +                               } 
    1637 +                       } 
    1638 +               } 
    1639 + 
    1640 +               /* get & parse slave wrappers */ 
    1641 +               for (i = 0; i < wrappers[1]; i++) { 
    1642 +                       u8 hack = (ports[1] == 1) ? 0 : 1; 
    1643 +                       for (j = 0; ; j++) { 
    1644 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1645 +                                       SCAN_ADDR_TYPE_SWRAP, i + hack); 
    1646 +                               if (tmp < 0) { 
    1647 +                                       /* no more entries for port _i_ */ 
    1648 +                                       /* pr_debug("erom: master wrapper %d " 
    1649 +                                        * has %d descriptors\n", i, j); */ 
    1650 +                                       break; 
    1651 +                               } else { 
    1652 +                                       if (wrappers[0] == 0 && !i && !j) 
    1653 +                                               core->wrap = tmp; 
    1654 +                               } 
    1655 +                       } 
    1656 +               } 
     2138+               else if (err == -ESPIPE) 
     2139+                       break; 
     2140+               else if (err < 0) 
     2141+                       return err; 
     2142+ 
     2143+               core->core_index = core_num++; 
     2144+               bus->nr_cores++; 
    16572145+ 
    16582146+               pr_info("Core %d found: %s " 
    16592147+                       "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n", 
    1660 +                       bus->nr_cores, bcma_device_name(&core->id), 
     2148+                       core->core_index, bcma_device_name(&core->id), 
    16612149+                       core->id.manuf, core->id.id, core->id.rev, 
    16622150+                       core->id.class); 
    16632151+ 
    1664 +               core->core_index = bus->nr_cores++; 
    16652152+               list_add(&core->list, &bus->cores); 
    1666 +               continue; 
    1667 +out: 
    1668 +               return err; 
    1669 +       } 
     2153+       } 
     2154+ 
     2155+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2156+               iounmap(eromptr); 
    16702157+ 
    16712158+       return 0; 
     2159+} 
     2160+ 
     2161+int __init bcma_bus_scan_early(struct bcma_bus *bus, 
     2162+                              struct bcma_device_id *match, 
     2163+                              struct bcma_device *core) 
     2164+{ 
     2165+       u32 erombase; 
     2166+       u32 __iomem *eromptr, *eromend; 
     2167+ 
     2168+       int err = -ENODEV; 
     2169+       int core_num = 0; 
     2170+ 
     2171+       erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); 
     2172+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2173+               eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); 
     2174+               if (!eromptr) 
     2175+                       return -ENOMEM; 
     2176+       } else { 
     2177+               eromptr = bus->mmio; 
     2178+       } 
     2179+ 
     2180+       eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); 
     2181+ 
     2182+       bcma_scan_switch_core(bus, erombase); 
     2183+ 
     2184+       while (eromptr < eromend) { 
     2185+               memset(core, 0, sizeof(*core)); 
     2186+               INIT_LIST_HEAD(&core->list); 
     2187+               core->bus = bus; 
     2188+ 
     2189+               err = bcma_get_next_core(bus, &eromptr, match, core_num, core); 
     2190+               if (err == -ENODEV) { 
     2191+                       core_num++; 
     2192+                       continue; 
     2193+               } else if (err == -ENXIO) 
     2194+                       continue; 
     2195+               else if (err == -ESPIPE) 
     2196+                       break; 
     2197+               else if (err < 0) 
     2198+                       return err; 
     2199+ 
     2200+               core->core_index = core_num++; 
     2201+               bus->nr_cores++; 
     2202+               pr_info("Core %d found: %s " 
     2203+                       "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n", 
     2204+                       core->core_index, bcma_device_name(&core->id), 
     2205+                       core->id.manuf, core->id.id, core->id.rev, 
     2206+                       core->id.class); 
     2207+ 
     2208+               list_add(&core->list, &bus->cores); 
     2209+               err = 0; 
     2210+               break; 
     2211+       } 
     2212+ 
     2213+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2214+               iounmap(eromptr); 
     2215+ 
     2216+       return err; 
    16722217+} 
    16732218--- /dev/null 
     
    17322277--- /dev/null 
    17332278+++ b/include/linux/bcma/bcma.h 
    1734 @@ -0,0 +1,271 @@ 
     2279@@ -0,0 +1,298 @@ 
    17352280+#ifndef LINUX_BCMA_H_ 
    17362281+#define LINUX_BCMA_H_ 
     
    17412286+#include <linux/bcma/bcma_driver_chipcommon.h> 
    17422287+#include <linux/bcma/bcma_driver_pci.h> 
     2288+#include <linux/bcma/bcma_driver_mips.h> 
    17432289+#include <linux/ssb/ssb.h> /* SPROM sharing */ 
    17442290+ 
     
    17492295+ 
    17502296+enum bcma_hosttype { 
    1751 +       BCMA_HOSTTYPE_NONE, 
    17522297+       BCMA_HOSTTYPE_PCI, 
    17532298+       BCMA_HOSTTYPE_SDIO, 
     2299+       BCMA_HOSTTYPE_SOC, 
    17542300+}; 
    17552301+ 
     
    18652411+       struct device dev; 
    18662412+       struct device *dma_dev; 
     2413+ 
    18672414+       unsigned int irq; 
    18682415+       bool dev_registered; 
     
    18722419+       u32 addr; 
    18732420+       u32 wrap; 
     2421+ 
     2422+       void __iomem *io_addr; 
     2423+       void __iomem *io_wrap; 
    18742424+ 
    18752425+       void *drvdata; 
     
    19002450+extern 
    19012451+int __bcma_driver_register(struct bcma_driver *drv, struct module *owner); 
    1902 +static inline int bcma_driver_register(struct bcma_driver *drv) 
    1903 +{ 
    1904 +       return __bcma_driver_register(drv, THIS_MODULE); 
    1905 +} 
     2452+#define bcma_driver_register(drv) \ 
     2453+       __bcma_driver_register(drv, THIS_MODULE) 
     2454+ 
    19062455+extern void bcma_driver_unregister(struct bcma_driver *drv); 
    19072456+ 
     
    19252474+       struct list_head cores; 
    19262475+       u8 nr_cores; 
     2476+       u8 init_done:1; 
    19272477+ 
    19282478+       struct bcma_drv_cc drv_cc; 
    19292479+       struct bcma_drv_pci drv_pci; 
     2480+       struct bcma_drv_mips drv_mips; 
    19302481+ 
    19312482+       /* We decided to share SPROM struct with SSB as long as we do not need 
     
    19342485+}; 
    19352486+ 
    1936 +extern inline u32 bcma_read8(struct bcma_device *core, u16 offset) 
     2487+static inline u32 bcma_read8(struct bcma_device *core, u16 offset) 
    19372488+{ 
    19382489+       return core->bus->ops->read8(core, offset); 
    19392490+} 
    1940 +extern inline u32 bcma_read16(struct bcma_device *core, u16 offset) 
     2491+static inline u32 bcma_read16(struct bcma_device *core, u16 offset) 
    19412492+{ 
    19422493+       return core->bus->ops->read16(core, offset); 
    19432494+} 
    1944 +extern inline u32 bcma_read32(struct bcma_device *core, u16 offset) 
     2495+static inline u32 bcma_read32(struct bcma_device *core, u16 offset) 
    19452496+{ 
    19462497+       return core->bus->ops->read32(core, offset); 
    19472498+} 
    1948 +extern inline 
     2499+static inline 
    19492500+void bcma_write8(struct bcma_device *core, u16 offset, u32 value) 
    19502501+{ 
    19512502+       core->bus->ops->write8(core, offset, value); 
    19522503+} 
    1953 +extern inline 
     2504+static inline 
    19542505+void bcma_write16(struct bcma_device *core, u16 offset, u32 value) 
    19552506+{ 
    19562507+       core->bus->ops->write16(core, offset, value); 
    19572508+} 
    1958 +extern inline 
     2509+static inline 
    19592510+void bcma_write32(struct bcma_device *core, u16 offset, u32 value) 
    19602511+{ 
     
    19622513+} 
    19632514+#ifdef CONFIG_BCMA_BLOCKIO 
    1964 +extern inline void bcma_block_read(struct bcma_device *core, void *buffer, 
     2515+static inline void bcma_block_read(struct bcma_device *core, void *buffer, 
    19652516+                                  size_t count, u16 offset, u8 reg_width) 
    19662517+{ 
    19672518+       core->bus->ops->block_read(core, buffer, count, offset, reg_width); 
    19682519+} 
    1969 +extern inline void bcma_block_write(struct bcma_device *core, const void *buffer, 
    1970 +                                   size_t count, u16 offset, u8 reg_width) 
     2520+static inline void bcma_block_write(struct bcma_device *core, 
     2521+                                   const void *buffer, size_t count, 
     2522+                                   u16 offset, u8 reg_width) 
    19712523+{ 
    19722524+       core->bus->ops->block_write(core, buffer, count, offset, reg_width); 
    19732525+} 
    19742526+#endif 
    1975 +extern inline u32 bcma_aread32(struct bcma_device *core, u16 offset) 
     2527+static inline u32 bcma_aread32(struct bcma_device *core, u16 offset) 
    19762528+{ 
    19772529+       return core->bus->ops->aread32(core, offset); 
    19782530+} 
    1979 +extern inline 
     2531+static inline 
    19802532+void bcma_awrite32(struct bcma_device *core, u16 offset, u32 value) 
    19812533+{ 
     
    19832535+} 
    19842536+ 
    1985 +#define bcma_mask32(cc, offset, mask) \ 
    1986 +       bcma_write32(cc, offset, bcma_read32(cc, offset) & (mask)) 
    1987 +#define bcma_set32(cc, offset, set) \ 
    1988 +       bcma_write32(cc, offset, bcma_read32(cc, offset) | (set)) 
    1989 +#define bcma_maskset32(cc, offset, mask, set) \ 
    1990 +       bcma_write32(cc, offset, (bcma_read32(cc, offset) & (mask)) | (set)) 
     2537+static inline void bcma_mask32(struct bcma_device *cc, u16 offset, u32 mask) 
     2538+{ 
     2539+       bcma_write32(cc, offset, bcma_read32(cc, offset) & mask); 
     2540+} 
     2541+static inline void bcma_set32(struct bcma_device *cc, u16 offset, u32 set) 
     2542+{ 
     2543+       bcma_write32(cc, offset, bcma_read32(cc, offset) | set); 
     2544+} 
     2545+static inline void bcma_maskset32(struct bcma_device *cc, 
     2546+                                 u16 offset, u32 mask, u32 set) 
     2547+{ 
     2548+       bcma_write32(cc, offset, (bcma_read32(cc, offset) & mask) | set); 
     2549+} 
     2550+static inline void bcma_mask16(struct bcma_device *cc, u16 offset, u16 mask) 
     2551+{ 
     2552+       bcma_write16(cc, offset, bcma_read16(cc, offset) & mask); 
     2553+} 
     2554+static inline void bcma_set16(struct bcma_device *cc, u16 offset, u16 set) 
     2555+{ 
     2556+       bcma_write16(cc, offset, bcma_read16(cc, offset) | set); 
     2557+} 
     2558+static inline void bcma_maskset16(struct bcma_device *cc, 
     2559+                                 u16 offset, u16 mask, u16 set) 
     2560+{ 
     2561+       bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set); 
     2562+} 
    19912563+ 
    19922564+extern bool bcma_core_is_enabled(struct bcma_device *core); 
     
    20062578--- /dev/null 
    20072579+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    2008 @@ -0,0 +1,296 @@ 
     2580@@ -0,0 +1,391 @@ 
    20092581+#ifndef LINUX_BCMA_DRIVER_CC_H_ 
    20102582+#define LINUX_BCMA_DRIVER_CC_H_ 
     
    20332605+#define   BCMA_CC_FLASHT_STSER         0x00000100      /* ST serial flash */ 
    20342606+#define   BCMA_CC_FLASHT_ATSER         0x00000200      /* Atmel serial flash */ 
     2607+#define   BCMA_CC_FLASHT_NFLASH                0x00000200 
    20352608+#define          BCMA_CC_FLASHT_PARA           0x00000700      /* Parallel flash */ 
    20362609+#define  BCMA_CC_CAP_PLLT              0x00038000      /* PLL Type */ 
     
    21872760+#define BCMA_CC_PROG_WAITCNT           0x0124 
    21882761+#define BCMA_CC_FLASH_CFG              0x0128 
     2762+#define  BCMA_CC_FLASH_CFG_DS          0x0010  /* Data size, 0=8bit, 1=16bit */ 
    21892763+#define BCMA_CC_FLASH_WAITCNT          0x012C 
    21902764+/* 0x1E0 is defined as shared BCMA_CLKCTLST */ 
     
    22102784+#define  BCMA_CC_PMU_CTL_ILP_DIV       0xFFFF0000 /* ILP div mask */ 
    22112785+#define  BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16 
     2786+#define  BCMA_CC_PMU_CTL_PLL_UPD       0x00000400 
    22122787+#define  BCMA_CC_PMU_CTL_NOILPONW      0x00000200 /* No ILP on wait */ 
    22132788+#define  BCMA_CC_PMU_CTL_HTREQEN       0x00000100 /* HT req enable */ 
     
    22482823+#define BCMA_CC_SPROM_PCIE6            0x0830 /* SPROM beginning on PCIe rev >= 6 */ 
    22492824+ 
     2825+/* Divider allocation in 4716/47162/5356 */ 
     2826+#define BCMA_CC_PMU5_MAINPLL_CPU       1 
     2827+#define BCMA_CC_PMU5_MAINPLL_MEM       2 
     2828+#define BCMA_CC_PMU5_MAINPLL_SSB       3 
     2829+ 
     2830+/* PLL usage in 4716/47162 */ 
     2831+#define BCMA_CC_PMU4716_MAINPLL_PLL0   12 
     2832+ 
     2833+/* PLL usage in 5356/5357 */ 
     2834+#define BCMA_CC_PMU5356_MAINPLL_PLL0   0 
     2835+#define BCMA_CC_PMU5357_MAINPLL_PLL0   0 
     2836+ 
     2837+/* 4706 PMU */ 
     2838+#define BCMA_CC_PMU4706_MAINPLL_PLL0   0 
     2839+ 
     2840+/* ALP clock on pre-PMU chips */ 
     2841+#define BCMA_CC_PMU_ALP_CLOCK          20000000 
     2842+/* HT clock for systems with PMU-enabled chipcommon */ 
     2843+#define BCMA_CC_PMU_HT_CLOCK           80000000 
     2844+ 
     2845+/* PMU rev 5 (& 6) */ 
     2846+#define BCMA_CC_PPL_P1P2_OFF           0 
     2847+#define BCMA_CC_PPL_P1_MASK            0x0f000000 
     2848+#define BCMA_CC_PPL_P1_SHIFT           24 
     2849+#define BCMA_CC_PPL_P2_MASK            0x00f00000 
     2850+#define BCMA_CC_PPL_P2_SHIFT           20 
     2851+#define BCMA_CC_PPL_M14_OFF            1 
     2852+#define BCMA_CC_PPL_MDIV_MASK          0x000000ff 
     2853+#define BCMA_CC_PPL_MDIV_WIDTH         8 
     2854+#define BCMA_CC_PPL_NM5_OFF            2 
     2855+#define BCMA_CC_PPL_NDIV_MASK          0xfff00000 
     2856+#define BCMA_CC_PPL_NDIV_SHIFT         20 
     2857+#define BCMA_CC_PPL_FMAB_OFF           3 
     2858+#define BCMA_CC_PPL_MRAT_MASK          0xf0000000 
     2859+#define BCMA_CC_PPL_MRAT_SHIFT         28 
     2860+#define BCMA_CC_PPL_ABRAT_MASK         0x08000000 
     2861+#define BCMA_CC_PPL_ABRAT_SHIFT                27 
     2862+#define BCMA_CC_PPL_FDIV_MASK          0x07ffffff 
     2863+#define BCMA_CC_PPL_PLLCTL_OFF         4 
     2864+#define BCMA_CC_PPL_PCHI_OFF           5 
     2865+#define BCMA_CC_PPL_PCHI_MASK          0x0000003f 
     2866+ 
     2867+/* BCM4331 ChipControl numbers. */ 
     2868+#define BCMA_CHIPCTL_4331_BT_COEXIST           BIT(0)  /* 0 disable */ 
     2869+#define BCMA_CHIPCTL_4331_SECI                 BIT(1)  /* 0 SECI is disabled (JATG functional) */ 
     2870+#define BCMA_CHIPCTL_4331_EXT_LNA              BIT(2)  /* 0 disable */ 
     2871+#define BCMA_CHIPCTL_4331_SPROM_GPIO13_15      BIT(3)  /* sprom/gpio13-15 mux */ 
     2872+#define BCMA_CHIPCTL_4331_EXTPA_EN             BIT(4)  /* 0 ext pa disable, 1 ext pa enabled */ 
     2873+#define BCMA_CHIPCTL_4331_GPIOCLK_ON_SPROMCS   BIT(5)  /* set drive out GPIO_CLK on sprom_cs pin */ 
     2874+#define BCMA_CHIPCTL_4331_PCIE_MDIO_ON_SPROMCS BIT(6)  /* use sprom_cs pin as PCIE mdio interface */ 
     2875+#define BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5     BIT(7)  /* aband extpa will be at gpio2/5 and sprom_dout */ 
     2876+#define BCMA_CHIPCTL_4331_OVR_PIPEAUXCLKEN     BIT(8)  /* override core control on pipe_AuxClkEnable */ 
     2877+#define BCMA_CHIPCTL_4331_OVR_PIPEAUXPWRDOWN   BIT(9)  /* override core control on pipe_AuxPowerDown */ 
     2878+#define BCMA_CHIPCTL_4331_PCIE_AUXCLKEN                BIT(10) /* pcie_auxclkenable */ 
     2879+#define BCMA_CHIPCTL_4331_PCIE_PIPE_PLLDOWN    BIT(11) /* pcie_pipe_pllpowerdown */ 
     2880+#define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4     BIT(16) /* enable bt_shd0 at gpio4 */ 
     2881+#define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5     BIT(17) /* enable bt_shd1 at gpio5 */ 
     2882+ 
    22502883+/* Data for the PMU, if available. 
    22512884+ * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) 
     
    22562889+}; 
    22572890+ 
     2891+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     2892+struct bcma_pflash { 
     2893+       u8 buswidth; 
     2894+       u32 window; 
     2895+       u32 window_size; 
     2896+}; 
     2897+ 
     2898+struct bcma_serial_port { 
     2899+       void *regs; 
     2900+       unsigned long clockspeed; 
     2901+       unsigned int irq; 
     2902+       unsigned int baud_base; 
     2903+       unsigned int reg_shift; 
     2904+}; 
     2905+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     2906+ 
    22582907+struct bcma_drv_cc { 
    22592908+       struct bcma_device *core; 
     
    22612910+       u32 capabilities; 
    22622911+       u32 capabilities_ext; 
     2912+       u8 setup_done:1; 
    22632913+       /* Fast Powerup Delay constant */ 
    22642914+       u16 fast_pwrup_delay; 
    22652915+       struct bcma_chipcommon_pmu pmu; 
     2916+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     2917+       struct bcma_pflash pflash; 
     2918+ 
     2919+       int nr_serial_ports; 
     2920+       struct bcma_serial_port serial_ports[4]; 
     2921+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    22662922+}; 
    22672923+ 
     
    22832939+extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); 
    22842940+extern void bcma_chipco_resume(struct bcma_drv_cc *cc); 
     2941+ 
     2942+void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); 
    22852943+ 
    22862944+extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, 
     
    23012959+/* PMU support */ 
    23022960+extern void bcma_pmu_init(struct bcma_drv_cc *cc); 
     2961+ 
     2962+extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, 
     2963+                                 u32 value); 
     2964+extern void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, 
     2965+                                   u32 mask, u32 set); 
     2966+extern void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
     2967+                                       u32 offset, u32 mask, u32 set); 
     2968+extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, 
     2969+                                      u32 offset, u32 mask, u32 set); 
    23032970+ 
    23042971+#endif /* LINUX_BCMA_DRIVER_CC_H_ */ 
     
    25253192--- /dev/null 
    25263193+++ b/drivers/bcma/sprom.c 
    2527 @@ -0,0 +1,171 @@ 
     3194@@ -0,0 +1,247 @@ 
    25283195+/* 
    25293196+ * Broadcom specific AMBA 
     
    26573324+       int i; 
    26583325+ 
     3326+       bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 
     3327+               SSB_SPROM_REVISION_REV; 
     3328+ 
    26593329+       for (i = 0; i < 3; i++) { 
    26603330+               v = sprom[SPOFF(SSB_SPROM8_IL0MAC) + i]; 
    26613331+               *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v); 
    26623332+       } 
     3333+ 
     3334+       bus->sprom.board_rev = sprom[SPOFF(SSB_SPROM8_BOARDREV)]; 
     3335+ 
     3336+       bus->sprom.txpid2g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] & 
     3337+            SSB_SPROM4_TXPID2G0) >> SSB_SPROM4_TXPID2G0_SHIFT; 
     3338+       bus->sprom.txpid2g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] & 
     3339+            SSB_SPROM4_TXPID2G1) >> SSB_SPROM4_TXPID2G1_SHIFT; 
     3340+       bus->sprom.txpid2g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] & 
     3341+            SSB_SPROM4_TXPID2G2) >> SSB_SPROM4_TXPID2G2_SHIFT; 
     3342+       bus->sprom.txpid2g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] & 
     3343+            SSB_SPROM4_TXPID2G3) >> SSB_SPROM4_TXPID2G3_SHIFT; 
     3344+ 
     3345+       bus->sprom.txpid5gl[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] & 
     3346+            SSB_SPROM4_TXPID5GL0) >> SSB_SPROM4_TXPID5GL0_SHIFT; 
     3347+       bus->sprom.txpid5gl[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] & 
     3348+            SSB_SPROM4_TXPID5GL1) >> SSB_SPROM4_TXPID5GL1_SHIFT; 
     3349+       bus->sprom.txpid5gl[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] & 
     3350+            SSB_SPROM4_TXPID5GL2) >> SSB_SPROM4_TXPID5GL2_SHIFT; 
     3351+       bus->sprom.txpid5gl[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] & 
     3352+            SSB_SPROM4_TXPID5GL3) >> SSB_SPROM4_TXPID5GL3_SHIFT; 
     3353+ 
     3354+       bus->sprom.txpid5g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] & 
     3355+            SSB_SPROM4_TXPID5G0) >> SSB_SPROM4_TXPID5G0_SHIFT; 
     3356+       bus->sprom.txpid5g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] & 
     3357+            SSB_SPROM4_TXPID5G1) >> SSB_SPROM4_TXPID5G1_SHIFT; 
     3358+       bus->sprom.txpid5g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] & 
     3359+            SSB_SPROM4_TXPID5G2) >> SSB_SPROM4_TXPID5G2_SHIFT; 
     3360+       bus->sprom.txpid5g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] & 
     3361+            SSB_SPROM4_TXPID5G3) >> SSB_SPROM4_TXPID5G3_SHIFT; 
     3362+ 
     3363+       bus->sprom.txpid5gh[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] & 
     3364+            SSB_SPROM4_TXPID5GH0) >> SSB_SPROM4_TXPID5GH0_SHIFT; 
     3365+       bus->sprom.txpid5gh[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] & 
     3366+            SSB_SPROM4_TXPID5GH1) >> SSB_SPROM4_TXPID5GH1_SHIFT; 
     3367+       bus->sprom.txpid5gh[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] & 
     3368+            SSB_SPROM4_TXPID5GH2) >> SSB_SPROM4_TXPID5GH2_SHIFT; 
     3369+       bus->sprom.txpid5gh[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] & 
     3370+            SSB_SPROM4_TXPID5GH3) >> SSB_SPROM4_TXPID5GH3_SHIFT; 
     3371+ 
     3372+       bus->sprom.boardflags_lo = sprom[SPOFF(SSB_SPROM8_BFLLO)]; 
     3373+       bus->sprom.boardflags_hi = sprom[SPOFF(SSB_SPROM8_BFLHI)]; 
     3374+       bus->sprom.boardflags2_lo = sprom[SPOFF(SSB_SPROM8_BFL2LO)]; 
     3375+       bus->sprom.boardflags2_hi = sprom[SPOFF(SSB_SPROM8_BFL2HI)]; 
     3376+ 
     3377+       bus->sprom.country_code = sprom[SPOFF(SSB_SPROM8_CCODE)]; 
     3378+ 
     3379+       bus->sprom.fem.ghz2.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3380+               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT; 
     3381+       bus->sprom.fem.ghz2.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3382+               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT; 
     3383+       bus->sprom.fem.ghz2.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3384+               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT; 
     3385+       bus->sprom.fem.ghz2.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3386+               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT; 
     3387+       bus->sprom.fem.ghz2.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3388+               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT; 
     3389+ 
     3390+       bus->sprom.fem.ghz5.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3391+               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT; 
     3392+       bus->sprom.fem.ghz5.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3393+               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT; 
     3394+       bus->sprom.fem.ghz5.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3395+               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT; 
     3396+       bus->sprom.fem.ghz5.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3397+               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT; 
     3398+       bus->sprom.fem.ghz5.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3399+               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT; 
    26633400+} 
    26643401+ 
     
    26793416+       if (!sprom) 
    26803417+               return -ENOMEM; 
     3418+ 
     3419+       if (bus->chipinfo.id == 0x4331) 
     3420+               bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false); 
    26813421+ 
    26823422+       /* Most cards have SPROM moved by additional offset 0x30 (48 dwords). 
     
    26863426+               BCMA_CC_SPROM_PCIE6; 
    26873427+       bcma_sprom_read(bus, offset, sprom); 
     3428+ 
     3429+       if (bus->chipinfo.id == 0x4331) 
     3430+               bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true); 
    26883431+ 
    26893432+       err = bcma_sprom_valid(sprom); 
     
    27143457+       pr_err("No support for PCI core in hostmode yet\n"); 
    27153458+} 
     3459--- /dev/null 
     3460+++ b/drivers/bcma/driver_mips.c 
     3461@@ -0,0 +1,256 @@ 
     3462+/* 
     3463+ * Broadcom specific AMBA 
     3464+ * Broadcom MIPS32 74K core driver 
     3465+ * 
     3466+ * Copyright 2009, Broadcom Corporation 
     3467+ * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     3468+ * Copyright 2010, Bernhard Loos <bernhardloos@googlemail.com> 
     3469+ * Copyright 2011, Hauke Mehrtens <hauke@hauke-m.de> 
     3470+ * 
     3471+ * Licensed under the GNU/GPL. See COPYING for details. 
     3472+ */ 
     3473+ 
     3474+#include "bcma_private.h" 
     3475+ 
     3476+#include <linux/bcma/bcma.h> 
     3477+ 
     3478+#include <linux/serial.h> 
     3479+#include <linux/serial_core.h> 
     3480+#include <linux/serial_reg.h> 
     3481+#include <linux/time.h> 
     3482+ 
     3483+/* The 47162a0 hangs when reading MIPS DMP registers registers */ 
     3484+static inline bool bcma_core_mips_bcm47162a0_quirk(struct bcma_device *dev) 
     3485+{ 
     3486+       return dev->bus->chipinfo.id == 47162 && dev->bus->chipinfo.rev == 0 && 
     3487+              dev->id.id == BCMA_CORE_MIPS_74K; 
     3488+} 
     3489+ 
     3490+/* The 5357b0 hangs when reading USB20H DMP registers */ 
     3491+static inline bool bcma_core_mips_bcm5357b0_quirk(struct bcma_device *dev) 
     3492+{ 
     3493+       return (dev->bus->chipinfo.id == 0x5357 || 
     3494+               dev->bus->chipinfo.id == 0x4749) && 
     3495+              dev->bus->chipinfo.pkg == 11 && 
     3496+              dev->id.id == BCMA_CORE_USB20_HOST; 
     3497+} 
     3498+ 
     3499+static inline u32 mips_read32(struct bcma_drv_mips *mcore, 
     3500+                             u16 offset) 
     3501+{ 
     3502+       return bcma_read32(mcore->core, offset); 
     3503+} 
     3504+ 
     3505+static inline void mips_write32(struct bcma_drv_mips *mcore, 
     3506+                               u16 offset, 
     3507+                               u32 value) 
     3508+{ 
     3509+       bcma_write32(mcore->core, offset, value); 
     3510+} 
     3511+ 
     3512+static const u32 ipsflag_irq_mask[] = { 
     3513+       0, 
     3514+       BCMA_MIPS_IPSFLAG_IRQ1, 
     3515+       BCMA_MIPS_IPSFLAG_IRQ2, 
     3516+       BCMA_MIPS_IPSFLAG_IRQ3, 
     3517+       BCMA_MIPS_IPSFLAG_IRQ4, 
     3518+}; 
     3519+ 
     3520+static const u32 ipsflag_irq_shift[] = { 
     3521+       0, 
     3522+       BCMA_MIPS_IPSFLAG_IRQ1_SHIFT, 
     3523+       BCMA_MIPS_IPSFLAG_IRQ2_SHIFT, 
     3524+       BCMA_MIPS_IPSFLAG_IRQ3_SHIFT, 
     3525+       BCMA_MIPS_IPSFLAG_IRQ4_SHIFT, 
     3526+}; 
     3527+ 
     3528+static u32 bcma_core_mips_irqflag(struct bcma_device *dev) 
     3529+{ 
     3530+       u32 flag; 
     3531+ 
     3532+       if (bcma_core_mips_bcm47162a0_quirk(dev)) 
     3533+               return dev->core_index; 
     3534+       if (bcma_core_mips_bcm5357b0_quirk(dev)) 
     3535+               return dev->core_index; 
     3536+       flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30); 
     3537+ 
     3538+       return flag & 0x1F; 
     3539+} 
     3540+ 
     3541+/* Get the MIPS IRQ assignment for a specified device. 
     3542+ * If unassigned, 0 is returned. 
     3543+ */ 
     3544+unsigned int bcma_core_mips_irq(struct bcma_device *dev) 
     3545+{ 
     3546+       struct bcma_device *mdev = dev->bus->drv_mips.core; 
     3547+       u32 irqflag; 
     3548+       unsigned int irq; 
     3549+ 
     3550+       irqflag = bcma_core_mips_irqflag(dev); 
     3551+ 
     3552+       for (irq = 1; irq <= 4; irq++) 
     3553+               if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) & 
     3554+                   (1 << irqflag)) 
     3555+                       return irq; 
     3556+ 
     3557+       return 0; 
     3558+} 
     3559+EXPORT_SYMBOL(bcma_core_mips_irq); 
     3560+ 
     3561+static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) 
     3562+{ 
     3563+       unsigned int oldirq = bcma_core_mips_irq(dev); 
     3564+       struct bcma_bus *bus = dev->bus; 
     3565+       struct bcma_device *mdev = bus->drv_mips.core; 
     3566+       u32 irqflag; 
     3567+ 
     3568+       irqflag = bcma_core_mips_irqflag(dev); 
     3569+       BUG_ON(oldirq == 6); 
     3570+ 
     3571+       dev->irq = irq + 2; 
     3572+ 
     3573+       /* clear the old irq */ 
     3574+       if (oldirq == 0) 
     3575+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0), 
     3576+                           bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) & 
     3577+                           ~(1 << irqflag)); 
     3578+       else 
     3579+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0); 
     3580+ 
     3581+       /* assign the new one */ 
     3582+       if (irq == 0) { 
     3583+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0), 
     3584+                           bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) | 
     3585+                           (1 << irqflag)); 
     3586+       } else { 
     3587+               u32 oldirqflag = bcma_read32(mdev, 
     3588+                                            BCMA_MIPS_MIPS74K_INTMASK(irq)); 
     3589+               if (oldirqflag) { 
     3590+                       struct bcma_device *core; 
     3591+ 
     3592+                       /* backplane irq line is in use, find out who uses 
     3593+                        * it and set user to irq 0 
     3594+                        */ 
     3595+                       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3596+                               if ((1 << bcma_core_mips_irqflag(core)) == 
     3597+                                   oldirqflag) { 
     3598+                                       bcma_core_mips_set_irq(core, 0); 
     3599+                                       break; 
     3600+                               } 
     3601+                       } 
     3602+               } 
     3603+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 
     3604+                            1 << irqflag); 
     3605+       } 
     3606+ 
     3607+       pr_info("set_irq: core 0x%04x, irq %d => %d\n", 
     3608+               dev->id.id, oldirq + 2, irq + 2); 
     3609+} 
     3610+ 
     3611+static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) 
     3612+{ 
     3613+       int i; 
     3614+       static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"}; 
     3615+       printk(KERN_INFO KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id); 
     3616+       for (i = 0; i <= 6; i++) 
     3617+               printk(" %s%s", irq_name[i], i == irq ? "*" : " "); 
     3618+       printk("\n"); 
     3619+} 
     3620+ 
     3621+static void bcma_core_mips_dump_irq(struct bcma_bus *bus) 
     3622+{ 
     3623+       struct bcma_device *core; 
     3624+ 
     3625+       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3626+               bcma_core_mips_print_irq(core, bcma_core_mips_irq(core)); 
     3627+       } 
     3628+} 
     3629+ 
     3630+u32 bcma_cpu_clock(struct bcma_drv_mips *mcore) 
     3631+{ 
     3632+       struct bcma_bus *bus = mcore->core->bus; 
     3633+ 
     3634+       if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU) 
     3635+               return bcma_pmu_get_clockcpu(&bus->drv_cc); 
     3636+ 
     3637+       pr_err("No PMU available, need this to get the cpu clock\n"); 
     3638+       return 0; 
     3639+} 
     3640+EXPORT_SYMBOL(bcma_cpu_clock); 
     3641+ 
     3642+static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore) 
     3643+{ 
     3644+       struct bcma_bus *bus = mcore->core->bus; 
     3645+ 
     3646+       switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
     3647+       case BCMA_CC_FLASHT_STSER: 
     3648+       case BCMA_CC_FLASHT_ATSER: 
     3649+               pr_err("Serial flash not supported.\n"); 
     3650+               break; 
     3651+       case BCMA_CC_FLASHT_PARA: 
     3652+               pr_info("found parallel flash.\n"); 
     3653+               bus->drv_cc.pflash.window = 0x1c000000; 
     3654+               bus->drv_cc.pflash.window_size = 0x02000000; 
     3655+ 
     3656+               if ((bcma_read32(bus->drv_cc.core, BCMA_CC_FLASH_CFG) & 
     3657+                    BCMA_CC_FLASH_CFG_DS) == 0) 
     3658+                       bus->drv_cc.pflash.buswidth = 1; 
     3659+               else 
     3660+                       bus->drv_cc.pflash.buswidth = 2; 
     3661+               break; 
     3662+       default: 
     3663+               pr_err("flash not supported.\n"); 
     3664+       } 
     3665+} 
     3666+ 
     3667+void bcma_core_mips_init(struct bcma_drv_mips *mcore) 
     3668+{ 
     3669+       struct bcma_bus *bus; 
     3670+       struct bcma_device *core; 
     3671+       bus = mcore->core->bus; 
     3672+ 
     3673+       pr_info("Initializing MIPS core...\n"); 
     3674+ 
     3675+       if (!mcore->setup_done) 
     3676+               mcore->assigned_irqs = 1; 
     3677+ 
     3678+       /* Assign IRQs to all cores on the bus */ 
     3679+       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3680+               int mips_irq; 
     3681+               if (core->irq) 
     3682+                       continue; 
     3683+ 
     3684+               mips_irq = bcma_core_mips_irq(core); 
     3685+               if (mips_irq > 4) 
     3686+                       core->irq = 0; 
     3687+               else 
     3688+                       core->irq = mips_irq + 2; 
     3689+               if (core->irq > 5) 
     3690+                       continue; 
     3691+               switch (core->id.id) { 
     3692+               case BCMA_CORE_PCI: 
     3693+               case BCMA_CORE_PCIE: 
     3694+               case BCMA_CORE_ETHERNET: 
     3695+               case BCMA_CORE_ETHERNET_GBIT: 
     3696+               case BCMA_CORE_MAC_GBIT: 
     3697+               case BCMA_CORE_80211: 
     3698+               case BCMA_CORE_USB20_HOST: 
     3699+                       /* These devices get their own IRQ line if available, 
     3700+                        * the rest goes on IRQ0 
     3701+                        */ 
     3702+                       if (mcore->assigned_irqs <= 4) 
     3703+                               bcma_core_mips_set_irq(core, 
     3704+                                                      mcore->assigned_irqs++); 
     3705+                       break; 
     3706+               } 
     3707+       } 
     3708+       pr_info("IRQ reconfiguration done\n"); 
     3709+       bcma_core_mips_dump_irq(bus); 
     3710+ 
     3711+       if (mcore->setup_done) 
     3712+               return; 
     3713+ 
     3714+       bcma_chipco_serial_init(&bus->drv_cc); 
     3715+       bcma_core_mips_flash_detect(mcore); 
     3716+       mcore->setup_done = true; 
     3717+} 
     3718--- /dev/null 
     3719+++ b/drivers/bcma/host_soc.c 
     3720@@ -0,0 +1,183 @@ 
     3721+/* 
     3722+ * Broadcom specific AMBA 
     3723+ * System on Chip (SoC) Host 
     3724+ * 
     3725+ * Licensed under the GNU/GPL. See COPYING for details. 
     3726+ */ 
     3727+ 
     3728+#include "bcma_private.h" 
     3729+#include "scan.h" 
     3730+#include <linux/bcma/bcma.h> 
     3731+#include <linux/bcma/bcma_soc.h> 
     3732+ 
     3733+static u8 bcma_host_soc_read8(struct bcma_device *core, u16 offset) 
     3734+{ 
     3735+       return readb(core->io_addr + offset); 
     3736+} 
     3737+ 
     3738+static u16 bcma_host_soc_read16(struct bcma_device *core, u16 offset) 
     3739+{ 
     3740+       return readw(core->io_addr + offset); 
     3741+} 
     3742+ 
     3743+static u32 bcma_host_soc_read32(struct bcma_device *core, u16 offset) 
     3744+{ 
     3745+       return readl(core->io_addr + offset); 
     3746+} 
     3747+ 
     3748+static void bcma_host_soc_write8(struct bcma_device *core, u16 offset, 
     3749+                                u8 value) 
     3750+{ 
     3751+       writeb(value, core->io_addr + offset); 
     3752+} 
     3753+ 
     3754+static void bcma_host_soc_write16(struct bcma_device *core, u16 offset, 
     3755+                                u16 value) 
     3756+{ 
     3757+       writew(value, core->io_addr + offset); 
     3758+} 
     3759+ 
     3760+static void bcma_host_soc_write32(struct bcma_device *core, u16 offset, 
     3761+                                u32 value) 
     3762+{ 
     3763+       writel(value, core->io_addr + offset); 
     3764+} 
     3765+ 
     3766+#ifdef CONFIG_BCMA_BLOCKIO 
     3767+static void bcma_host_soc_block_read(struct bcma_device *core, void *buffer, 
     3768+                                    size_t count, u16 offset, u8 reg_width) 
     3769+{ 
     3770+       void __iomem *addr = core->io_addr + offset; 
     3771+ 
     3772+       switch (reg_width) { 
     3773+       case sizeof(u8): { 
     3774+               u8 *buf = buffer; 
     3775+ 
     3776+               while (count) { 
     3777+                       *buf = __raw_readb(addr); 
     3778+                       buf++; 
     3779+                       count--; 
     3780+               } 
     3781+               break; 
     3782+       } 
     3783+       case sizeof(u16): { 
     3784+               __le16 *buf = buffer; 
     3785+ 
     3786+               WARN_ON(count & 1); 
     3787+               while (count) { 
     3788+                       *buf = (__force __le16)__raw_readw(addr); 
     3789+                       buf++; 
     3790+                       count -= 2; 
     3791+               } 
     3792+               break; 
     3793+       } 
     3794+       case sizeof(u32): { 
     3795+               __le32 *buf = buffer; 
     3796+ 
     3797+               WARN_ON(count & 3); 
     3798+               while (count) { 
     3799+                       *buf = (__force __le32)__raw_readl(addr); 
     3800+                       buf++; 
     3801+                       count -= 4; 
     3802+               } 
     3803+               break; 
     3804+       } 
     3805+       default: 
     3806+               WARN_ON(1); 
     3807+       } 
     3808+} 
     3809+ 
     3810+static void bcma_host_soc_block_write(struct bcma_device *core, 
     3811+                                     const void *buffer, 
     3812+                                     size_t count, u16 offset, u8 reg_width) 
     3813+{ 
     3814+       void __iomem *addr = core->io_addr + offset; 
     3815+ 
     3816+       switch (reg_width) { 
     3817+       case sizeof(u8): { 
     3818+               const u8 *buf = buffer; 
     3819+ 
     3820+               while (count) { 
     3821+                       __raw_writeb(*buf, addr); 
     3822+                       buf++; 
     3823+                       count--; 
     3824+               } 
     3825+               break; 
     3826+       } 
     3827+       case sizeof(u16): { 
     3828+               const __le16 *buf = buffer; 
     3829+ 
     3830+               WARN_ON(count & 1); 
     3831+               while (count) { 
     3832+                       __raw_writew((__force u16)(*buf), addr); 
     3833+                       buf++; 
     3834+                       count -= 2; 
     3835+               } 
     3836+               break; 
     3837+       } 
     3838+       case sizeof(u32): { 
     3839+               const __le32 *buf = buffer; 
     3840+ 
     3841+               WARN_ON(count & 3); 
     3842+               while (count) { 
     3843+                       __raw_writel((__force u32)(*buf), addr); 
     3844+                       buf++; 
     3845+                       count -= 4; 
     3846+               } 
     3847+               break; 
     3848+       } 
     3849+       default: 
     3850+               WARN_ON(1); 
     3851+       } 
     3852+} 
     3853+#endif /* CONFIG_BCMA_BLOCKIO */ 
     3854+ 
     3855+static u32 bcma_host_soc_aread32(struct bcma_device *core, u16 offset) 
     3856+{ 
     3857+       return readl(core->io_wrap + offset); 
     3858+} 
     3859+ 
     3860+static void bcma_host_soc_awrite32(struct bcma_device *core, u16 offset, 
     3861+                                 u32 value) 
     3862+{ 
     3863+       writel(value, core->io_wrap + offset); 
     3864+} 
     3865+ 
     3866+const struct bcma_host_ops bcma_host_soc_ops = { 
     3867+       .read8          = bcma_host_soc_read8, 
     3868+       .read16         = bcma_host_soc_read16, 
     3869+       .read32         = bcma_host_soc_read32, 
     3870+       .write8         = bcma_host_soc_write8, 
     3871+       .write16        = bcma_host_soc_write16, 
     3872+       .write32        = bcma_host_soc_write32, 
     3873+#ifdef CONFIG_BCMA_BLOCKIO 
     3874+       .block_read     = bcma_host_soc_block_read, 
     3875+       .block_write    = bcma_host_soc_block_write, 
     3876+#endif 
     3877+       .aread32        = bcma_host_soc_aread32, 
     3878+       .awrite32       = bcma_host_soc_awrite32, 
     3879+}; 
     3880+ 
     3881+int __init bcma_host_soc_register(struct bcma_soc *soc) 
     3882+{ 
     3883+       struct bcma_bus *bus = &soc->bus; 
     3884+       int err; 
     3885+ 
     3886+       /* iomap only first core. We have to read some register on this core 
     3887+        * to scan the bus. 
     3888+        */ 
     3889+       bus->mmio = ioremap_nocache(BCMA_ADDR_BASE, BCMA_CORE_SIZE * 1); 
     3890+       if (!bus->mmio) 
     3891+               return -ENOMEM; 
     3892+ 
     3893+       /* Host specific */ 
     3894+       bus->hosttype = BCMA_HOSTTYPE_SOC; 
     3895+       bus->ops = &bcma_host_soc_ops; 
     3896+ 
     3897+       /* Register */ 
     3898+       err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips); 
     3899+       if (err) 
     3900+               iounmap(bus->mmio); 
     3901+ 
     3902+       return err; 
     3903+} 
     3904--- /dev/null 
     3905+++ b/include/linux/bcma/bcma_driver_mips.h 
     3906@@ -0,0 +1,51 @@ 
     3907+#ifndef LINUX_BCMA_DRIVER_MIPS_H_ 
     3908+#define LINUX_BCMA_DRIVER_MIPS_H_ 
     3909+ 
     3910+#define BCMA_MIPS_IPSFLAG              0x0F08 
     3911+/* which sbflags get routed to mips interrupt 1 */ 
     3912+#define  BCMA_MIPS_IPSFLAG_IRQ1                0x0000003F 
     3913+#define  BCMA_MIPS_IPSFLAG_IRQ1_SHIFT  0 
     3914+/* which sbflags get routed to mips interrupt 2 */ 
     3915+#define  BCMA_MIPS_IPSFLAG_IRQ2                0x00003F00 
     3916+#define  BCMA_MIPS_IPSFLAG_IRQ2_SHIFT  8 
     3917+/* which sbflags get routed to mips interrupt 3 */ 
     3918+#define  BCMA_MIPS_IPSFLAG_IRQ3                0x003F0000 
     3919+#define  BCMA_MIPS_IPSFLAG_IRQ3_SHIFT  16 
     3920+/* which sbflags get routed to mips interrupt 4 */ 
     3921+#define  BCMA_MIPS_IPSFLAG_IRQ4                0x3F000000 
     3922+#define  BCMA_MIPS_IPSFLAG_IRQ4_SHIFT  24 
     3923+ 
     3924+/* MIPS 74K core registers */ 
     3925+#define BCMA_MIPS_MIPS74K_CORECTL      0x0000 
     3926+#define BCMA_MIPS_MIPS74K_EXCEPTBASE   0x0004 
     3927+#define BCMA_MIPS_MIPS74K_BIST         0x000C 
     3928+#define BCMA_MIPS_MIPS74K_INTMASK_INT0 0x0014 
     3929+#define BCMA_MIPS_MIPS74K_INTMASK(int) \ 
     3930+       ((int) * 4 + BCMA_MIPS_MIPS74K_INTMASK_INT0) 
     3931+#define BCMA_MIPS_MIPS74K_NMIMASK      0x002C 
     3932+#define BCMA_MIPS_MIPS74K_GPIOSEL      0x0040 
     3933+#define BCMA_MIPS_MIPS74K_GPIOOUT      0x0044 
     3934+#define BCMA_MIPS_MIPS74K_GPIOEN       0x0048 
     3935+#define BCMA_MIPS_MIPS74K_CLKCTLST     0x01E0 
     3936+ 
     3937+#define BCMA_MIPS_OOBSELOUTA30         0x100 
     3938+ 
     3939+struct bcma_device; 
     3940+ 
     3941+struct bcma_drv_mips { 
     3942+       struct bcma_device *core; 
     3943+       u8 setup_done:1; 
     3944+       unsigned int assigned_irqs; 
     3945+}; 
     3946+ 
     3947+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     3948+extern void bcma_core_mips_init(struct bcma_drv_mips *mcore); 
     3949+#else 
     3950+static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { } 
     3951+#endif 
     3952+ 
     3953+extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore); 
     3954+ 
     3955+extern unsigned int bcma_core_mips_irq(struct bcma_device *dev); 
     3956+ 
     3957+#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */ 
     3958--- /dev/null 
     3959+++ b/include/linux/bcma/bcma_soc.h 
     3960@@ -0,0 +1,16 @@ 
     3961+#ifndef LINUX_BCMA_SOC_H_ 
     3962+#define LINUX_BCMA_SOC_H_ 
     3963+ 
     3964+#include <linux/bcma/bcma.h> 
     3965+ 
     3966+struct bcma_soc { 
     3967+       struct bcma_bus bus; 
     3968+       struct bcma_device core_cc; 
     3969+       struct bcma_device core_mips; 
     3970+}; 
     3971+ 
     3972+int __init bcma_host_soc_register(struct bcma_soc *soc); 
     3973+ 
     3974+int bcma_bus_register(struct bcma_bus *bus); 
     3975+ 
     3976+#endif /* LINUX_BCMA_SOC_H_ */ 
  • trunk/target/linux/generic/patches-2.6.30/941-ssb_update.patch

    r27731 r29574  
    3434--- a/drivers/ssb/b43_pci_bridge.c 
    3535+++ b/drivers/ssb/b43_pci_bridge.c 
    36 @@ -24,6 +24,7 @@ static const struct pci_device_id b43_pc 
     36@@ -5,12 +5,13 @@ 
     37  * because of its small size we include it in the SSB core 
     38  * instead of creating a standalone module. 
     39  * 
     40- * Copyright 2007  Michael Buesch <mb@bu3sch.de> 
     41+ * Copyright 2007  Michael Buesch <m@bues.ch> 
     42  * 
     43  * Licensed under the GNU/GPL. See COPYING for details. 
     44  */ 
     45  
     46 #include <linux/pci.h> 
     47+#include <linux/module.h> 
     48 #include <linux/ssb/ssb.h> 
     49  
     50 #include "ssb_private.h" 
     51@@ -24,6 +25,7 @@ static const struct pci_device_id b43_pc 
    3752        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) }, 
    3853        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4315) }, 
     
    4459--- a/drivers/ssb/driver_chipcommon.c 
    4560+++ b/drivers/ssb/driver_chipcommon.c 
     61@@ -3,7 +3,7 @@ 
     62  * Broadcom ChipCommon core driver 
     63  * 
     64  * Copyright 2005, Broadcom Corporation 
     65- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     66+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     67  * 
     68  * Licensed under the GNU/GPL. See COPYING for details. 
     69  */ 
    4670@@ -46,40 +46,66 @@ void ssb_chipco_set_clockmode(struct ssb 
    4771        if (!ccdev) 
     
    193217--- a/drivers/ssb/driver_chipcommon_pmu.c 
    194218+++ b/drivers/ssb/driver_chipcommon_pmu.c 
     219@@ -2,7 +2,7 @@ 
     220  * Sonics Silicon Backplane 
     221  * Broadcom ChipCommon Power Management Unit driver 
     222  * 
     223- * Copyright 2009, Michael Buesch <mb@bu3sch.de> 
     224+ * Copyright 2009, Michael Buesch <m@bues.ch> 
     225  * Copyright 2007, Broadcom Corporation 
     226  * 
     227  * Licensed under the GNU/GPL. See COPYING for details. 
    195228@@ -28,6 +28,21 @@ static void ssb_chipco_pll_write(struct 
    196229        chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, value); 
     
    360393--- a/drivers/ssb/driver_gige.c 
    361394+++ b/drivers/ssb/driver_gige.c 
     395@@ -3,7 +3,7 @@ 
     396  * Broadcom Gigabit Ethernet core driver 
     397  * 
     398  * Copyright 2008, Broadcom Corporation 
     399- * Copyright 2008, Michael Buesch <mb@bu3sch.de> 
     400+ * Copyright 2008, Michael Buesch <m@bues.ch> 
     401  * 
     402  * Licensed under the GNU/GPL. See COPYING for details. 
     403  */ 
    362404@@ -12,6 +12,7 @@ 
    363405 #include <linux/ssb/ssb_driver_gige.h> 
     
    404446--- a/drivers/ssb/driver_mipscore.c 
    405447+++ b/drivers/ssb/driver_mipscore.c 
     448@@ -3,7 +3,7 @@ 
     449  * Broadcom MIPS core driver 
     450  * 
     451  * Copyright 2005, Broadcom Corporation 
     452- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     453+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     454  * 
     455  * Licensed under the GNU/GPL. See COPYING for details. 
     456  */ 
    406457@@ -49,29 +49,54 @@ static const u32 ipsflag_irq_shift[] = { 
    407458  
     
    568619--- a/drivers/ssb/driver_pcicore.c 
    569620+++ b/drivers/ssb/driver_pcicore.c 
     621@@ -3,7 +3,7 @@ 
     622  * Broadcom PCI-core driver 
     623  * 
     624  * Copyright 2005, Broadcom Corporation 
     625- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     626+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     627  * 
     628  * Licensed under the GNU/GPL. See COPYING for details. 
     629  */ 
    570630@@ -15,6 +15,11 @@ 
    571631  
     
    647707        struct ssb_bus *bus = pc->dev->bus; 
    648708        u16 chipid_top; 
    649 @@ -432,25 +408,133 @@ static int pcicore_is_in_hostmode(struct 
     709@@ -432,25 +408,137 @@ static int pcicore_is_in_hostmode(struct 
    650710 } 
    651711 #endif /* CONFIG_SSB_PCICORE_HOSTMODE */ 
     
    760820+static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) 
    761821 { 
    762 +       ssb_pcicore_fix_sprom_core_index(pc); 
     822+       struct ssb_device *pdev = pc->dev; 
     823+       struct ssb_bus *bus = pdev->bus; 
     824+ 
     825+       if (bus->bustype == SSB_BUSTYPE_PCI) 
     826+               ssb_pcicore_fix_sprom_core_index(pc); 
    763827+ 
    764828        /* Disable PCI interrupts. */ 
    765         ssb_write32(pc->dev, SSB_INTVEC, 0); 
     829-       ssb_write32(pc->dev, SSB_INTVEC, 0); 
     830+       ssb_write32(pdev, SSB_INTVEC, 0); 
    766831+ 
    767832+       /* Additional PCIe always once-executed workarounds */ 
     
    785850                ssb_device_enable(dev, 0); 
    786851  
    787 @@ -475,58 +559,104 @@ static void ssb_pcie_write(struct ssb_pc 
     852@@ -475,58 +563,104 @@ static void ssb_pcie_write(struct ssb_pc 
    788853        pcicore_write32(pc, 0x134, data); 
    789854 } 
     
    915980  
    916981 int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc, 
    917 @@ -551,13 +681,13 @@ int ssb_pcicore_dev_irqvecs_enable(struc 
     982@@ -551,13 +685,13 @@ int ssb_pcicore_dev_irqvecs_enable(struc 
    918983        might_sleep_if(pdev->id.coreid != SSB_DEV_PCI); 
    919984  
     
    931996                if (err) 
    932997                        goto out; 
    933 @@ -579,48 +709,10 @@ int ssb_pcicore_dev_irqvecs_enable(struc 
     998@@ -579,48 +713,10 @@ int ssb_pcicore_dev_irqvecs_enable(struc 
    934999        if (pc->setup_done) 
    9351000                goto out; 
     
    9841049--- a/drivers/ssb/main.c 
    9851050+++ b/drivers/ssb/main.c 
    986 @@ -17,6 +17,8 @@ 
     1051@@ -3,7 +3,7 @@ 
     1052  * Subsystem core 
     1053  * 
     1054  * Copyright 2005, Broadcom Corporation 
     1055- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     1056+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     1057  * 
     1058  * Licensed under the GNU/GPL. See COPYING for details. 
     1059  */ 
     1060@@ -12,11 +12,14 @@ 
     1061  
     1062 #include <linux/delay.h> 
     1063 #include <linux/io.h> 
     1064+#include <linux/module.h> 
     1065 #include <linux/ssb/ssb.h> 
     1066 #include <linux/ssb/ssb_regs.h> 
    9871067 #include <linux/ssb/ssb_driver_gige.h> 
    9881068 #include <linux/dma-mapping.h> 
     
    9931073 #include <pcmcia/cs_types.h> 
    9941074 #include <pcmcia/cs.h> 
    995 @@ -88,6 +90,25 @@ found: 
     1075@@ -88,6 +91,25 @@ found: 
    9961076 } 
    9971077 #endif /* CONFIG_SSB_PCMCIAHOST */ 
     
    10191099                          int (*func)(struct ssb_bus *bus, unsigned long data)) 
    10201100 { 
    1021 @@ -120,6 +141,19 @@ static void ssb_device_put(struct ssb_de 
     1101@@ -120,6 +142,19 @@ static void ssb_device_put(struct ssb_de 
    10221102                put_device(dev->dev); 
    10231103 } 
     
    10391119 { 
    10401120        struct ssb_device *ssb_dev = dev_to_ssb_dev(dev); 
    1041 @@ -190,90 +224,81 @@ int ssb_bus_suspend(struct ssb_bus *bus) 
     1121@@ -190,90 +225,81 @@ int ssb_bus_suspend(struct ssb_bus *bus) 
    10421122 EXPORT_SYMBOL(ssb_bus_suspend); 
    10431123  
     
    11821262 #endif /* CONFIG_SSB_SPROM */ 
    11831263  
    1184 @@ -360,6 +385,35 @@ static int ssb_device_uevent(struct devi 
     1264@@ -360,6 +386,35 @@ static int ssb_device_uevent(struct devi 
    11851265                             ssb_dev->id.revision); 
    11861266 } 
     
    12181298        .name           = "ssb", 
    12191299        .match          = ssb_bus_match, 
    1220 @@ -369,6 +423,7 @@ static struct bus_type ssb_bustype = { 
     1300@@ -369,6 +424,7 @@ static struct bus_type ssb_bustype = { 
    12211301        .suspend        = ssb_device_suspend, 
    12221302        .resume         = ssb_device_resume, 
     
    12261306  
    12271307 static void ssb_buses_lock(void) 
    1228 @@ -461,6 +516,7 @@ static int ssb_devices_register(struct s 
     1308@@ -461,6 +517,7 @@ static int ssb_devices_register(struct s 
    12291309 #ifdef CONFIG_SSB_PCIHOST 
    12301310                        sdev->irq = bus->host_pci->irq; 
     
    12341314                        break; 
    12351315                case SSB_BUSTYPE_PCMCIA: 
    1236 @@ -469,8 +525,14 @@ static int ssb_devices_register(struct s 
     1316@@ -469,8 +526,14 @@ static int ssb_devices_register(struct s 
    12371317                        dev->parent = &bus->host_pcmcia->dev; 
    12381318 #endif 
     
    12491329                } 
    12501330  
    1251 @@ -497,7 +559,7 @@ error: 
     1331@@ -497,7 +560,7 @@ error: 
    12521332 } 
    12531333  
     
    12581338        struct ssb_bus *bus, *n; 
    12591339        int err = 0; 
    1260 @@ -708,9 +770,9 @@ out: 
     1340@@ -708,9 +771,9 @@ out: 
    12611341        return err; 
    12621342 } 
     
    12711351        int err; 
    12721352  
    1273 @@ -724,12 +786,18 @@ static int ssb_bus_register(struct ssb_b 
     1353@@ -724,12 +787,18 @@ static int ssb_bus_register(struct ssb_b 
    12741354        err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 1); 
    12751355        if (err) 
     
    12911371        /* Init PCI-host device (if any) */ 
    12921372        err = ssb_pci_init(bus); 
    1293 @@ -776,6 +844,8 @@ err_pci_exit: 
     1373@@ -776,6 +845,8 @@ err_pci_exit: 
    12941374        ssb_pci_exit(bus); 
    12951375 err_unmap: 
     
    13001380        ssb_buses_unlock(); 
    13011381        ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0); 
    1302 @@ -783,8 +853,8 @@ err_disable_xtal: 
     1382@@ -783,8 +854,8 @@ err_disable_xtal: 
    13031383 } 
    13041384  
     
    13111391        int err; 
    13121392  
    1313 @@ -796,6 +866,9 @@ int ssb_bus_pcibus_register(struct ssb_b 
     1393@@ -796,6 +867,9 @@ int ssb_bus_pcibus_register(struct ssb_b 
    13141394        if (!err) { 
    13151395                ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
     
    13211401  
    13221402        return err; 
    1323 @@ -804,9 +877,9 @@ EXPORT_SYMBOL(ssb_bus_pcibus_register); 
     1403@@ -804,9 +878,9 @@ EXPORT_SYMBOL(ssb_bus_pcibus_register); 
    13241404 #endif /* CONFIG_SSB_PCIHOST */ 
    13251405  
     
    13341414        int err; 
    13351415  
    1336 @@ -825,9 +898,32 @@ int ssb_bus_pcmciabus_register(struct ss 
     1416@@ -825,9 +899,32 @@ int ssb_bus_pcmciabus_register(struct ss 
    13371417 EXPORT_SYMBOL(ssb_bus_pcmciabus_register); 
    13381418 #endif /* CONFIG_SSB_PCMCIAHOST */ 
     
    13701450        int err; 
    13711451  
    1372 @@ -908,8 +1004,8 @@ u32 ssb_calc_clock_rate(u32 plltype, u32 
     1452@@ -908,8 +1005,8 @@ u32 ssb_calc_clock_rate(u32 plltype, u32 
    13731453        switch (plltype) { 
    13741454        case SSB_PLLTYPE_6: /* 100/200 or 120/240 only */ 
     
    13811461        case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */ 
    13821462        case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */ 
    1383 @@ -1024,23 +1120,22 @@ static u32 ssb_tmslow_reject_bitmask(str 
     1463@@ -1024,23 +1121,22 @@ static u32 ssb_tmslow_reject_bitmask(str 
    13841464 { 
    13851465        u32 rev = ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_SSBREV; 
     
    14121492  
    14131493 int ssb_device_is_enabled(struct ssb_device *dev) 
    1414 @@ -1099,10 +1194,10 @@ void ssb_device_enable(struct ssb_device 
     1494@@ -1099,10 +1195,10 @@ void ssb_device_enable(struct ssb_device 
    14151495 } 
    14161496 EXPORT_SYMBOL(ssb_device_enable); 
     
    14261506        int i; 
    14271507        u32 val; 
    1428 @@ -1110,7 +1205,7 @@ static int ssb_wait_bit(struct ssb_devic 
     1508@@ -1110,7 +1206,7 @@ static int ssb_wait_bit(struct ssb_devic 
    14291509        for (i = 0; i < timeout; i++) { 
    14301510                val = ssb_read32(dev, reg); 
     
    14351515                } else { 
    14361516                        if (!(val & bitmask)) 
    1437 @@ -1127,20 +1222,38 @@ static int ssb_wait_bit(struct ssb_devic 
     1517@@ -1127,20 +1223,38 @@ static int ssb_wait_bit(struct ssb_devic 
    14381518  
    14391519 void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags) 
     
    14831563        ssb_write32(dev, SSB_TMSLOW, 
    14841564                    reject | SSB_TMSLOW_RESET | 
    1485 @@ -1155,7 +1268,10 @@ u32 ssb_dma_translation(struct ssb_devic 
     1565@@ -1149,13 +1263,34 @@ void ssb_device_disable(struct ssb_devic 
     1566 } 
     1567 EXPORT_SYMBOL(ssb_device_disable); 
     1568  
     1569+/* Some chipsets need routing known for PCIe and 64-bit DMA */ 
     1570+static bool ssb_dma_translation_special_bit(struct ssb_device *dev) 
     1571+{ 
     1572+       u16 chip_id = dev->bus->chip_id; 
     1573+ 
     1574+       if (dev->id.coreid == SSB_DEV_80211) { 
     1575+               return (chip_id == 0x4322 || chip_id == 43221 || 
     1576+                       chip_id == 43231 || chip_id == 43222); 
     1577+       } 
     1578+ 
     1579+       return 0; 
     1580+} 
     1581+ 
     1582 u32 ssb_dma_translation(struct ssb_device *dev) 
     1583 { 
     1584        switch (dev->bus->bustype) { 
    14861585        case SSB_BUSTYPE_SSB: 
    14871586                return 0; 
    14881587        case SSB_BUSTYPE_PCI: 
    14891588-               return SSB_PCI_DMA; 
    1490 +               if (ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) 
     1589+               if (dev->bus->host_pci->is_pcie && 
     1590+                   ssb_read32(dev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64) { 
    14911591+                       return SSB_PCIE_DMA_H32; 
    1492 +               else 
    1493 +                       return SSB_PCI_DMA; 
     1592+               } else { 
     1593+                       if (ssb_dma_translation_special_bit(dev)) 
     1594+                               return SSB_PCIE_DMA_H32; 
     1595+                       else 
     1596+                               return SSB_PCI_DMA; 
     1597+               } 
    14941598        default: 
    14951599                __ssb_dma_not_implemented(dev); 
    14961600        } 
    1497 @@ -1272,20 +1388,20 @@ EXPORT_SYMBOL(ssb_bus_may_powerdown); 
     1601@@ -1272,20 +1407,20 @@ EXPORT_SYMBOL(ssb_bus_may_powerdown); 
    14981602  
    14991603 int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl) 
     
    15201624 error: 
    15211625        ssb_printk(KERN_ERR PFX "Bus powerup failed\n"); 
    1522 @@ -1293,6 +1409,37 @@ error: 
     1626@@ -1293,6 +1428,37 @@ error: 
    15231627 } 
    15241628 EXPORT_SYMBOL(ssb_bus_powerup); 
     
    15581662 { 
    15591663        u32 base = 0; 
    1560 @@ -1358,8 +1505,10 @@ static int __init ssb_modinit(void) 
     1664@@ -1358,8 +1524,10 @@ static int __init ssb_modinit(void) 
    15611665        ssb_buses_lock(); 
    15621666        err = ssb_attach_queued_buses(); 
     
    15701674        err = b43_pci_ssb_bridge_init(); 
    15711675        if (err) { 
    1572 @@ -1375,7 +1524,7 @@ static int __init ssb_modinit(void) 
     1676@@ -1375,7 +1543,7 @@ static int __init ssb_modinit(void) 
    15731677                /* don't fail SSB init because of this */ 
    15741678                err = 0; 
     
    15811685--- a/drivers/ssb/pci.c 
    15821686+++ b/drivers/ssb/pci.c 
     1687@@ -1,7 +1,7 @@ 
     1688 /* 
     1689  * Sonics Silicon Backplane PCI-Hostbus related functions. 
     1690  * 
     1691- * Copyright (C) 2005-2006 Michael Buesch <mb@bu3sch.de> 
     1692+ * Copyright (C) 2005-2006 Michael Buesch <m@bues.ch> 
     1693  * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 
     1694  * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 
     1695  * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 
    15831696@@ -17,6 +17,7 @@ 
    15841697  
     
    17691882        /* Extract the antenna gain values. */ 
    17701883        SPEX(antenna_gain.ghz24.a0, SSB_SPROM8_AGAIN01, 
    1771 @@ -509,6 +607,8 @@ static void sprom_extract_r8(struct ssb_ 
     1884@@ -509,6 +607,31 @@ static void sprom_extract_r8(struct ssb_ 
    17721885        memcpy(&out->antenna_gain.ghz5, &out->antenna_gain.ghz24, 
    17731886               sizeof(out->antenna_gain.ghz5)); 
    17741887  
     1888+       /* Extract FEM info */ 
     1889+       SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, 
     1890+               SSB_SROM8_FEM_TSSIPOS, SSB_SROM8_FEM_TSSIPOS_SHIFT); 
     1891+       SPEX(fem.ghz2.extpa_gain, SSB_SPROM8_FEM2G, 
     1892+               SSB_SROM8_FEM_EXTPA_GAIN, SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); 
     1893+       SPEX(fem.ghz2.pdet_range, SSB_SPROM8_FEM2G, 
     1894+               SSB_SROM8_FEM_PDET_RANGE, SSB_SROM8_FEM_PDET_RANGE_SHIFT); 
     1895+       SPEX(fem.ghz2.tr_iso, SSB_SPROM8_FEM2G, 
     1896+               SSB_SROM8_FEM_TR_ISO, SSB_SROM8_FEM_TR_ISO_SHIFT); 
     1897+       SPEX(fem.ghz2.antswlut, SSB_SPROM8_FEM2G, 
     1898+               SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); 
     1899+ 
     1900+       SPEX(fem.ghz5.tssipos, SSB_SPROM8_FEM5G, 
     1901+               SSB_SROM8_FEM_TSSIPOS, SSB_SROM8_FEM_TSSIPOS_SHIFT); 
     1902+       SPEX(fem.ghz5.extpa_gain, SSB_SPROM8_FEM5G, 
     1903+               SSB_SROM8_FEM_EXTPA_GAIN, SSB_SROM8_FEM_EXTPA_GAIN_SHIFT); 
     1904+       SPEX(fem.ghz5.pdet_range, SSB_SPROM8_FEM5G, 
     1905+               SSB_SROM8_FEM_PDET_RANGE, SSB_SROM8_FEM_PDET_RANGE_SHIFT); 
     1906+       SPEX(fem.ghz5.tr_iso, SSB_SPROM8_FEM5G, 
     1907+               SSB_SROM8_FEM_TR_ISO, SSB_SROM8_FEM_TR_ISO_SHIFT); 
     1908+       SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, 
     1909+               SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); 
     1910+ 
    17751911+       sprom_extract_r458(out, in); 
    17761912+ 
     
    17781914 } 
    17791915  
    1780 @@ -521,36 +621,34 @@ static int sprom_extract(struct ssb_bus 
     1916@@ -521,36 +644,34 @@ static int sprom_extract(struct ssb_bus 
    17811917        ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); 
    17821918        memset(out->et0mac, 0xFF, 6);           /* preset et0 and et1 mac */ 
     
    18361972  
    18371973        if (out->boardflags_lo == 0xFFFF) 
    1838 @@ -564,13 +662,34 @@ static int sprom_extract(struct ssb_bus 
     1974@@ -564,13 +685,34 @@ static int sprom_extract(struct ssb_bus 
    18391975 static int ssb_pci_sprom_get(struct ssb_bus *bus, 
    18401976                             struct ssb_sprom *sprom) 
     
    18742010        sprom_do_read(bus, buf); 
    18752011        err = sprom_check_crc(buf, bus->sprom_size); 
    1876 @@ -580,17 +699,24 @@ static int ssb_pci_sprom_get(struct ssb_ 
     2012@@ -580,17 +722,24 @@ static int ssb_pci_sprom_get(struct ssb_ 
    18772013                buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16), 
    18782014                              GFP_KERNEL); 
     
    19042040                                goto out_free; 
    19052041                        } 
    1906 @@ -602,19 +728,15 @@ static int ssb_pci_sprom_get(struct ssb_ 
     2042@@ -602,19 +751,15 @@ static int ssb_pci_sprom_get(struct ssb_ 
    19072043  
    19082044 out_free: 
     
    19292065--- a/drivers/ssb/pcihost_wrapper.c 
    19302066+++ b/drivers/ssb/pcihost_wrapper.c 
    1931 @@ -12,6 +12,7 @@ 
     2067@@ -6,12 +6,13 @@ 
     2068  * Copyright (c) 2005 Stefano Brivio <st3@riseup.net> 
     2069  * Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org> 
     2070  * Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch> 
     2071- * Copyright (c) 2005-2007 Michael Buesch <mbuesch@freenet.de> 
     2072+ * Copyright (c) 2005-2007 Michael Buesch <m@bues.ch> 
     2073  * 
     2074  * Licensed under the GNU/GPL. See COPYING for details. 
    19322075  */ 
    19332076  
     
    19772120--- a/drivers/ssb/pcmcia.c 
    19782121+++ b/drivers/ssb/pcmcia.c 
     2122@@ -3,7 +3,7 @@ 
     2123  * PCMCIA-Hostbus related functions 
     2124  * 
     2125  * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 
     2126- * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> 
     2127+ * Copyright 2007-2008 Michael Buesch <m@bues.ch> 
     2128  * 
     2129  * Licensed under the GNU/GPL. See COPYING for details. 
     2130  */ 
    19792131@@ -583,7 +583,7 @@ static int ssb_pcmcia_sprom_write_all(st 
    19802132                        ssb_printk("."); 
     
    20042156+                       tuple_t *tuple, 
    20052157+                       void *priv) 
    2006  { 
    2007 -       tuple_t tuple; 
    2008 -       int res; 
    2009 -       unsigned char buf[32]; 
     2158+{ 
    20102159+       struct ssb_sprom *sprom = priv; 
    20112160+ 
     
    20232172+                                       tuple_t *tuple, 
    20242173+                                       void *priv) 
    2025 +{ 
     2174 { 
     2175-       tuple_t tuple; 
     2176-       int res; 
     2177-       unsigned char buf[32]; 
    20262178+       struct ssb_init_invariants *iv = priv; 
    20272179        struct ssb_sprom *sprom = &iv->sprom; 
     
    22502402--- a/drivers/ssb/scan.c 
    22512403+++ b/drivers/ssb/scan.c 
     2404@@ -2,7 +2,7 @@ 
     2405  * Sonics Silicon Backplane 
     2406  * Bus scanning 
     2407  * 
     2408- * Copyright (C) 2005-2007 Michael Buesch <mb@bu3sch.de> 
     2409+ * Copyright (C) 2005-2007 Michael Buesch <m@bues.ch> 
     2410  * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 
     2411  * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 
     2412  * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 
    22522413@@ -162,6 +162,8 @@ static u8 chipid_to_nrcores(u16 chipid) 
    22532414 static u32 scan_read32(struct ssb_bus *bus, u8 current_coreidx, 
     
    23612522+ * Based on drivers/ssb/pcmcia.c 
    23622523+ * Copyright 2006 Johannes Berg <johannes@sipsolutions.net> 
    2363 + * Copyright 2007-2008 Michael Buesch <mb@bu3sch.de> 
     2524+ * Copyright 2007-2008 Michael Buesch <m@bues.ch> 
    23642525+ * 
    23652526+ * Licensed under the GNU/GPL. See COPYING for details. 
     
    29653126--- a/drivers/ssb/sprom.c 
    29663127+++ b/drivers/ssb/sprom.c 
     3128@@ -2,7 +2,7 @@ 
     3129  * Sonics Silicon Backplane 
     3130  * Common SPROM support routines 
     3131  * 
     3132- * Copyright (C) 2005-2008 Michael Buesch <mb@bu3sch.de> 
     3133+ * Copyright (C) 2005-2008 Michael Buesch <m@bues.ch> 
     3134  * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de> 
     3135  * Copyright (C) 2005 Stefano Brivio <st3@riseup.net> 
     3136  * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org> 
    29673137@@ -13,8 +13,11 @@ 
    29683138  
     
    30443214 /** 
    30453215- * ssb_arch_set_fallback_sprom - Set a fallback SPROM for use if no SPROM is found. 
     3216- * 
     3217- * @sprom: The SPROM data structure to register. 
     3218- * 
     3219- * With this function the architecture implementation may register a fallback 
     3220- * SPROM data structure. The fallback is only used for PCI based SSB devices, 
     3221- * where no valid SPROM can be found in the shadow registers. 
    30463222+ * ssb_arch_register_fallback_sprom - Registers a method providing a 
    30473223+ * fallback SPROM if no SPROM is found. 
    30483224  * 
    3049 - * @sprom: The SPROM data structure to register. 
    3050 + * @sprom_callback: The callback function. 
    3051   * 
    3052 - * With this function the architecture implementation may register a fallback 
    3053 - * SPROM data structure. The fallback is only used for PCI based SSB devices, 
    3054 - * where no valid SPROM can be found in the shadow registers. 
    3055 + * With this function the architecture implementation may register a 
    3056 + * callback handler which fills the SPROM data structure. The fallback is 
    3057 + * only used for PCI based SSB devices, where no valid SPROM can be found 
    3058 + * in the shadow registers. 
    3059   * 
    30603225- * This function is useful for weird architectures that have a half-assed SSB device 
    30613226- * hardwired to their PCI bus. 
    3062 + * This function is useful for weird architectures that have a half-assed 
    3063 + * SSB device hardwired to their PCI bus. 
     3227+ * @sprom_callback: The callback function. 
    30643228  * 
    30653229- * Note that it does only work with PCI attached SSB devices. PCMCIA devices currently 
     
    30673231- * Architectures must provide the SPROM for native SSB devices anyway, 
    30683232- * so the fallback also isn't used for native devices. 
     3233+ * With this function the architecture implementation may register a 
     3234+ * callback handler which fills the SPROM data structure. The fallback is 
     3235+ * only used for PCI based SSB devices, where no valid SPROM can be found 
     3236+ * in the shadow registers. 
     3237+ * 
     3238+ * This function is useful for weird architectures that have a half-assed 
     3239+ * SSB device hardwired to their PCI bus. 
     3240+ * 
    30693241+ * Note that it does only work with PCI attached SSB devices. PCMCIA 
    30703242+ * devices currently don't use this fallback. 
     
    32203392--- a/include/linux/ssb/ssb.h 
    32213393+++ b/include/linux/ssb/ssb.h 
    3222 @@ -27,24 +27,60 @@ struct ssb_sprom { 
     3394@@ -25,26 +25,62 @@ struct ssb_sprom { 
     3395        u8 et1phyaddr;          /* MII address for enet1 */ 
     3396        u8 et0mdcport;          /* MDIO for enet0 */ 
    32233397        u8 et1mdcport;          /* MDIO for enet1 */ 
    3224         u8 board_rev;           /* Board revision number from SPROM. */ 
     3398-       u8 board_rev;           /* Board revision number from SPROM. */ 
     3399+       u16 board_rev;          /* Board revision number from SPROM. */ 
    32253400        u8 country_code;        /* Country Code */ 
    32263401-       u8 ant_available_a;     /* A-PHY antenna available bits (up to 4) */ 
     
    32873462        /* Antenna gain values for up to 4 antennas 
    32883463         * on each band. Values in dBm/4 (Q5.2). Negative gain means the 
    3289 @@ -58,14 +94,14 @@ struct ssb_sprom { 
     3464@@ -58,14 +94,23 @@ struct ssb_sprom { 
    32903465                } ghz5;         /* 5GHz band */ 
    32913466        } antenna_gain; 
    32923467  
    32933468-       /* TODO - add any parameters needed from rev 2, 3, or 4 SPROMs */ 
     3469+       struct { 
     3470+               struct { 
     3471+                       u8 tssipos, extpa_gain, pdet_range, tr_iso, antswlut; 
     3472+               } ghz2; 
     3473+               struct { 
     3474+                       u8 tssipos, extpa_gain, pdet_range, tr_iso, antswlut; 
     3475+               } ghz5; 
     3476+       } fem; 
     3477+ 
    32943478+       /* TODO - add any parameters needed from rev 2, 3, 4, 5 or 8 SPROMs */ 
    32953479 }; 
     
    33043488  
    33053489  
    3306 @@ -137,7 +173,7 @@ struct ssb_device { 
     3490@@ -137,7 +182,7 @@ struct ssb_device { 
    33073491         * is an optimization. */ 
    33083492        const struct ssb_bus_ops *ops; 
     
    33133497        struct ssb_bus *bus; 
    33143498        struct ssb_device_id id; 
    3315 @@ -208,6 +244,7 @@ enum ssb_bustype { 
     3499@@ -195,10 +240,9 @@ struct ssb_driver { 
     3500 #define drv_to_ssb_drv(_drv) container_of(_drv, struct ssb_driver, drv) 
     3501  
     3502 extern int __ssb_driver_register(struct ssb_driver *drv, struct module *owner); 
     3503-static inline int ssb_driver_register(struct ssb_driver *drv) 
     3504-{ 
     3505-       return __ssb_driver_register(drv, THIS_MODULE); 
     3506-} 
     3507+#define ssb_driver_register(drv) \ 
     3508+       __ssb_driver_register(drv, THIS_MODULE) 
     3509+ 
     3510 extern void ssb_driver_unregister(struct ssb_driver *drv); 
     3511  
     3512  
     3513@@ -208,6 +252,7 @@ enum ssb_bustype { 
    33163514        SSB_BUSTYPE_SSB,        /* This SSB bus is the system bus */ 
    33173515        SSB_BUSTYPE_PCI,        /* SSB is connected to PCI bus */ 
     
    33213519  
    33223520 /* board_vendor */ 
    3323 @@ -238,20 +275,33 @@ struct ssb_bus { 
     3521@@ -238,20 +283,33 @@ struct ssb_bus { 
    33243522  
    33253523        const struct ssb_bus_ops *ops; 
     
    33633561 #ifdef CONFIG_SSB_SPROM 
    33643562        /* Mutex to protect the SPROM writing. */ 
    3365 @@ -260,7 +310,8 @@ struct ssb_bus { 
     3563@@ -260,7 +318,8 @@ struct ssb_bus { 
    33663564  
    33673565        /* ID information about the Chip. */ 
     
    33733571        u8 chip_package; 
    33743572  
    3375 @@ -306,6 +357,11 @@ struct ssb_bus { 
     3573@@ -306,6 +365,11 @@ struct ssb_bus { 
    33763574 #endif /* DEBUG */ 
    33773575 }; 
     
    33853583 struct ssb_init_invariants { 
    33863584        /* Versioning information about the PCB. */ 
    3387 @@ -336,12 +392,23 @@ extern int ssb_bus_pcmciabus_register(st 
     3585@@ -336,12 +400,23 @@ extern int ssb_bus_pcmciabus_register(st 
    33883586                                      struct pcmcia_device *pcmcia_dev, 
    33893587                                      unsigned long baseaddr); 
     
    34103608 /* Suspend a SSB bus. 
    34113609  * Call this from the parent bus suspend routine. */ 
    3412 @@ -612,6 +679,7 @@ extern int ssb_bus_may_powerdown(struct 
     3610@@ -612,6 +687,7 @@ extern int ssb_bus_may_powerdown(struct 
    34133611  * Otherwise static always-on powercontrol will be used. */ 
    34143612 extern int ssb_bus_powerup(struct ssb_bus *bus, bool dynamic_pctl); 
     
    34203618--- a/include/linux/ssb/ssb_driver_chipcommon.h 
    34213619+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
     3620@@ -8,7 +8,7 @@ 
     3621  * gpio interface, extbus, and support for serial and parallel flashes. 
     3622  * 
     3623  * Copyright 2005, Broadcom Corporation 
     3624- * Copyright 2006, Michael Buesch <mb@bu3sch.de> 
     3625+ * Copyright 2006, Michael Buesch <m@bues.ch> 
     3626  * 
     3627  * Licensed under the GPL version 2. See COPYING for details. 
     3628  */ 
    34223629@@ -53,6 +53,7 @@ 
    34233630 #define  SSB_CHIPCO_CAP_64BIT          0x08000000      /* 64-bit Backplane */ 
     
    36703877 #define  SSB_SPROM3_CCKPO_2M           0x00F0  /* 2M Rate PO */ 
    36713878 #define  SSB_SPROM3_CCKPO_2M_SHIFT     4 
    3672 @@ -264,104 +267,200 @@ 
     3879@@ -264,104 +267,257 @@ 
    36733880 #define  SSB_SPROM3_OFDMGPO            0x107A  /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ 
    36743881  
     
    38944101+#define  SSB_SPROM8_RXPO5G             0xFF00  /* 5GHz RX power offset */ 
    38954102+#define  SSB_SPROM8_RXPO5G_SHIFT       8 
     4103+#define SSB_SPROM8_FEM2G               0x00AE 
     4104+#define SSB_SPROM8_FEM5G               0x00B0 
     4105+#define  SSB_SROM8_FEM_TSSIPOS         0x0001 
     4106+#define  SSB_SROM8_FEM_TSSIPOS_SHIFT   0 
     4107+#define  SSB_SROM8_FEM_EXTPA_GAIN      0x0006 
     4108+#define  SSB_SROM8_FEM_EXTPA_GAIN_SHIFT        1 
     4109+#define  SSB_SROM8_FEM_PDET_RANGE      0x00F8 
     4110+#define  SSB_SROM8_FEM_PDET_RANGE_SHIFT        3 
     4111+#define  SSB_SROM8_FEM_TR_ISO          0x0700 
     4112+#define  SSB_SROM8_FEM_TR_ISO_SHIFT    8 
     4113+#define  SSB_SROM8_FEM_ANTSWLUT                0xF800 
     4114+#define  SSB_SROM8_FEM_ANTSWLUT_SHIFT  11 
     4115+#define SSB_SPROM8_THERMAL             0x00B2 
     4116+#define SSB_SPROM8_MPWR_RAWTS          0x00B4 
     4117+#define SSB_SPROM8_TS_SLP_OPT_CORRX    0x00B6 
     4118+#define SSB_SPROM8_FOC_HWIQ_IQSWP      0x00B8 
     4119+#define SSB_SPROM8_PHYCAL_TEMPDELTA    0x00BA 
    38964120+#define SSB_SPROM8_MAXP_BG             0x00C0  /* Max Power 2GHz in path 1 */ 
    38974121+#define  SSB_SPROM8_MAXP_BG_MASK       0x00FF  /* Mask for Max Power 2GHz */ 
     
    39254149+#define SSB_SPROM8_OFDM5GLPO           0x014A  /* 5.2GHz OFDM power offset */ 
    39264150+#define SSB_SPROM8_OFDM5GHPO           0x014E  /* 5.8GHz OFDM power offset */ 
     4151+ 
     4152+/* Values for boardflags_lo read from SPROM */ 
     4153+#define SSB_BFL_BTCOEXIST              0x0001  /* implements Bluetooth coexistance */ 
     4154+#define SSB_BFL_PACTRL                 0x0002  /* GPIO 9 controlling the PA */ 
     4155+#define SSB_BFL_AIRLINEMODE            0x0004  /* implements GPIO 13 radio disable indication */ 
     4156+#define SSB_BFL_RSSI                   0x0008  /* software calculates nrssi slope. */ 
     4157+#define SSB_BFL_ENETSPI                        0x0010  /* has ephy roboswitch spi */ 
     4158+#define SSB_BFL_XTAL_NOSLOW            0x0020  /* no slow clock available */ 
     4159+#define SSB_BFL_CCKHIPWR               0x0040  /* can do high power CCK transmission */ 
     4160+#define SSB_BFL_ENETADM                        0x0080  /* has ADMtek switch */ 
     4161+#define SSB_BFL_ENETVLAN               0x0100  /* can do vlan */ 
     4162+#define SSB_BFL_AFTERBURNER            0x0200  /* supports Afterburner mode */ 
     4163+#define SSB_BFL_NOPCI                  0x0400  /* board leaves PCI floating */ 
     4164+#define SSB_BFL_FEM                    0x0800  /* supports the Front End Module */ 
     4165+#define SSB_BFL_EXTLNA                 0x1000  /* has an external LNA */ 
     4166+#define SSB_BFL_HGPA                   0x2000  /* had high gain PA */ 
     4167+#define SSB_BFL_BTCMOD                 0x4000  /* BFL_BTCOEXIST is given in alternate GPIOs */ 
     4168+#define SSB_BFL_ALTIQ                  0x8000  /* alternate I/Q settings */ 
     4169+ 
     4170+/* Values for boardflags_hi read from SPROM */ 
     4171+#define SSB_BFH_NOPA                   0x0001  /* has no PA */ 
     4172+#define SSB_BFH_RSSIINV                        0x0002  /* RSSI uses positive slope (not TSSI) */ 
     4173+#define SSB_BFH_PAREF                  0x0004  /* uses the PARef LDO */ 
     4174+#define SSB_BFH_3TSWITCH               0x0008  /* uses a triple throw switch shared with bluetooth */ 
     4175+#define SSB_BFH_PHASESHIFT             0x0010  /* can support phase shifter */ 
     4176+#define SSB_BFH_BUCKBOOST              0x0020  /* has buck/booster */ 
     4177+#define SSB_BFH_FEM_BT                 0x0040  /* has FEM and switch to share antenna with bluetooth */ 
     4178+ 
     4179+/* Values for boardflags2_lo read from SPROM */ 
     4180+#define SSB_BFL2_RXBB_INT_REG_DIS      0x0001  /* external RX BB regulator present */ 
     4181+#define SSB_BFL2_APLL_WAR              0x0002  /* alternative A-band PLL settings implemented */ 
     4182+#define SSB_BFL2_TXPWRCTRL_EN          0x0004  /* permits enabling TX Power Control */ 
     4183+#define SSB_BFL2_2X4_DIV               0x0008  /* 2x4 diversity switch */ 
     4184+#define SSB_BFL2_5G_PWRGAIN            0x0010  /* supports 5G band power gain */ 
     4185+#define SSB_BFL2_PCIEWAR_OVR           0x0020  /* overrides ASPM and Clkreq settings */ 
     4186+#define SSB_BFL2_CAESERS_BRD           0x0040  /* is Caesers board (unused) */ 
     4187+#define SSB_BFL2_BTC3WIRE              0x0080  /* used 3-wire bluetooth coexist */ 
     4188+#define SSB_BFL2_SKWRKFEM_BRD          0x0100  /* 4321mcm93 uses Skyworks FEM */ 
     4189+#define SSB_BFL2_SPUR_WAR              0x0200  /* has a workaround for clock-harmonic spurs */ 
     4190+#define SSB_BFL2_GPLL_WAR              0x0400  /* altenative G-band PLL settings implemented */ 
    39274191  
    39284192 /* Values for SSB_SPROM1_BINF_CCODE */ 
    39294193 enum { 
     4194--- a/drivers/ssb/driver_extif.c 
     4195+++ b/drivers/ssb/driver_extif.c 
     4196@@ -3,7 +3,7 @@ 
     4197  * Broadcom EXTIF core driver 
     4198  * 
     4199  * Copyright 2005, Broadcom Corporation 
     4200- * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     4201+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     4202  * Copyright 2006, 2007, Felix Fietkau <nbd@openwrt.org> 
     4203  * Copyright 2007, Aurelien Jarno <aurelien@aurel32.net> 
     4204  * 
     4205--- a/drivers/ssb/embedded.c 
     4206+++ b/drivers/ssb/embedded.c 
     4207@@ -3,7 +3,7 @@ 
     4208  * Embedded systems support code 
     4209  * 
     4210  * Copyright 2005-2008, Broadcom Corporation 
     4211- * Copyright 2006-2008, Michael Buesch <mb@bu3sch.de> 
     4212+ * Copyright 2006-2008, Michael Buesch <m@bues.ch> 
     4213  * 
     4214  * Licensed under the GNU/GPL. See COPYING for details. 
     4215  */ 
  • trunk/target/linux/generic/patches-2.6.31/025-bcma_backport.patch

    r27731 r29574  
    7272--- /dev/null 
    7373+++ b/drivers/bcma/Kconfig 
    74 @@ -0,0 +1,44 @@ 
     74@@ -0,0 +1,57 @@ 
    7575+config BCMA_POSSIBLE 
    7676+       bool 
     
    108108+         PCI core hostmode operation (external PCI bus). 
    109109+ 
     110+config BCMA_HOST_SOC 
     111+       bool 
     112+       depends on BCMA_DRIVER_MIPS 
     113+ 
     114+config BCMA_DRIVER_MIPS 
     115+       bool "BCMA Broadcom MIPS core driver" 
     116+       depends on BCMA && MIPS 
     117+       help 
     118+         Driver for the Broadcom MIPS core attached to Broadcom specific 
     119+         Advanced Microcontroller Bus. 
     120+ 
     121+         If unsure, say N 
     122+ 
    110123+config BCMA_DEBUG 
    111124+       bool "BCMA debugging" 
     
    119132--- /dev/null 
    120133+++ b/drivers/bcma/Makefile 
    121 @@ -0,0 +1,8 @@ 
     134@@ -0,0 +1,10 @@ 
    122135+bcma-y                                 += main.o scan.o core.o sprom.o 
    123136+bcma-y                                 += driver_chipcommon.o driver_chipcommon_pmu.o 
    124137+bcma-y                                 += driver_pci.o 
    125138+bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
     139+bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
    126140+bcma-$(CONFIG_BCMA_HOST_PCI)           += host_pci.o 
     141+bcma-$(CONFIG_BCMA_HOST_SOC)           += host_soc.o 
    127142+obj-$(CONFIG_BCMA)                     += bcma.o 
    128143+ 
     
    158173--- /dev/null 
    159174+++ b/drivers/bcma/bcma_private.h 
    160 @@ -0,0 +1,35 @@ 
     175@@ -0,0 +1,54 @@ 
    161176+#ifndef LINUX_BCMA_PRIVATE_H_ 
    162177+#define LINUX_BCMA_PRIVATE_H_ 
     
    176191+int bcma_bus_register(struct bcma_bus *bus); 
    177192+void bcma_bus_unregister(struct bcma_bus *bus); 
     193+int __init bcma_bus_early_register(struct bcma_bus *bus, 
     194+                                  struct bcma_device *core_cc, 
     195+                                  struct bcma_device *core_mips); 
     196+#ifdef CONFIG_PM 
     197+int bcma_bus_resume(struct bcma_bus *bus); 
     198+#endif 
    178199+ 
    179200+/* scan.c */ 
    180201+int bcma_bus_scan(struct bcma_bus *bus); 
     202+int __init bcma_bus_scan_early(struct bcma_bus *bus, 
     203+                              struct bcma_device_id *match, 
     204+                              struct bcma_device *core); 
     205+void bcma_init_bus(struct bcma_bus *bus); 
    181206+ 
    182207+/* sprom.c */ 
    183208+int bcma_sprom_get(struct bcma_bus *bus); 
     209+ 
     210+/* driver_chipcommon.c */ 
     211+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     212+void bcma_chipco_serial_init(struct bcma_drv_cc *cc); 
     213+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     214+ 
     215+/* driver_chipcommon_pmu.c */ 
     216+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
     217+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
    184218+ 
    185219+#ifdef CONFIG_BCMA_HOST_PCI 
     
    196230--- /dev/null 
    197231+++ b/drivers/bcma/core.c 
    198 @@ -0,0 +1,124 @@ 
     232@@ -0,0 +1,126 @@ 
    199233+/* 
    200234+ * Broadcom specific AMBA 
     
    309343+{ 
    310344+       switch (core->bus->hosttype) { 
     345+       case BCMA_HOSTTYPE_SOC: 
     346+               return 0; 
    311347+       case BCMA_HOSTTYPE_PCI: 
    312348+               if (bcma_aread32(core, BCMA_IOST) & BCMA_IOST_DMA64) 
     
    323359--- /dev/null 
    324360+++ b/drivers/bcma/driver_chipcommon.c 
    325 @@ -0,0 +1,103 @@ 
     361@@ -0,0 +1,156 @@ 
    326362+/* 
    327363+ * Broadcom specific AMBA 
     
    329365+ * 
    330366+ * Copyright 2005, Broadcom Corporation 
    331 + * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     367+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
    332368+ * 
    333369+ * Licensed under the GNU/GPL. See COPYING for details. 
     
    351387+       u32 leddc_on = 10; 
    352388+       u32 leddc_off = 90; 
     389+ 
     390+       if (cc->setup_done) 
     391+               return; 
    353392+ 
    354393+       if (cc->core->id.rev >= 11) 
     
    378417+                        (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); 
    379418+       } 
     419+ 
     420+       cc->setup_done = true; 
    380421+} 
    381422+ 
     
    427468+       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
    428469+} 
     470+ 
     471+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     472+void bcma_chipco_serial_init(struct bcma_drv_cc *cc) 
     473+{ 
     474+       unsigned int irq; 
     475+       u32 baud_base; 
     476+       u32 i; 
     477+       unsigned int ccrev = cc->core->id.rev; 
     478+       struct bcma_serial_port *ports = cc->serial_ports; 
     479+ 
     480+       if (ccrev >= 11 && ccrev != 15) { 
     481+               /* Fixed ALP clock */ 
     482+               baud_base = bcma_pmu_alp_clock(cc); 
     483+               if (ccrev >= 21) { 
     484+                       /* Turn off UART clock before switching clocksource. */ 
     485+                       bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     486+                                      bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     487+                                      & ~BCMA_CC_CORECTL_UARTCLKEN); 
     488+               } 
     489+               /* Set the override bit so we don't divide it */ 
     490+               bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     491+                              bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     492+                              | BCMA_CC_CORECTL_UARTCLK0); 
     493+               if (ccrev >= 21) { 
     494+                       /* Re-enable the UART clock. */ 
     495+                       bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     496+                                      bcma_cc_read32(cc, BCMA_CC_CORECTL) 
     497+                                      | BCMA_CC_CORECTL_UARTCLKEN); 
     498+               } 
     499+       } else { 
     500+               pr_err("serial not supported on this device ccrev: 0x%x\n", 
     501+                      ccrev); 
     502+               return; 
     503+       } 
     504+ 
     505+       irq = bcma_core_mips_irq(cc->core); 
     506+ 
     507+       /* Determine the registers of the UARTs */ 
     508+       cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART); 
     509+       for (i = 0; i < cc->nr_serial_ports; i++) { 
     510+               ports[i].regs = cc->core->io_addr + BCMA_CC_UART0_DATA + 
     511+                               (i * 256); 
     512+               ports[i].irq = irq; 
     513+               ports[i].baud_base = baud_base; 
     514+               ports[i].reg_shift = 0; 
     515+       } 
     516+} 
     517+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    429518--- /dev/null 
    430519+++ b/drivers/bcma/driver_chipcommon_pmu.c 
    431 @@ -0,0 +1,138 @@ 
     520@@ -0,0 +1,309 @@ 
    432521+/* 
    433522+ * Broadcom specific AMBA 
    434523+ * ChipCommon Power Management Unit driver 
    435524+ * 
    436 + * Copyright 2009, Michael Buesch <mb@bu3sch.de> 
     525+ * Copyright 2009, Michael Buesch <m@bues.ch> 
    437526+ * Copyright 2007, Broadcom Corporation 
    438527+ * 
     
    443532+#include <linux/bcma/bcma.h> 
    444533+ 
    445 +static void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
    446 +                                       u32 offset, u32 mask, u32 set) 
    447 +{ 
    448 +       u32 value; 
    449 + 
    450 +       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR); 
     534+static u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset) 
     535+{ 
     536+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     537+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     538+       return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA); 
     539+} 
     540+ 
     541+void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value) 
     542+{ 
     543+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     544+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     545+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, value); 
     546+} 
     547+EXPORT_SYMBOL_GPL(bcma_chipco_pll_write); 
     548+ 
     549+void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask, 
     550+                            u32 set) 
     551+{ 
     552+       bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     553+       bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     554+       bcma_cc_maskset32(cc, BCMA_CC_PLLCTL_DATA, mask, set); 
     555+} 
     556+EXPORT_SYMBOL_GPL(bcma_chipco_pll_maskset); 
     557+ 
     558+void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
     559+                                u32 offset, u32 mask, u32 set) 
     560+{ 
    451561+       bcma_cc_write32(cc, BCMA_CC_CHIPCTL_ADDR, offset); 
    452562+       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR); 
    453 +       value = bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA); 
    454 +       value &= mask; 
    455 +       value |= set; 
    456 +       bcma_cc_write32(cc, BCMA_CC_CHIPCTL_DATA, value); 
    457 +       bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA); 
    458 +} 
     563+       bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL_DATA, mask, set); 
     564+} 
     565+EXPORT_SYMBOL_GPL(bcma_chipco_chipctl_maskset); 
     566+ 
     567+void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask, 
     568+                               u32 set) 
     569+{ 
     570+       bcma_cc_write32(cc, BCMA_CC_REGCTL_ADDR, offset); 
     571+       bcma_cc_read32(cc, BCMA_CC_REGCTL_ADDR); 
     572+       bcma_cc_maskset32(cc, BCMA_CC_REGCTL_DATA, mask, set); 
     573+} 
     574+EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset); 
    459575+ 
    460576+static void bcma_pmu_pll_init(struct bcma_drv_cc *cc) 
     
    515631+} 
    516632+ 
     633+/* Disable to allow reading SPROM. Don't know the adventages of enabling it. */ 
     634+void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable) 
     635+{ 
     636+       struct bcma_bus *bus = cc->core->bus; 
     637+       u32 val; 
     638+ 
     639+       val = bcma_cc_read32(cc, BCMA_CC_CHIPCTL); 
     640+       if (enable) { 
     641+               val |= BCMA_CHIPCTL_4331_EXTPA_EN; 
     642+               if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11) 
     643+                       val |= BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; 
     644+       } else { 
     645+               val &= ~BCMA_CHIPCTL_4331_EXTPA_EN; 
     646+               val &= ~BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5; 
     647+       } 
     648+       bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val); 
     649+} 
     650+ 
    517651+void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
    518652+{ 
     
    524658+               break; 
    525659+       case 0x4331: 
    526 +               pr_err("Enabling Ext PA lines not implemented\n"); 
     660+               /* BCM4331 workaround is SPROM-related, we put it in sprom.c */ 
    527661+               break; 
    528662+       case 43224: 
     
    568702+       bcma_pmu_workarounds(cc); 
    569703+} 
     704+ 
     705+u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc) 
     706+{ 
     707+       struct bcma_bus *bus = cc->core->bus; 
     708+ 
     709+       switch (bus->chipinfo.id) { 
     710+       case 0x4716: 
     711+       case 0x4748: 
     712+       case 47162: 
     713+       case 0x4313: 
     714+       case 0x5357: 
     715+       case 0x4749: 
     716+       case 53572: 
     717+               /* always 20Mhz */ 
     718+               return 20000 * 1000; 
     719+       case 0x5356: 
     720+       case 0x5300: 
     721+               /* always 25Mhz */ 
     722+               return 25000 * 1000; 
     723+       default: 
     724+               pr_warning("No ALP clock specified for %04X device, " 
     725+                       "pmu rev. %d, using default %d Hz\n", 
     726+                       bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_ALP_CLOCK); 
     727+       } 
     728+       return BCMA_CC_PMU_ALP_CLOCK; 
     729+} 
     730+ 
     731+/* Find the output of the "m" pll divider given pll controls that start with 
     732+ * pllreg "pll0" i.e. 12 for main 6 for phy, 0 for misc. 
     733+ */ 
     734+static u32 bcma_pmu_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
     735+{ 
     736+       u32 tmp, div, ndiv, p1, p2, fc; 
     737+       struct bcma_bus *bus = cc->core->bus; 
     738+ 
     739+       BUG_ON((pll0 & 3) || (pll0 > BCMA_CC_PMU4716_MAINPLL_PLL0)); 
     740+ 
     741+       BUG_ON(!m || m > 4); 
     742+ 
     743+       if (bus->chipinfo.id == 0x5357 || bus->chipinfo.id == 0x4749) { 
     744+               /* Detect failure in clock setting */ 
     745+               tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT); 
     746+               if (tmp & 0x40000) 
     747+                       return 133 * 1000000; 
     748+       } 
     749+ 
     750+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_P1P2_OFF); 
     751+       p1 = (tmp & BCMA_CC_PPL_P1_MASK) >> BCMA_CC_PPL_P1_SHIFT; 
     752+       p2 = (tmp & BCMA_CC_PPL_P2_MASK) >> BCMA_CC_PPL_P2_SHIFT; 
     753+ 
     754+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_M14_OFF); 
     755+       div = (tmp >> ((m - 1) * BCMA_CC_PPL_MDIV_WIDTH)) & 
     756+               BCMA_CC_PPL_MDIV_MASK; 
     757+ 
     758+       tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_NM5_OFF); 
     759+       ndiv = (tmp & BCMA_CC_PPL_NDIV_MASK) >> BCMA_CC_PPL_NDIV_SHIFT; 
     760+ 
     761+       /* Do calculation in Mhz */ 
     762+       fc = bcma_pmu_alp_clock(cc) / 1000000; 
     763+       fc = (p1 * ndiv * fc) / p2; 
     764+ 
     765+       /* Return clock in Hertz */ 
     766+       return (fc / div) * 1000000; 
     767+} 
     768+ 
     769+/* query bus clock frequency for PMU-enabled chipcommon */ 
     770+u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     771+{ 
     772+       struct bcma_bus *bus = cc->core->bus; 
     773+ 
     774+       switch (bus->chipinfo.id) { 
     775+       case 0x4716: 
     776+       case 0x4748: 
     777+       case 47162: 
     778+               return bcma_pmu_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0, 
     779+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     780+       case 0x5356: 
     781+               return bcma_pmu_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0, 
     782+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     783+       case 0x5357: 
     784+       case 0x4749: 
     785+               return bcma_pmu_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0, 
     786+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     787+       case 0x5300: 
     788+               return bcma_pmu_clock(cc, BCMA_CC_PMU4706_MAINPLL_PLL0, 
     789+                                     BCMA_CC_PMU5_MAINPLL_SSB); 
     790+       case 53572: 
     791+               return 75000000; 
     792+       default: 
     793+               pr_warning("No backplane clock specified for %04X device, " 
     794+                       "pmu rev. %d, using default %d Hz\n", 
     795+                       bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK); 
     796+       } 
     797+       return BCMA_CC_PMU_HT_CLOCK; 
     798+} 
     799+ 
     800+/* query cpu clock frequency for PMU-enabled chipcommon */ 
     801+u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc) 
     802+{ 
     803+       struct bcma_bus *bus = cc->core->bus; 
     804+ 
     805+       if (bus->chipinfo.id == 53572) 
     806+               return 300000000; 
     807+ 
     808+       if (cc->pmu.rev >= 5) { 
     809+               u32 pll; 
     810+               switch (bus->chipinfo.id) { 
     811+               case 0x5356: 
     812+                       pll = BCMA_CC_PMU5356_MAINPLL_PLL0; 
     813+                       break; 
     814+               case 0x5357: 
     815+               case 0x4749: 
     816+                       pll = BCMA_CC_PMU5357_MAINPLL_PLL0; 
     817+                       break; 
     818+               default: 
     819+                       pll = BCMA_CC_PMU4716_MAINPLL_PLL0; 
     820+                       break; 
     821+               } 
     822+ 
     823+               /* TODO: if (bus->chipinfo.id == 0x5300) 
     824+                 return si_4706_pmu_clock(sih, osh, cc, PMU4706_MAINPLL_PLL0, PMU5_MAINPLL_CPU); */ 
     825+               return bcma_pmu_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU); 
     826+       } 
     827+ 
     828+       return bcma_pmu_get_clockcontrol(cc); 
     829+} 
    570830--- /dev/null 
    571831+++ b/drivers/bcma/driver_pci.c 
    572 @@ -0,0 +1,223 @@ 
     832@@ -0,0 +1,237 @@ 
    573833+/* 
    574834+ * Broadcom specific AMBA 
     
    576836+ * 
    577837+ * Copyright 2005, Broadcom Corporation 
    578 + * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     838+ * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
    579839+ * 
    580840+ * Licensed under the GNU/GPL. See COPYING for details. 
     
    7451005+               return false; 
    7461006+ 
    747 +       if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI) 
     1007+#ifdef CONFIG_SSB_DRIVER_PCICORE 
     1008+       if (bus->sprom.boardflags_lo & SSB_BFL_NOPCI) 
    7481009+               return false; 
     1010+#endif /* CONFIG_SSB_DRIVER_PCICORE */ 
    7491011+ 
    7501012+#if 0 
     
    7601022+void bcma_core_pci_init(struct bcma_drv_pci *pc) 
    7611023+{ 
     1024+       if (pc->setup_done) 
     1025+               return; 
     1026+ 
    7621027+       if (bcma_core_pci_is_in_hostmode(pc)) { 
    7631028+#ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE 
     
    7691034+               bcma_core_pci_clientmode_init(pc); 
    7701035+       } 
     1036+ 
     1037+       pc->setup_done = true; 
    7711038+} 
    7721039+ 
     
    7761043+       struct pci_dev *pdev = pc->core->bus->host_pci; 
    7771044+       u32 coremask, tmp; 
    778 +       int err; 
     1045+       int err = 0; 
     1046+ 
     1047+       if (core->bus->hosttype != BCMA_HOSTTYPE_PCI) { 
     1048+               /* This bcma device is not on a PCI host-bus. So the IRQs are 
     1049+                * not routed through the PCI core. 
     1050+                * So we must not enable routing through the PCI core. */ 
     1051+               goto out; 
     1052+       } 
    7791053+ 
    7801054+       err = pci_read_config_dword(pdev, BCMA_PCI_IRQMASK, &tmp); 
     
    7961070--- /dev/null 
    7971071+++ b/drivers/bcma/host_pci.c 
    798 @@ -0,0 +1,251 @@ 
     1072@@ -0,0 +1,299 @@ 
    7991073+/* 
    8001074+ * Broadcom specific AMBA 
     
    8081082+#include <linux/bcma/bcma.h> 
    8091083+#include <linux/pci.h> 
     1084+#include <linux/module.h> 
    8101085+ 
    8111086+static void bcma_host_pci_switch_core(struct bcma_device *core) 
     
    8191094+} 
    8201095+ 
    821 +static u8 bcma_host_pci_read8(struct bcma_device *core, u16 offset) 
    822 +{ 
     1096+/* Provides access to the requested core. Returns base offset that has to be 
     1097+ * used. It makes use of fixed windows when possible. */ 
     1098+static u16 bcma_host_pci_provide_access_to_core(struct bcma_device *core) 
     1099+{ 
     1100+       switch (core->id.id) { 
     1101+       case BCMA_CORE_CHIPCOMMON: 
     1102+               return 3 * BCMA_CORE_SIZE; 
     1103+       case BCMA_CORE_PCIE: 
     1104+               return 2 * BCMA_CORE_SIZE; 
     1105+       } 
     1106+ 
    8231107+       if (core->bus->mapped_core != core) 
    8241108+               bcma_host_pci_switch_core(core); 
     1109+       return 0; 
     1110+} 
     1111+ 
     1112+static u8 bcma_host_pci_read8(struct bcma_device *core, u16 offset) 
     1113+{ 
     1114+       offset += bcma_host_pci_provide_access_to_core(core); 
    8251115+       return ioread8(core->bus->mmio + offset); 
    8261116+} 
     
    8281118+static u16 bcma_host_pci_read16(struct bcma_device *core, u16 offset) 
    8291119+{ 
    830 +       if (core->bus->mapped_core != core) 
    831 +               bcma_host_pci_switch_core(core); 
     1120+       offset += bcma_host_pci_provide_access_to_core(core); 
    8321121+       return ioread16(core->bus->mmio + offset); 
    8331122+} 
     
    8351124+static u32 bcma_host_pci_read32(struct bcma_device *core, u16 offset) 
    8361125+{ 
    837 +       if (core->bus->mapped_core != core) 
    838 +               bcma_host_pci_switch_core(core); 
     1126+       offset += bcma_host_pci_provide_access_to_core(core); 
    8391127+       return ioread32(core->bus->mmio + offset); 
    8401128+} 
     
    8431131+                                u8 value) 
    8441132+{ 
    845 +       if (core->bus->mapped_core != core) 
    846 +               bcma_host_pci_switch_core(core); 
     1133+       offset += bcma_host_pci_provide_access_to_core(core); 
    8471134+       iowrite8(value, core->bus->mmio + offset); 
    8481135+} 
     
    8511138+                                u16 value) 
    8521139+{ 
    853 +       if (core->bus->mapped_core != core) 
    854 +               bcma_host_pci_switch_core(core); 
     1140+       offset += bcma_host_pci_provide_access_to_core(core); 
    8551141+       iowrite16(value, core->bus->mmio + offset); 
    8561142+} 
     
    8591145+                                u32 value) 
    8601146+{ 
    861 +       if (core->bus->mapped_core != core) 
    862 +               bcma_host_pci_switch_core(core); 
     1147+       offset += bcma_host_pci_provide_access_to_core(core); 
    8631148+       iowrite32(value, core->bus->mmio + offset); 
    8641149+} 
     
    10221307+} 
    10231308+ 
     1309+#ifdef CONFIG_PM 
     1310+static int bcma_host_pci_suspend(struct pci_dev *dev, pm_message_t state) 
     1311+{ 
     1312+       /* Host specific */ 
     1313+       pci_save_state(dev); 
     1314+       pci_disable_device(dev); 
     1315+       pci_set_power_state(dev, pci_choose_state(dev, state)); 
     1316+ 
     1317+       return 0; 
     1318+} 
     1319+ 
     1320+static int bcma_host_pci_resume(struct pci_dev *dev) 
     1321+{ 
     1322+       struct bcma_bus *bus = pci_get_drvdata(dev); 
     1323+       int err; 
     1324+ 
     1325+       /* Host specific */ 
     1326+       pci_set_power_state(dev, 0); 
     1327+       err = pci_enable_device(dev); 
     1328+       if (err) 
     1329+               return err; 
     1330+       pci_restore_state(dev); 
     1331+ 
     1332+       /* Bus specific */ 
     1333+       err = bcma_bus_resume(bus); 
     1334+       if (err) 
     1335+               return err; 
     1336+ 
     1337+       return 0; 
     1338+} 
     1339+#else /* CONFIG_PM */ 
     1340+# define bcma_host_pci_suspend NULL 
     1341+# define bcma_host_pci_resume  NULL 
     1342+#endif /* CONFIG_PM */ 
     1343+ 
    10241344+static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { 
    10251345+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x0576) }, 
     
    10371357+       .probe = bcma_host_pci_probe, 
    10381358+       .remove = bcma_host_pci_remove, 
     1359+       .suspend = bcma_host_pci_suspend, 
     1360+       .resume = bcma_host_pci_resume, 
    10391361+}; 
    10401362+ 
     
    10501372--- /dev/null 
    10511373+++ b/drivers/bcma/main.c 
    1052 @@ -0,0 +1,257 @@ 
     1374@@ -0,0 +1,354 @@ 
    10531375+/* 
    10541376+ * Broadcom specific AMBA 
     
    10591381+ 
    10601382+#include "bcma_private.h" 
     1383+#include <linux/module.h> 
    10611384+#include <linux/bcma/bcma.h> 
    10621385+#include <linux/slab.h> 
     
    10681391+static int bcma_device_probe(struct device *dev); 
    10691392+static int bcma_device_remove(struct device *dev); 
     1393+static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env); 
    10701394+ 
    10711395+static ssize_t manuf_show(struct device *dev, struct device_attribute *attr, char *buf) 
     
    11021426+       .probe          = bcma_device_probe, 
    11031427+       .remove         = bcma_device_remove, 
     1428+       .uevent         = bcma_device_uevent, 
    11041429+       .dev_attrs      = bcma_device_attrs, 
    11051430+}; 
     
    11191444+{ 
    11201445+       struct bcma_device *core = container_of(dev, struct bcma_device, dev); 
     1446+       if (core->io_addr) 
     1447+               iounmap(core->io_addr); 
     1448+       if (core->io_wrap) 
     1449+               iounmap(core->io_wrap); 
    11211450+       kfree(core); 
    11221451+} 
     
    11331462+               case BCMA_CORE_PCI: 
    11341463+               case BCMA_CORE_PCIE: 
     1464+               case BCMA_CORE_MIPS_74K: 
    11351465+                       continue; 
    11361466+               } 
     
    11461476+                       core->irq = bus->host_pci->irq; 
    11471477+                       break; 
    1148 +               case BCMA_HOSTTYPE_NONE: 
     1478+               case BCMA_HOSTTYPE_SOC: 
     1479+                       core->dev.dma_mask = &core->dev.coherent_dma_mask; 
     1480+                       core->dma_dev = &core->dev; 
     1481+                       break; 
    11491482+               case BCMA_HOSTTYPE_SDIO: 
    11501483+                       break; 
     
    11931526+       } 
    11941527+ 
     1528+       /* Init MIPS core */ 
     1529+       core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     1530+       if (core) { 
     1531+               bus->drv_mips.core = core; 
     1532+               bcma_core_mips_init(&bus->drv_mips); 
     1533+       } 
     1534+ 
    11951535+       /* Init PCIE core */ 
    11961536+       core = bcma_find_core(bus, BCMA_CORE_PCIE); 
     
    12221562+} 
    12231563+ 
     1564+int __init bcma_bus_early_register(struct bcma_bus *bus, 
     1565+                                  struct bcma_device *core_cc, 
     1566+                                  struct bcma_device *core_mips) 
     1567+{ 
     1568+       int err; 
     1569+       struct bcma_device *core; 
     1570+       struct bcma_device_id match; 
     1571+ 
     1572+       bcma_init_bus(bus); 
     1573+ 
     1574+       match.manuf = BCMA_MANUF_BCM; 
     1575+       match.id = BCMA_CORE_CHIPCOMMON; 
     1576+       match.class = BCMA_CL_SIM; 
     1577+       match.rev = BCMA_ANY_REV; 
     1578+ 
     1579+       /* Scan for chip common core */ 
     1580+       err = bcma_bus_scan_early(bus, &match, core_cc); 
     1581+       if (err) { 
     1582+               pr_err("Failed to scan for common core: %d\n", err); 
     1583+               return -1; 
     1584+       } 
     1585+ 
     1586+       match.manuf = BCMA_MANUF_MIPS; 
     1587+       match.id = BCMA_CORE_MIPS_74K; 
     1588+       match.class = BCMA_CL_SIM; 
     1589+       match.rev = BCMA_ANY_REV; 
     1590+ 
     1591+       /* Scan for mips core */ 
     1592+       err = bcma_bus_scan_early(bus, &match, core_mips); 
     1593+       if (err) { 
     1594+               pr_err("Failed to scan for mips core: %d\n", err); 
     1595+               return -1; 
     1596+       } 
     1597+ 
     1598+       /* Init CC core */ 
     1599+       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     1600+       if (core) { 
     1601+               bus->drv_cc.core = core; 
     1602+               bcma_core_chipcommon_init(&bus->drv_cc); 
     1603+       } 
     1604+ 
     1605+       /* Init MIPS core */ 
     1606+       core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     1607+       if (core) { 
     1608+               bus->drv_mips.core = core; 
     1609+               bcma_core_mips_init(&bus->drv_mips); 
     1610+       } 
     1611+ 
     1612+       pr_info("Early bus registered\n"); 
     1613+ 
     1614+       return 0; 
     1615+} 
     1616+ 
     1617+#ifdef CONFIG_PM 
     1618+int bcma_bus_resume(struct bcma_bus *bus) 
     1619+{ 
     1620+       struct bcma_device *core; 
     1621+ 
     1622+       /* Init CC core */ 
     1623+       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     1624+       if (core) { 
     1625+               bus->drv_cc.setup_done = false; 
     1626+               bcma_core_chipcommon_init(&bus->drv_cc); 
     1627+       } 
     1628+ 
     1629+       return 0; 
     1630+} 
     1631+#endif 
     1632+ 
    12241633+int __bcma_driver_register(struct bcma_driver *drv, struct module *owner) 
    12251634+{ 
     
    12801689+} 
    12811690+ 
     1691+static int bcma_device_uevent(struct device *dev, struct kobj_uevent_env *env) 
     1692+{ 
     1693+       struct bcma_device *core = container_of(dev, struct bcma_device, dev); 
     1694+ 
     1695+       return add_uevent_var(env, 
     1696+                             "MODALIAS=bcma:m%04Xid%04Xrev%02Xcl%02X", 
     1697+                             core->id.manuf, core->id.id, 
     1698+                             core->id.rev, core->id.class); 
     1699+} 
     1700+ 
    12821701+static int __init bcma_modinit(void) 
    12831702+{ 
     
    13101729--- /dev/null 
    13111730+++ b/drivers/bcma/scan.c 
    1312 @@ -0,0 +1,360 @@ 
     1731@@ -0,0 +1,486 @@ 
    13131732+/* 
    13141733+ * Broadcom specific AMBA 
     
    15131932+} 
    15141933+ 
    1515 +int bcma_bus_scan(struct bcma_bus *bus) 
    1516 +{ 
    1517 +       u32 erombase; 
    1518 +       u32 __iomem *eromptr, *eromend; 
    1519 + 
     1934+static struct bcma_device *bcma_find_core_by_index(struct bcma_bus *bus, 
     1935+                                                  u16 index) 
     1936+{ 
     1937+       struct bcma_device *core; 
     1938+ 
     1939+       list_for_each_entry(core, &bus->cores, list) { 
     1940+               if (core->core_index == index) 
     1941+                       return core; 
     1942+       } 
     1943+       return NULL; 
     1944+} 
     1945+ 
     1946+static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr, 
     1947+                             struct bcma_device_id *match, int core_num, 
     1948+                             struct bcma_device *core) 
     1949+{ 
     1950+       s32 tmp; 
     1951+       u8 i, j; 
    15201952+       s32 cia, cib; 
    15211953+       u8 ports[2], wrappers[2]; 
    15221954+ 
     1955+       /* get CIs */ 
     1956+       cia = bcma_erom_get_ci(bus, eromptr); 
     1957+       if (cia < 0) { 
     1958+               bcma_erom_push_ent(eromptr); 
     1959+               if (bcma_erom_is_end(bus, eromptr)) 
     1960+                       return -ESPIPE; 
     1961+               return -EILSEQ; 
     1962+       } 
     1963+       cib = bcma_erom_get_ci(bus, eromptr); 
     1964+       if (cib < 0) 
     1965+               return -EILSEQ; 
     1966+ 
     1967+       /* parse CIs */ 
     1968+       core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT; 
     1969+       core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT; 
     1970+       core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT; 
     1971+       ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT; 
     1972+       ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT; 
     1973+       wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT; 
     1974+       wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT; 
     1975+       core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT; 
     1976+ 
     1977+       if (((core->id.manuf == BCMA_MANUF_ARM) && 
     1978+            (core->id.id == 0xFFF)) || 
     1979+           (ports[1] == 0)) { 
     1980+               bcma_erom_skip_component(bus, eromptr); 
     1981+               return -ENXIO; 
     1982+       } 
     1983+ 
     1984+       /* check if component is a core at all */ 
     1985+       if (wrappers[0] + wrappers[1] == 0) { 
     1986+               /* we could save addrl of the router 
     1987+               if (cid == BCMA_CORE_OOB_ROUTER) 
     1988+                */ 
     1989+               bcma_erom_skip_component(bus, eromptr); 
     1990+               return -ENXIO; 
     1991+       } 
     1992+ 
     1993+       if (bcma_erom_is_bridge(bus, eromptr)) { 
     1994+               bcma_erom_skip_component(bus, eromptr); 
     1995+               return -ENXIO; 
     1996+       } 
     1997+ 
     1998+       if (bcma_find_core_by_index(bus, core_num)) { 
     1999+               bcma_erom_skip_component(bus, eromptr); 
     2000+               return -ENODEV; 
     2001+       } 
     2002+ 
     2003+       if (match && ((match->manuf != BCMA_ANY_MANUF && 
     2004+             match->manuf != core->id.manuf) || 
     2005+            (match->id != BCMA_ANY_ID && match->id != core->id.id) || 
     2006+            (match->rev != BCMA_ANY_REV && match->rev != core->id.rev) || 
     2007+            (match->class != BCMA_ANY_CLASS && match->class != core->id.class) 
     2008+           )) { 
     2009+               bcma_erom_skip_component(bus, eromptr); 
     2010+               return -ENODEV; 
     2011+       } 
     2012+ 
     2013+       /* get & parse master ports */ 
     2014+       for (i = 0; i < ports[0]; i++) { 
     2015+               s32 mst_port_d = bcma_erom_get_mst_port(bus, eromptr); 
     2016+               if (mst_port_d < 0) 
     2017+                       return -EILSEQ; 
     2018+       } 
     2019+ 
     2020+       /* get & parse slave ports */ 
     2021+       for (i = 0; i < ports[1]; i++) { 
     2022+               for (j = 0; ; j++) { 
     2023+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2024+                               SCAN_ADDR_TYPE_SLAVE, i); 
     2025+                       if (tmp < 0) { 
     2026+                               /* no more entries for port _i_ */ 
     2027+                               /* pr_debug("erom: slave port %d " 
     2028+                                * "has %d descriptors\n", i, j); */ 
     2029+                               break; 
     2030+                       } else { 
     2031+                               if (i == 0 && j == 0) 
     2032+                                       core->addr = tmp; 
     2033+                       } 
     2034+               } 
     2035+       } 
     2036+ 
     2037+       /* get & parse master wrappers */ 
     2038+       for (i = 0; i < wrappers[0]; i++) { 
     2039+               for (j = 0; ; j++) { 
     2040+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2041+                               SCAN_ADDR_TYPE_MWRAP, i); 
     2042+                       if (tmp < 0) { 
     2043+                               /* no more entries for port _i_ */ 
     2044+                               /* pr_debug("erom: master wrapper %d " 
     2045+                                * "has %d descriptors\n", i, j); */ 
     2046+                               break; 
     2047+                       } else { 
     2048+                               if (i == 0 && j == 0) 
     2049+                                       core->wrap = tmp; 
     2050+                       } 
     2051+               } 
     2052+       } 
     2053+ 
     2054+       /* get & parse slave wrappers */ 
     2055+       for (i = 0; i < wrappers[1]; i++) { 
     2056+               u8 hack = (ports[1] == 1) ? 0 : 1; 
     2057+               for (j = 0; ; j++) { 
     2058+                       tmp = bcma_erom_get_addr_desc(bus, eromptr, 
     2059+                               SCAN_ADDR_TYPE_SWRAP, i + hack); 
     2060+                       if (tmp < 0) { 
     2061+                               /* no more entries for port _i_ */ 
     2062+                               /* pr_debug("erom: master wrapper %d " 
     2063+                                * has %d descriptors\n", i, j); */ 
     2064+                               break; 
     2065+                       } else { 
     2066+                               if (wrappers[0] == 0 && !i && !j) 
     2067+                                       core->wrap = tmp; 
     2068+                       } 
     2069+               } 
     2070+       } 
     2071+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2072+               core->io_addr = ioremap_nocache(core->addr, BCMA_CORE_SIZE); 
     2073+               if (!core->io_addr) 
     2074+                       return -ENOMEM; 
     2075+               core->io_wrap = ioremap_nocache(core->wrap, BCMA_CORE_SIZE); 
     2076+               if (!core->io_wrap) { 
     2077+                       iounmap(core->io_addr); 
     2078+                       return -ENOMEM; 
     2079+               } 
     2080+       } 
     2081+       return 0; 
     2082+} 
     2083+ 
     2084+void bcma_init_bus(struct bcma_bus *bus) 
     2085+{ 
    15232086+       s32 tmp; 
    1524 +       u8 i, j; 
    1525 + 
    1526 +       int err; 
     2087+ 
     2088+       if (bus->init_done) 
     2089+               return; 
    15272090+ 
    15282091+       INIT_LIST_HEAD(&bus->cores); 
     
    15352098+       bus->chipinfo.rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT; 
    15362099+       bus->chipinfo.pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT; 
     2100+       bus->init_done = true; 
     2101+} 
     2102+ 
     2103+int bcma_bus_scan(struct bcma_bus *bus) 
     2104+{ 
     2105+       u32 erombase; 
     2106+       u32 __iomem *eromptr, *eromend; 
     2107+ 
     2108+       int err, core_num = 0; 
     2109+ 
     2110+       bcma_init_bus(bus); 
    15372111+ 
    15382112+       erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); 
    1539 +       eromptr = bus->mmio; 
     2113+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2114+               eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); 
     2115+               if (!eromptr) 
     2116+                       return -ENOMEM; 
     2117+       } else { 
     2118+               eromptr = bus->mmio; 
     2119+       } 
     2120+ 
    15402121+       eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); 
    15412122+ 
     
    15492130+               core->bus = bus; 
    15502131+ 
    1551 +               /* get CIs */ 
    1552 +               cia = bcma_erom_get_ci(bus, &eromptr); 
    1553 +               if (cia < 0) { 
    1554 +                       bcma_erom_push_ent(&eromptr); 
    1555 +                       if (bcma_erom_is_end(bus, &eromptr)) 
    1556 +                               break; 
    1557 +                       err= -EILSEQ; 
    1558 +                       goto out; 
    1559 +               } 
    1560 +               cib = bcma_erom_get_ci(bus, &eromptr); 
    1561 +               if (cib < 0) { 
    1562 +                       err= -EILSEQ; 
    1563 +                       goto out; 
    1564 +               } 
    1565 + 
    1566 +               /* parse CIs */ 
    1567 +               core->id.class = (cia & SCAN_CIA_CLASS) >> SCAN_CIA_CLASS_SHIFT; 
    1568 +               core->id.id = (cia & SCAN_CIA_ID) >> SCAN_CIA_ID_SHIFT; 
    1569 +               core->id.manuf = (cia & SCAN_CIA_MANUF) >> SCAN_CIA_MANUF_SHIFT; 
    1570 +               ports[0] = (cib & SCAN_CIB_NMP) >> SCAN_CIB_NMP_SHIFT; 
    1571 +               ports[1] = (cib & SCAN_CIB_NSP) >> SCAN_CIB_NSP_SHIFT; 
    1572 +               wrappers[0] = (cib & SCAN_CIB_NMW) >> SCAN_CIB_NMW_SHIFT; 
    1573 +               wrappers[1] = (cib & SCAN_CIB_NSW) >> SCAN_CIB_NSW_SHIFT; 
    1574 +               core->id.rev = (cib & SCAN_CIB_REV) >> SCAN_CIB_REV_SHIFT; 
    1575 + 
    1576 +               if (((core->id.manuf == BCMA_MANUF_ARM) && 
    1577 +                    (core->id.id == 0xFFF)) || 
    1578 +                   (ports[1] == 0)) { 
    1579 +                       bcma_erom_skip_component(bus, &eromptr); 
     2132+               err = bcma_get_next_core(bus, &eromptr, NULL, core_num, core); 
     2133+               if (err == -ENODEV) { 
     2134+                       core_num++; 
    15802135+                       continue; 
    1581 +               } 
    1582 + 
    1583 +               /* check if component is a core at all */ 
    1584 +               if (wrappers[0] + wrappers[1] == 0) { 
    1585 +                       /* we could save addrl of the router 
    1586 +                       if (cid == BCMA_CORE_OOB_ROUTER) 
    1587 +                        */ 
    1588 +                       bcma_erom_skip_component(bus, &eromptr); 
     2136+               } else if (err == -ENXIO) 
    15892137+                       continue; 
    1590 +               } 
    1591 + 
    1592 +               if (bcma_erom_is_bridge(bus, &eromptr)) { 
    1593 +                       bcma_erom_skip_component(bus, &eromptr); 
    1594 +                       continue; 
    1595 +               } 
    1596 + 
    1597 +               /* get & parse master ports */ 
    1598 +               for (i = 0; i < ports[0]; i++) { 
    1599 +                       u32 mst_port_d = bcma_erom_get_mst_port(bus, &eromptr); 
    1600 +                       if (mst_port_d < 0) { 
    1601 +                               err= -EILSEQ; 
    1602 +                               goto out; 
    1603 +                       } 
    1604 +               } 
    1605 + 
    1606 +               /* get & parse slave ports */ 
    1607 +               for (i = 0; i < ports[1]; i++) { 
    1608 +                       for (j = 0; ; j++) { 
    1609 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1610 +                                       SCAN_ADDR_TYPE_SLAVE, i); 
    1611 +                               if (tmp < 0) { 
    1612 +                                       /* no more entries for port _i_ */ 
    1613 +                                       /* pr_debug("erom: slave port %d " 
    1614 +                                        * "has %d descriptors\n", i, j); */ 
    1615 +                                       break; 
    1616 +                               } else { 
    1617 +                                       if (i == 0 && j == 0) 
    1618 +                                               core->addr = tmp; 
    1619 +                               } 
    1620 +                       } 
    1621 +               } 
    1622 + 
    1623 +               /* get & parse master wrappers */ 
    1624 +               for (i = 0; i < wrappers[0]; i++) { 
    1625 +                       for (j = 0; ; j++) { 
    1626 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1627 +                                       SCAN_ADDR_TYPE_MWRAP, i); 
    1628 +                               if (tmp < 0) { 
    1629 +                                       /* no more entries for port _i_ */ 
    1630 +                                       /* pr_debug("erom: master wrapper %d " 
    1631 +                                        * "has %d descriptors\n", i, j); */ 
    1632 +                                       break; 
    1633 +                               } else { 
    1634 +                                       if (i == 0 && j == 0) 
    1635 +                                               core->wrap = tmp; 
    1636 +                               } 
    1637 +                       } 
    1638 +               } 
    1639 + 
    1640 +               /* get & parse slave wrappers */ 
    1641 +               for (i = 0; i < wrappers[1]; i++) { 
    1642 +                       u8 hack = (ports[1] == 1) ? 0 : 1; 
    1643 +                       for (j = 0; ; j++) { 
    1644 +                               tmp = bcma_erom_get_addr_desc(bus, &eromptr, 
    1645 +                                       SCAN_ADDR_TYPE_SWRAP, i + hack); 
    1646 +                               if (tmp < 0) { 
    1647 +                                       /* no more entries for port _i_ */ 
    1648 +                                       /* pr_debug("erom: master wrapper %d " 
    1649 +                                        * has %d descriptors\n", i, j); */ 
    1650 +                                       break; 
    1651 +                               } else { 
    1652 +                                       if (wrappers[0] == 0 && !i && !j) 
    1653 +                                               core->wrap = tmp; 
    1654 +                               } 
    1655 +                       } 
    1656 +               } 
     2138+               else if (err == -ESPIPE) 
     2139+                       break; 
     2140+               else if (err < 0) 
     2141+                       return err; 
     2142+ 
     2143+               core->core_index = core_num++; 
     2144+               bus->nr_cores++; 
    16572145+ 
    16582146+               pr_info("Core %d found: %s " 
    16592147+                       "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n", 
    1660 +                       bus->nr_cores, bcma_device_name(&core->id), 
     2148+                       core->core_index, bcma_device_name(&core->id), 
    16612149+                       core->id.manuf, core->id.id, core->id.rev, 
    16622150+                       core->id.class); 
    16632151+ 
    1664 +               core->core_index = bus->nr_cores++; 
    16652152+               list_add(&core->list, &bus->cores); 
    1666 +               continue; 
    1667 +out: 
    1668 +               return err; 
    1669 +       } 
     2153+       } 
     2154+ 
     2155+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2156+               iounmap(eromptr); 
    16702157+ 
    16712158+       return 0; 
     2159+} 
     2160+ 
     2161+int __init bcma_bus_scan_early(struct bcma_bus *bus, 
     2162+                              struct bcma_device_id *match, 
     2163+                              struct bcma_device *core) 
     2164+{ 
     2165+       u32 erombase; 
     2166+       u32 __iomem *eromptr, *eromend; 
     2167+ 
     2168+       int err = -ENODEV; 
     2169+       int core_num = 0; 
     2170+ 
     2171+       erombase = bcma_scan_read32(bus, 0, BCMA_CC_EROM); 
     2172+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2173+               eromptr = ioremap_nocache(erombase, BCMA_CORE_SIZE); 
     2174+               if (!eromptr) 
     2175+                       return -ENOMEM; 
     2176+       } else { 
     2177+               eromptr = bus->mmio; 
     2178+       } 
     2179+ 
     2180+       eromend = eromptr + BCMA_CORE_SIZE / sizeof(u32); 
     2181+ 
     2182+       bcma_scan_switch_core(bus, erombase); 
     2183+ 
     2184+       while (eromptr < eromend) { 
     2185+               memset(core, 0, sizeof(*core)); 
     2186+               INIT_LIST_HEAD(&core->list); 
     2187+               core->bus = bus; 
     2188+ 
     2189+               err = bcma_get_next_core(bus, &eromptr, match, core_num, core); 
     2190+               if (err == -ENODEV) { 
     2191+                       core_num++; 
     2192+                       continue; 
     2193+               } else if (err == -ENXIO) 
     2194+                       continue; 
     2195+               else if (err == -ESPIPE) 
     2196+                       break; 
     2197+               else if (err < 0) 
     2198+                       return err; 
     2199+ 
     2200+               core->core_index = core_num++; 
     2201+               bus->nr_cores++; 
     2202+               pr_info("Core %d found: %s " 
     2203+                       "(manuf 0x%03X, id 0x%03X, rev 0x%02X, class 0x%X)\n", 
     2204+                       core->core_index, bcma_device_name(&core->id), 
     2205+                       core->id.manuf, core->id.id, core->id.rev, 
     2206+                       core->id.class); 
     2207+ 
     2208+               list_add(&core->list, &bus->cores); 
     2209+               err = 0; 
     2210+               break; 
     2211+       } 
     2212+ 
     2213+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2214+               iounmap(eromptr); 
     2215+ 
     2216+       return err; 
    16722217+} 
    16732218--- /dev/null 
     
    17322277--- /dev/null 
    17332278+++ b/include/linux/bcma/bcma.h 
    1734 @@ -0,0 +1,271 @@ 
     2279@@ -0,0 +1,298 @@ 
    17352280+#ifndef LINUX_BCMA_H_ 
    17362281+#define LINUX_BCMA_H_ 
     
    17412286+#include <linux/bcma/bcma_driver_chipcommon.h> 
    17422287+#include <linux/bcma/bcma_driver_pci.h> 
     2288+#include <linux/bcma/bcma_driver_mips.h> 
    17432289+#include <linux/ssb/ssb.h> /* SPROM sharing */ 
    17442290+ 
     
    17492295+ 
    17502296+enum bcma_hosttype { 
    1751 +       BCMA_HOSTTYPE_NONE, 
    17522297+       BCMA_HOSTTYPE_PCI, 
    17532298+       BCMA_HOSTTYPE_SDIO, 
     2299+       BCMA_HOSTTYPE_SOC, 
    17542300+}; 
    17552301+ 
     
    18652411+       struct device dev; 
    18662412+       struct device *dma_dev; 
     2413+ 
    18672414+       unsigned int irq; 
    18682415+       bool dev_registered; 
     
    18722419+       u32 addr; 
    18732420+       u32 wrap; 
     2421+ 
     2422+       void __iomem *io_addr; 
     2423+       void __iomem *io_wrap; 
    18742424+ 
    18752425+       void *drvdata; 
     
    19002450+extern 
    19012451+int __bcma_driver_register(struct bcma_driver *drv, struct module *owner); 
    1902 +static inline int bcma_driver_register(struct bcma_driver *drv) 
    1903 +{ 
    1904 +       return __bcma_driver_register(drv, THIS_MODULE); 
    1905 +} 
     2452+#define bcma_driver_register(drv) \ 
     2453+       __bcma_driver_register(drv, THIS_MODULE) 
     2454+ 
    19062455+extern void bcma_driver_unregister(struct bcma_driver *drv); 
    19072456+ 
     
    19252474+       struct list_head cores; 
    19262475+       u8 nr_cores; 
     2476+       u8 init_done:1; 
    19272477+ 
    19282478+       struct bcma_drv_cc drv_cc; 
    19292479+       struct bcma_drv_pci drv_pci; 
     2480+       struct bcma_drv_mips drv_mips; 
    19302481+ 
    19312482+       /* We decided to share SPROM struct with SSB as long as we do not need 
     
    19342485+}; 
    19352486+ 
    1936 +extern inline u32 bcma_read8(struct bcma_device *core, u16 offset) 
     2487+static inline u32 bcma_read8(struct bcma_device *core, u16 offset) 
    19372488+{ 
    19382489+       return core->bus->ops->read8(core, offset); 
    19392490+} 
    1940 +extern inline u32 bcma_read16(struct bcma_device *core, u16 offset) 
     2491+static inline u32 bcma_read16(struct bcma_device *core, u16 offset) 
    19412492+{ 
    19422493+       return core->bus->ops->read16(core, offset); 
    19432494+} 
    1944 +extern inline u32 bcma_read32(struct bcma_device *core, u16 offset) 
     2495+static inline u32 bcma_read32(struct bcma_device *core, u16 offset) 
    19452496+{ 
    19462497+       return core->bus->ops->read32(core, offset); 
    19472498+} 
    1948 +extern inline 
     2499+static inline 
    19492500+void bcma_write8(struct bcma_device *core, u16 offset, u32 value) 
    19502501+{ 
    19512502+       core->bus->ops->write8(core, offset, value); 
    19522503+} 
    1953 +extern inline 
     2504+static inline 
    19542505+void bcma_write16(struct bcma_device *core, u16 offset, u32 value) 
    19552506+{ 
    19562507+       core->bus->ops->write16(core, offset, value); 
    19572508+} 
    1958 +extern inline 
     2509+static inline 
    19592510+void bcma_write32(struct bcma_device *core, u16 offset, u32 value) 
    19602511+{ 
     
    19622513+} 
    19632514+#ifdef CONFIG_BCMA_BLOCKIO 
    1964 +extern inline void bcma_block_read(struct bcma_device *core, void *buffer, 
     2515+static inline void bcma_block_read(struct bcma_device *core, void *buffer, 
    19652516+                                  size_t count, u16 offset, u8 reg_width) 
    19662517+{ 
    19672518+       core->bus->ops->block_read(core, buffer, count, offset, reg_width); 
    19682519+} 
    1969 +extern inline void bcma_block_write(struct bcma_device *core, const void *buffer, 
    1970 +                                   size_t count, u16 offset, u8 reg_width) 
     2520+static inline void bcma_block_write(struct bcma_device *core, 
     2521+                                   const void *buffer, size_t count, 
     2522+                                   u16 offset, u8 reg_width) 
    19712523+{ 
    19722524+       core->bus->ops->block_write(core, buffer, count, offset, reg_width); 
    19732525+} 
    19742526+#endif 
    1975 +extern inline u32 bcma_aread32(struct bcma_device *core, u16 offset) 
     2527+static inline u32 bcma_aread32(struct bcma_device *core, u16 offset) 
    19762528+{ 
    19772529+       return core->bus->ops->aread32(core, offset); 
    19782530+} 
    1979 +extern inline 
     2531+static inline 
    19802532+void bcma_awrite32(struct bcma_device *core, u16 offset, u32 value) 
    19812533+{ 
     
    19832535+} 
    19842536+ 
    1985 +#define bcma_mask32(cc, offset, mask) \ 
    1986 +       bcma_write32(cc, offset, bcma_read32(cc, offset) & (mask)) 
    1987 +#define bcma_set32(cc, offset, set) \ 
    1988 +       bcma_write32(cc, offset, bcma_read32(cc, offset) | (set)) 
    1989 +#define bcma_maskset32(cc, offset, mask, set) \ 
    1990 +       bcma_write32(cc, offset, (bcma_read32(cc, offset) & (mask)) | (set)) 
     2537+static inline void bcma_mask32(struct bcma_device *cc, u16 offset, u32 mask) 
     2538+{ 
     2539+       bcma_write32(cc, offset, bcma_read32(cc, offset) & mask); 
     2540+} 
     2541+static inline void bcma_set32(struct bcma_device *cc, u16 offset, u32 set) 
     2542+{ 
     2543+       bcma_write32(cc, offset, bcma_read32(cc, offset) | set); 
     2544+} 
     2545+static inline void bcma_maskset32(struct bcma_device *cc, 
     2546+                                 u16 offset, u32 mask, u32 set) 
     2547+{ 
     2548+       bcma_write32(cc, offset, (bcma_read32(cc, offset) & mask) | set); 
     2549+} 
     2550+static inline void bcma_mask16(struct bcma_device *cc, u16 offset, u16 mask) 
     2551+{ 
     2552+       bcma_write16(cc, offset, bcma_read16(cc, offset) & mask); 
     2553+} 
     2554+static inline void bcma_set16(struct bcma_device *cc, u16 offset, u16 set) 
     2555+{ 
     2556+       bcma_write16(cc, offset, bcma_read16(cc, offset) | set); 
     2557+} 
     2558+static inline void bcma_maskset16(struct bcma_device *cc, 
     2559+                                 u16 offset, u16 mask, u16 set) 
     2560+{ 
     2561+       bcma_write16(cc, offset, (bcma_read16(cc, offset) & mask) | set); 
     2562+} 
    19912563+ 
    19922564+extern bool bcma_core_is_enabled(struct bcma_device *core); 
     
    20062578--- /dev/null 
    20072579+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    2008 @@ -0,0 +1,296 @@ 
     2580@@ -0,0 +1,391 @@ 
    20092581+#ifndef LINUX_BCMA_DRIVER_CC_H_ 
    20102582+#define LINUX_BCMA_DRIVER_CC_H_ 
     
    20332605+#define   BCMA_CC_FLASHT_STSER         0x00000100      /* ST serial flash */ 
    20342606+#define   BCMA_CC_FLASHT_ATSER         0x00000200      /* Atmel serial flash */ 
     2607+#define   BCMA_CC_FLASHT_NFLASH                0x00000200 
    20352608+#define          BCMA_CC_FLASHT_PARA           0x00000700      /* Parallel flash */ 
    20362609+#define  BCMA_CC_CAP_PLLT              0x00038000      /* PLL Type */ 
     
    21872760+#define BCMA_CC_PROG_WAITCNT           0x0124 
    21882761+#define BCMA_CC_FLASH_CFG              0x0128 
     2762+#define  BCMA_CC_FLASH_CFG_DS          0x0010  /* Data size, 0=8bit, 1=16bit */ 
    21892763+#define BCMA_CC_FLASH_WAITCNT          0x012C 
    21902764+/* 0x1E0 is defined as shared BCMA_CLKCTLST */ 
     
    22102784+#define  BCMA_CC_PMU_CTL_ILP_DIV       0xFFFF0000 /* ILP div mask */ 
    22112785+#define  BCMA_CC_PMU_CTL_ILP_DIV_SHIFT 16 
     2786+#define  BCMA_CC_PMU_CTL_PLL_UPD       0x00000400 
    22122787+#define  BCMA_CC_PMU_CTL_NOILPONW      0x00000200 /* No ILP on wait */ 
    22132788+#define  BCMA_CC_PMU_CTL_HTREQEN       0x00000100 /* HT req enable */ 
     
    22482823+#define BCMA_CC_SPROM_PCIE6            0x0830 /* SPROM beginning on PCIe rev >= 6 */ 
    22492824+ 
     2825+/* Divider allocation in 4716/47162/5356 */ 
     2826+#define BCMA_CC_PMU5_MAINPLL_CPU       1 
     2827+#define BCMA_CC_PMU5_MAINPLL_MEM       2 
     2828+#define BCMA_CC_PMU5_MAINPLL_SSB       3 
     2829+ 
     2830+/* PLL usage in 4716/47162 */ 
     2831+#define BCMA_CC_PMU4716_MAINPLL_PLL0   12 
     2832+ 
     2833+/* PLL usage in 5356/5357 */ 
     2834+#define BCMA_CC_PMU5356_MAINPLL_PLL0   0 
     2835+#define BCMA_CC_PMU5357_MAINPLL_PLL0   0 
     2836+ 
     2837+/* 4706 PMU */ 
     2838+#define BCMA_CC_PMU4706_MAINPLL_PLL0   0 
     2839+ 
     2840+/* ALP clock on pre-PMU chips */ 
     2841+#define BCMA_CC_PMU_ALP_CLOCK          20000000 
     2842+/* HT clock for systems with PMU-enabled chipcommon */ 
     2843+#define BCMA_CC_PMU_HT_CLOCK           80000000 
     2844+ 
     2845+/* PMU rev 5 (& 6) */ 
     2846+#define BCMA_CC_PPL_P1P2_OFF           0 
     2847+#define BCMA_CC_PPL_P1_MASK            0x0f000000 
     2848+#define BCMA_CC_PPL_P1_SHIFT           24 
     2849+#define BCMA_CC_PPL_P2_MASK            0x00f00000 
     2850+#define BCMA_CC_PPL_P2_SHIFT           20 
     2851+#define BCMA_CC_PPL_M14_OFF            1 
     2852+#define BCMA_CC_PPL_MDIV_MASK          0x000000ff 
     2853+#define BCMA_CC_PPL_MDIV_WIDTH         8 
     2854+#define BCMA_CC_PPL_NM5_OFF            2 
     2855+#define BCMA_CC_PPL_NDIV_MASK          0xfff00000 
     2856+#define BCMA_CC_PPL_NDIV_SHIFT         20 
     2857+#define BCMA_CC_PPL_FMAB_OFF           3 
     2858+#define BCMA_CC_PPL_MRAT_MASK          0xf0000000 
     2859+#define BCMA_CC_PPL_MRAT_SHIFT         28 
     2860+#define BCMA_CC_PPL_ABRAT_MASK         0x08000000 
     2861+#define BCMA_CC_PPL_ABRAT_SHIFT                27 
     2862+#define BCMA_CC_PPL_FDIV_MASK          0x07ffffff 
     2863+#define BCMA_CC_PPL_PLLCTL_OFF         4 
     2864+#define BCMA_CC_PPL_PCHI_OFF           5 
     2865+#define BCMA_CC_PPL_PCHI_MASK          0x0000003f 
     2866+ 
     2867+/* BCM4331 ChipControl numbers. */ 
     2868+#define BCMA_CHIPCTL_4331_BT_COEXIST           BIT(0)  /* 0 disable */ 
     2869+#define BCMA_CHIPCTL_4331_SECI                 BIT(1)  /* 0 SECI is disabled (JATG functional) */ 
     2870+#define BCMA_CHIPCTL_4331_EXT_LNA              BIT(2)  /* 0 disable */ 
     2871+#define BCMA_CHIPCTL_4331_SPROM_GPIO13_15      BIT(3)  /* sprom/gpio13-15 mux */ 
     2872+#define BCMA_CHIPCTL_4331_EXTPA_EN             BIT(4)  /* 0 ext pa disable, 1 ext pa enabled */ 
     2873+#define BCMA_CHIPCTL_4331_GPIOCLK_ON_SPROMCS   BIT(5)  /* set drive out GPIO_CLK on sprom_cs pin */ 
     2874+#define BCMA_CHIPCTL_4331_PCIE_MDIO_ON_SPROMCS BIT(6)  /* use sprom_cs pin as PCIE mdio interface */ 
     2875+#define BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5     BIT(7)  /* aband extpa will be at gpio2/5 and sprom_dout */ 
     2876+#define BCMA_CHIPCTL_4331_OVR_PIPEAUXCLKEN     BIT(8)  /* override core control on pipe_AuxClkEnable */ 
     2877+#define BCMA_CHIPCTL_4331_OVR_PIPEAUXPWRDOWN   BIT(9)  /* override core control on pipe_AuxPowerDown */ 
     2878+#define BCMA_CHIPCTL_4331_PCIE_AUXCLKEN                BIT(10) /* pcie_auxclkenable */ 
     2879+#define BCMA_CHIPCTL_4331_PCIE_PIPE_PLLDOWN    BIT(11) /* pcie_pipe_pllpowerdown */ 
     2880+#define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4     BIT(16) /* enable bt_shd0 at gpio4 */ 
     2881+#define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5     BIT(17) /* enable bt_shd1 at gpio5 */ 
     2882+ 
    22502883+/* Data for the PMU, if available. 
    22512884+ * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) 
     
    22562889+}; 
    22572890+ 
     2891+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     2892+struct bcma_pflash { 
     2893+       u8 buswidth; 
     2894+       u32 window; 
     2895+       u32 window_size; 
     2896+}; 
     2897+ 
     2898+struct bcma_serial_port { 
     2899+       void *regs; 
     2900+       unsigned long clockspeed; 
     2901+       unsigned int irq; 
     2902+       unsigned int baud_base; 
     2903+       unsigned int reg_shift; 
     2904+}; 
     2905+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     2906+ 
    22582907+struct bcma_drv_cc { 
    22592908+       struct bcma_device *core; 
     
    22612910+       u32 capabilities; 
    22622911+       u32 capabilities_ext; 
     2912+       u8 setup_done:1; 
    22632913+       /* Fast Powerup Delay constant */ 
    22642914+       u16 fast_pwrup_delay; 
    22652915+       struct bcma_chipcommon_pmu pmu; 
     2916+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     2917+       struct bcma_pflash pflash; 
     2918+ 
     2919+       int nr_serial_ports; 
     2920+       struct bcma_serial_port serial_ports[4]; 
     2921+#endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    22662922+}; 
    22672923+ 
     
    22832939+extern void bcma_chipco_suspend(struct bcma_drv_cc *cc); 
    22842940+extern void bcma_chipco_resume(struct bcma_drv_cc *cc); 
     2941+ 
     2942+void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable); 
    22852943+ 
    22862944+extern void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, 
     
    23012959+/* PMU support */ 
    23022960+extern void bcma_pmu_init(struct bcma_drv_cc *cc); 
     2961+ 
     2962+extern void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, 
     2963+                                 u32 value); 
     2964+extern void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, 
     2965+                                   u32 mask, u32 set); 
     2966+extern void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc, 
     2967+                                       u32 offset, u32 mask, u32 set); 
     2968+extern void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, 
     2969+                                      u32 offset, u32 mask, u32 set); 
    23032970+ 
    23042971+#endif /* LINUX_BCMA_DRIVER_CC_H_ */ 
     
    25253192--- /dev/null 
    25263193+++ b/drivers/bcma/sprom.c 
    2527 @@ -0,0 +1,171 @@ 
     3194@@ -0,0 +1,247 @@ 
    25283195+/* 
    25293196+ * Broadcom specific AMBA 
     
    26573324+       int i; 
    26583325+ 
     3326+       bus->sprom.revision = sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 
     3327+               SSB_SPROM_REVISION_REV; 
     3328+ 
    26593329+       for (i = 0; i < 3; i++) { 
    26603330+               v = sprom[SPOFF(SSB_SPROM8_IL0MAC) + i]; 
    26613331+               *(((__be16 *)bus->sprom.il0mac) + i) = cpu_to_be16(v); 
    26623332+       } 
     3333+ 
     3334+       bus->sprom.board_rev = sprom[SPOFF(SSB_SPROM8_BOARDREV)]; 
     3335+ 
     3336+       bus->sprom.txpid2g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] & 
     3337+            SSB_SPROM4_TXPID2G0) >> SSB_SPROM4_TXPID2G0_SHIFT; 
     3338+       bus->sprom.txpid2g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID2G01)] & 
     3339+            SSB_SPROM4_TXPID2G1) >> SSB_SPROM4_TXPID2G1_SHIFT; 
     3340+       bus->sprom.txpid2g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] & 
     3341+            SSB_SPROM4_TXPID2G2) >> SSB_SPROM4_TXPID2G2_SHIFT; 
     3342+       bus->sprom.txpid2g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID2G23)] & 
     3343+            SSB_SPROM4_TXPID2G3) >> SSB_SPROM4_TXPID2G3_SHIFT; 
     3344+ 
     3345+       bus->sprom.txpid5gl[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] & 
     3346+            SSB_SPROM4_TXPID5GL0) >> SSB_SPROM4_TXPID5GL0_SHIFT; 
     3347+       bus->sprom.txpid5gl[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL01)] & 
     3348+            SSB_SPROM4_TXPID5GL1) >> SSB_SPROM4_TXPID5GL1_SHIFT; 
     3349+       bus->sprom.txpid5gl[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] & 
     3350+            SSB_SPROM4_TXPID5GL2) >> SSB_SPROM4_TXPID5GL2_SHIFT; 
     3351+       bus->sprom.txpid5gl[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GL23)] & 
     3352+            SSB_SPROM4_TXPID5GL3) >> SSB_SPROM4_TXPID5GL3_SHIFT; 
     3353+ 
     3354+       bus->sprom.txpid5g[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] & 
     3355+            SSB_SPROM4_TXPID5G0) >> SSB_SPROM4_TXPID5G0_SHIFT; 
     3356+       bus->sprom.txpid5g[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5G01)] & 
     3357+            SSB_SPROM4_TXPID5G1) >> SSB_SPROM4_TXPID5G1_SHIFT; 
     3358+       bus->sprom.txpid5g[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] & 
     3359+            SSB_SPROM4_TXPID5G2) >> SSB_SPROM4_TXPID5G2_SHIFT; 
     3360+       bus->sprom.txpid5g[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5G23)] & 
     3361+            SSB_SPROM4_TXPID5G3) >> SSB_SPROM4_TXPID5G3_SHIFT; 
     3362+ 
     3363+       bus->sprom.txpid5gh[0] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] & 
     3364+            SSB_SPROM4_TXPID5GH0) >> SSB_SPROM4_TXPID5GH0_SHIFT; 
     3365+       bus->sprom.txpid5gh[1] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH01)] & 
     3366+            SSB_SPROM4_TXPID5GH1) >> SSB_SPROM4_TXPID5GH1_SHIFT; 
     3367+       bus->sprom.txpid5gh[2] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] & 
     3368+            SSB_SPROM4_TXPID5GH2) >> SSB_SPROM4_TXPID5GH2_SHIFT; 
     3369+       bus->sprom.txpid5gh[3] = (sprom[SPOFF(SSB_SPROM4_TXPID5GH23)] & 
     3370+            SSB_SPROM4_TXPID5GH3) >> SSB_SPROM4_TXPID5GH3_SHIFT; 
     3371+ 
     3372+       bus->sprom.boardflags_lo = sprom[SPOFF(SSB_SPROM8_BFLLO)]; 
     3373+       bus->sprom.boardflags_hi = sprom[SPOFF(SSB_SPROM8_BFLHI)]; 
     3374+       bus->sprom.boardflags2_lo = sprom[SPOFF(SSB_SPROM8_BFL2LO)]; 
     3375+       bus->sprom.boardflags2_hi = sprom[SPOFF(SSB_SPROM8_BFL2HI)]; 
     3376+ 
     3377+       bus->sprom.country_code = sprom[SPOFF(SSB_SPROM8_CCODE)]; 
     3378+ 
     3379+       bus->sprom.fem.ghz2.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3380+               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT; 
     3381+       bus->sprom.fem.ghz2.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3382+               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT; 
     3383+       bus->sprom.fem.ghz2.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3384+               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT; 
     3385+       bus->sprom.fem.ghz2.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3386+               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT; 
     3387+       bus->sprom.fem.ghz2.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM2G)] & 
     3388+               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT; 
     3389+ 
     3390+       bus->sprom.fem.ghz5.tssipos = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3391+               SSB_SROM8_FEM_TSSIPOS) >> SSB_SROM8_FEM_TSSIPOS_SHIFT; 
     3392+       bus->sprom.fem.ghz5.extpa_gain = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3393+               SSB_SROM8_FEM_EXTPA_GAIN) >> SSB_SROM8_FEM_EXTPA_GAIN_SHIFT; 
     3394+       bus->sprom.fem.ghz5.pdet_range = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3395+               SSB_SROM8_FEM_PDET_RANGE) >> SSB_SROM8_FEM_PDET_RANGE_SHIFT; 
     3396+       bus->sprom.fem.ghz5.tr_iso = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3397+               SSB_SROM8_FEM_TR_ISO) >> SSB_SROM8_FEM_TR_ISO_SHIFT; 
     3398+       bus->sprom.fem.ghz5.antswlut = (sprom[SPOFF(SSB_SPROM8_FEM5G)] & 
     3399+               SSB_SROM8_FEM_ANTSWLUT) >> SSB_SROM8_FEM_ANTSWLUT_SHIFT; 
    26633400+} 
    26643401+ 
     
    26793416+       if (!sprom) 
    26803417+               return -ENOMEM; 
     3418+ 
     3419+       if (bus->chipinfo.id == 0x4331) 
     3420+               bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, false); 
    26813421+ 
    26823422+       /* Most cards have SPROM moved by additional offset 0x30 (48 dwords). 
     
    26863426+               BCMA_CC_SPROM_PCIE6; 
    26873427+       bcma_sprom_read(bus, offset, sprom); 
     3428+ 
     3429+       if (bus->chipinfo.id == 0x4331) 
     3430+               bcma_chipco_bcm4331_ext_pa_lines_ctl(&bus->drv_cc, true); 
    26883431+ 
    26893432+       err = bcma_sprom_valid(sprom); 
     
    27143457+       pr_err("No support for PCI core in hostmode yet\n"); 
    27153458+} 
     3459--- /dev/null 
     3460+++ b/drivers/bcma/driver_mips.c 
     3461@@ -0,0 +1,256 @@ 
     3462+/* 
     3463+ * Broadcom specific AMBA 
     3464+ * Broadcom MIPS32 74K core driver 
     3465+ * 
     3466+ * Copyright 2009, Broadcom Corporation 
     3467+ * Copyright 2006, 2007, Michael Buesch <mb@bu3sch.de> 
     3468+ * Copyright 2010, Bernhard Loos <bernhardloos@googlemail.com> 
     3469+ * Copyright 2011, Hauke Mehrtens <hauke@hauke-m.de> 
     3470+ * 
     3471+ * Licensed under the GNU/GPL. See COPYING for details. 
     3472+ */ 
     3473+ 
     3474+#include "bcma_private.h" 
     3475+ 
     3476+#include <linux/bcma/bcma.h> 
     3477+ 
     3478+#include <linux/serial.h> 
     3479+#include <linux/serial_core.h> 
     3480+#include <linux/serial_reg.h> 
     3481+#include <linux/time.h> 
     3482+ 
     3483+/* The 47162a0 hangs when reading MIPS DMP registers registers */ 
     3484+static inline bool bcma_core_mips_bcm47162a0_quirk(struct bcma_device *dev) 
     3485+{ 
     3486+       return dev->bus->chipinfo.id == 47162 && dev->bus->chipinfo.rev == 0 && 
     3487+              dev->id.id == BCMA_CORE_MIPS_74K; 
     3488+} 
     3489+ 
     3490+/* The 5357b0 hangs when reading USB20H DMP registers */ 
     3491+static inline bool bcma_core_mips_bcm5357b0_quirk(struct bcma_device *dev) 
     3492+{ 
     3493+       return (dev->bus->chipinfo.id == 0x5357 || 
     3494+               dev->bus->chipinfo.id == 0x4749) && 
     3495+              dev->bus->chipinfo.pkg == 11 && 
     3496+              dev->id.id == BCMA_CORE_USB20_HOST; 
     3497+} 
     3498+ 
     3499+static inline u32 mips_read32(struct bcma_drv_mips *mcore, 
     3500+                             u16 offset) 
     3501+{ 
     3502+       return bcma_read32(mcore->core, offset); 
     3503+} 
     3504+ 
     3505+static inline void mips_write32(struct bcma_drv_mips *mcore, 
     3506+                               u16 offset, 
     3507+                               u32 value) 
     3508+{ 
     3509+       bcma_write32(mcore->core, offset, value); 
     3510+} 
     3511+ 
     3512+static const u32 ipsflag_irq_mask[] = { 
     3513+       0, 
     3514+       BCMA_MIPS_IPSFLAG_IRQ1, 
     3515+       BCMA_MIPS_IPSFLAG_IRQ2, 
     3516+       BCMA_MIPS_IPSFLAG_IRQ3, 
     3517+       BCMA_MIPS_IPSFLAG_IRQ4, 
     3518+}; 
     3519+ 
     3520+static const u32 ipsflag_irq_shift[] = { 
     3521+       0, 
     3522+       BCMA_MIPS_IPSFLAG_IRQ1_SHIFT, 
     3523+       BCMA_MIPS_IPSFLAG_IRQ2_SHIFT, 
     3524+       BCMA_MIPS_IPSFLAG_IRQ3_SHIFT, 
     3525+       BCMA_MIPS_IPSFLAG_IRQ4_SHIFT, 
     3526+}; 
     3527+ 
     3528+static u32 bcma_core_mips_irqflag(struct bcma_device *dev) 
     3529+{ 
     3530+       u32 flag; 
     3531+ 
     3532+       if (bcma_core_mips_bcm47162a0_quirk(dev)) 
     3533+               return dev->core_index; 
     3534+       if (bcma_core_mips_bcm5357b0_quirk(dev)) 
     3535+               return dev->core_index; 
     3536+       flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30); 
     3537+ 
     3538+       return flag & 0x1F; 
     3539+} 
     3540+ 
     3541+/* Get the MIPS IRQ assignment for a specified device. 
     3542+ * If unassigned, 0 is returned. 
     3543+ */ 
     3544+unsigned int bcma_core_mips_irq(struct bcma_device *dev) 
     3545+{ 
     3546+       struct bcma_device *mdev = dev->bus->drv_mips.core; 
     3547+       u32 irqflag; 
     3548+       unsigned int irq; 
     3549+ 
     3550+       irqflag = bcma_core_mips_irqflag(dev); 
     3551+ 
     3552+       for (irq = 1; irq <= 4; irq++) 
     3553+               if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) & 
     3554+                   (1 << irqflag)) 
     3555+                       return irq; 
     3556+ 
     3557+       return 0; 
     3558+} 
     3559+EXPORT_SYMBOL(bcma_core_mips_irq); 
     3560+ 
     3561+static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) 
     3562+{ 
     3563+       unsigned int oldirq = bcma_core_mips_irq(dev); 
     3564+       struct bcma_bus *bus = dev->bus; 
     3565+       struct bcma_device *mdev = bus->drv_mips.core; 
     3566+       u32 irqflag; 
     3567+ 
     3568+       irqflag = bcma_core_mips_irqflag(dev); 
     3569+       BUG_ON(oldirq == 6); 
     3570+ 
     3571+       dev->irq = irq + 2; 
     3572+ 
     3573+       /* clear the old irq */ 
     3574+       if (oldirq == 0) 
     3575+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0), 
     3576+                           bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) & 
     3577+                           ~(1 << irqflag)); 
     3578+       else 
     3579+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0); 
     3580+ 
     3581+       /* assign the new one */ 
     3582+       if (irq == 0) { 
     3583+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0), 
     3584+                           bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) | 
     3585+                           (1 << irqflag)); 
     3586+       } else { 
     3587+               u32 oldirqflag = bcma_read32(mdev, 
     3588+                                            BCMA_MIPS_MIPS74K_INTMASK(irq)); 
     3589+               if (oldirqflag) { 
     3590+                       struct bcma_device *core; 
     3591+ 
     3592+                       /* backplane irq line is in use, find out who uses 
     3593+                        * it and set user to irq 0 
     3594+                        */ 
     3595+                       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3596+                               if ((1 << bcma_core_mips_irqflag(core)) == 
     3597+                                   oldirqflag) { 
     3598+                                       bcma_core_mips_set_irq(core, 0); 
     3599+                                       break; 
     3600+                               } 
     3601+                       } 
     3602+               } 
     3603+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 
     3604+                            1 << irqflag); 
     3605+       } 
     3606+ 
     3607+       pr_info("set_irq: core 0x%04x, irq %d => %d\n", 
     3608+               dev->id.id, oldirq + 2, irq + 2); 
     3609+} 
     3610+ 
     3611+static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) 
     3612+{ 
     3613+       int i; 
     3614+       static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"}; 
     3615+       printk(KERN_INFO KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id); 
     3616+       for (i = 0; i <= 6; i++) 
     3617+               printk(" %s%s", irq_name[i], i == irq ? "*" : " "); 
     3618+       printk("\n"); 
     3619+} 
     3620+ 
     3621+static void bcma_core_mips_dump_irq(struct bcma_bus *bus) 
     3622+{ 
     3623+       struct bcma_device *core; 
     3624+ 
     3625+       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3626+               bcma_core_mips_print_irq(core, bcma_core_mips_irq(core)); 
     3627+       } 
     3628+} 
     3629+ 
     3630+u32 bcma_cpu_clock(struct bcma_drv_mips *mcore) 
     3631+{ 
     3632+       struct bcma_bus *bus = mcore->core->bus; 
     3633+ 
     3634+       if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU) 
     3635+               return bcma_pmu_get_clockcpu(&bus->drv_cc); 
     3636+ 
     3637+       pr_err("No PMU available, need this to get the cpu clock\n"); 
     3638+       return 0; 
     3639+} 
     3640+EXPORT_SYMBOL(bcma_cpu_clock); 
     3641+ 
     3642+static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore) 
     3643+{ 
     3644+       struct bcma_bus *bus = mcore->core->bus; 
     3645+ 
     3646+       switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
     3647+       case BCMA_CC_FLASHT_STSER: 
     3648+       case BCMA_CC_FLASHT_ATSER: 
     3649+               pr_err("Serial flash not supported.\n"); 
     3650+               break; 
     3651+       case BCMA_CC_FLASHT_PARA: 
     3652+               pr_info("found parallel flash.\n"); 
     3653+               bus->drv_cc.pflash.window = 0x1c000000; 
     3654+               bus->drv_cc.pflash.window_size = 0x02000000; 
     3655+ 
     3656+               if ((bcma_read32(bus->drv_cc.core, BCMA_CC_FLASH_CFG) & 
     3657+                    BCMA_CC_FLASH_CFG_DS) == 0) 
     3658+                       bus->drv_cc.pflash.buswidth = 1; 
     3659+               else 
     3660+                       bus->drv_cc.pflash.buswidth = 2; 
     3661+               break; 
     3662+       default: 
     3663+               pr_err("flash not supported.\n"); 
     3664+       } 
     3665+} 
     3666+ 
     3667+void bcma_core_mips_init(struct bcma_drv_mips *mcore) 
     3668+{ 
     3669+       struct bcma_bus *bus; 
     3670+       struct bcma_device *core; 
     3671+       bus = mcore->core->bus; 
     3672+ 
     3673+       pr_info("Initializing MIPS core...\n"); 
     3674+ 
     3675+       if (!mcore->setup_done) 
     3676+               mcore->assigned_irqs = 1; 
     3677+ 
     3678+       /* Assign IRQs to all cores on the bus */ 
     3679+       list_for_each_entry_reverse(core, &bus->cores, list) { 
     3680+               int mips_irq; 
     3681+               if (core->irq) 
     3682+                       continue; 
     3683+ 
     3684+               mips_irq = bcma_core_mips_irq(core); 
     3685+               if (mips_irq > 4) 
     3686+                       core->irq = 0; 
     3687+               else 
     3688+                       core->irq = mips_irq + 2; 
     3689+               if (core->irq > 5) 
     3690+                       continue; 
     3691+               switch (core->id.id) { 
     3692+               case BCMA_CORE_PCI: 
     3693+               case BCMA_CORE_PCIE: 
     3694+               case BCMA_CORE_ETHERNET: 
     3695+               case BCMA_CORE_ETHERNET_GBIT: 
     3696+               case BCMA_CORE_MAC_GBIT: 
     3697+               case BCMA_CORE_80211: 
     3698+               case BCMA_CORE_USB20_HOST: 
     3699+                       /* These devices get their own IRQ line if available, 
     3700+                        * the rest goes on IRQ0 
     3701+                        */ 
     3702+                       if (mcore->assigned_irqs <= 4) 
     3703+                               bcma_core_mips_set_irq(core, 
     3704+                                                      mcore->assigned_irqs++); 
     3705+                       break; 
     3706+               } 
     3707+       } 
     3708+       pr_info("IRQ reconfiguration done\n"); 
     3709+       bcma_core_mips_dump_irq(bus); 
     3710+ 
     3711+       if (mcore->setup_done) 
     3712+               return; 
     3713+ 
     3714+       bcma_chipco_serial_init(&bus->drv_cc); 
     3715+       bcma_core_mips_flash_detect(mcore); 
     3716+       mcore->setup_done = true; 
     3717+} 
     3718--- /dev/null 
     3719+++ b/drivers/bcma/host_soc.c 
     3720@@ -0,0 +1,183 @@ 
     3721+/* 
     3722+ * Broadcom specific AMBA 
     3723+ * System on Chip (SoC) Host 
     3724+ * 
     3725+ * Licensed under the GNU/GPL. See COPYING for details. 
     3726+ */ 
     3727+ 
     3728+#include "bcma_private.h" 
     3729+#include "scan.h" 
     3730+#include <linux/bcma/bcma.h> 
     3731+#include <linux/bcma/bcma_soc.h> 
     3732+ 
     3733+static u8 bcma_host_soc_read8(struct bcma_device *core, u16 offset) 
     3734+{ 
     3735+       return readb(core->io_addr + offset); 
     3736+} 
     3737+ 
     3738+static u16 bcma_host_soc_read16(struct bcma_device *core, u16 offset) 
     3739+{ 
     3740+       return readw(core->io_addr + offset); 
     3741+} 
     3742+ 
     3743+static u32 bcma_host_soc_read32(struct bcma_device *core, u16 offset) 
     3744+{ 
     3745+       return readl(core->io_addr + offset); 
     3746+} 
     3747+ 
     3748+static void bcma_host_soc_write8(struct bcma_device *core, u16 offset, 
     3749+                                u8 value) 
     3750+{ 
     3751+       writeb(value, core->io_addr + offset); 
     3752+} 
     3753+ 
     3754+static void bcma_host_soc_write16(struct bcma_device *core, u16 offset, 
     3755+                                u16 value) 
     3756+{ 
     3757+       writew(value, core->io_addr + offset); 
     3758+} 
     3759+ 
     3760+static void bcma_host_soc_write32(struct bcma_device *core, u16 offset, 
     3761+                                u32 value) 
     3762+{ 
     3763+       writel(value, core->io_addr + offset); 
     3764+} 
     3765+ 
     3766+#ifdef CONFIG_BCMA_BLOCKIO 
     3767+static void bcma_host_soc_block_read(struct bcma_device *core, void *buffer, 
     3768+                                    size_t count, u16 offset, u8 reg_width) 
     3769+{ 
     3770+       void __iomem *addr = core->io_addr + offset; 
     3771+ 
     3772+       switch (reg_width) { 
     3773+       case sizeof(u8): { 
     3774+               u8 *buf = buffer; 
     3775+ 
     3776+               while (count) { 
     3777+                       *buf = __raw_readb(addr); 
     3778+                       buf++; 
     3779+                       count--; 
     3780+               } 
     3781+               break; 
     3782+       } 
     3783+       case sizeof(u16): { 
     3784+               __le16 *buf = buffer; 
     3785+ 
     3786+               WARN_ON(count & 1); 
     3787+               while (count) { 
     3788+                       *buf = (__force __le16)__raw_readw(addr); 
     3789+                       buf++; 
     3790+                       count -= 2; 
     3791+               } 
     3792+               break; 
     3793+       } 
     3794+       case sizeof(u32): { 
     3795+               __le32 *buf = buffer; 
     3796+ 
     3797+               WARN_ON(count & 3); 
     3798+               while (count) { 
     3799+                       *buf = (__force __le32)__raw_readl(addr); 
     3800+                       buf++; 
     3801+                       count -= 4; 
     3802+               } 
     3803+               break; 
     3804+       } 
     3805+       default: 
     3806+               WARN_ON(1); 
     3807+       } 
     3808+} 
     3809+ 
     3810+static void bcma_host_soc_block_write(struct bcma_device *core, 
     3811+                                     const void *buffer, 
     3812+                                     size_t count, u16 offset, u8 reg_width) 
     3813+{ 
     3814+       void __iomem *addr = core->io_addr + offset; 
     3815+ 
     3816+       switch (reg_width) { 
     3817+       case sizeof(u8): { 
     3818+               const u8 *buf = buffer; 
     3819+ 
     3820+               while (count) { 
     3821+                       __raw_writeb(*buf, addr); 
     3822+                       buf++; 
     3823+                       count--; 
     3824+               } 
     3825+               break; 
     3826+       } 
     3827+       case sizeof(u16): { 
     3828+               const __le16 *buf = buffer; 
     3829+ 
     3830+               WARN_ON(count & 1); 
     3831+               while (count) { 
     3832+                       __raw_writew((__force u16)(*buf), addr); 
     3833+                       buf++; 
     3834+                       count -= 2; 
     3835+               } 
     3836+               break; 
     3837+       } 
     3838+       case sizeof(u32): { 
     3839+               const __le32 *buf = buffer; 
     3840+ 
     3841+               WARN_ON(count & 3); 
     3842+               while (count) { 
     3843+                       __raw_writel((__force u32)(*buf), addr); 
     3844+                       buf++; 
     3845+                       count -= 4; 
     3846+               } 
     3847+               break; 
     3848+       } 
     3849+       default: 
     3850+               WARN_ON(1); 
     3851+       } 
     3852+} 
     3853+#endif /* CONFIG_BCMA_BLOCKIO */ 
     3854+ 
     3855+static u32 bcma_host_soc_aread32(struct bcma_device *core, u16 offset) 
     3856+{ 
     3857+       return readl(core->io_wrap + offset); 
     3858+} 
     3859+ 
     3860+static void bcma_host_soc_awrite32(struct bcma_device *core, u16 offset, 
     3861+                                 u32 value) 
     3862+{ 
     3863+       writel(value, core->io_wrap + offset); 
     3864+} 
     3865+ 
     3866+const struct bcma_host_ops bcma_host_soc_ops = { 
     3867+       .read8          = bcma_host_soc_read8, 
     3868+       .read16         = bcma_host_soc_read16, 
     3869+       .read32         = bcma_host_soc_read32, 
     3870+       .write8         = bcma_host_soc_write8, 
     3871+       .write16        = bcma_host_soc_write16, 
     3872+       .write32        = bcma_host_soc_write32, 
     3873+#ifdef CONFIG_BCMA_BLOCKIO 
     3874+       .block_read     = bcma_host_soc_block_read, 
     3875+       .block_write    = bcma_host_soc_block_write, 
     3876+#endif 
     3877+       .aread32        = bcma_host_soc_aread32, 
     3878+       .awrite32       = bcma_host_soc_awrite32, 
     3879+}; 
     3880+ 
     3881+int __init bcma_host_soc_register(struct bcma_soc *soc) 
     3882+{ 
     3883+       struct bcma_bus *bus = &soc->bus; 
     3884+       int err; 
     3885+ 
     3886+       /* iomap only first core. We have to read some register on this core 
     3887+        * to scan the bus. 
     3888+        */ 
     3889+       bus->mmio = ioremap_nocache(BCMA_ADDR_BASE, BCMA_CORE_SIZE * 1); 
     3890+       if (!bus->mmio) 
     3891+               return -ENOMEM; 
     3892+ 
     3893+       /* Host specific */ 
     3894+       bus->hosttype = BCMA_HOSTTYPE_SOC; 
     3895+       bus->ops = &bcma_host_soc_ops; 
     3896+ 
     3897+       /* Register */ 
     3898+       err = bcma_bus_early_register(bus, &soc->core_cc, &soc->core_mips); 
     3899+       if (err) 
     3900+               iounmap(bus->mmio); 
     3901+ 
     3902+       return err; 
     3903+} 
     3904--- /dev/null 
     3905+++ b/include/linux/bcma/bcma_driver_mips.h 
     3906@@ -0,0 +1,51 @@ 
     3907+#ifndef LINUX_BCMA_DRIVER_MIPS_H_ 
     3908+#define LINUX_BCMA_DRIVER_MIPS_H_ 
     3909+ 
     3910+#define BCMA_MIPS_IPSFLAG              0x0F08 
     3911+/* which sbflags get routed to mips interrupt 1 */ 
     3912+#define  BCMA_MIPS_IPSFLAG_IRQ1                0x0000003F 
     3913+#define  BCMA_MIPS_IPSFLAG_IRQ1_SHIFT  0 
     3914+/* which sbflags get routed to mips interrupt 2 */ 
     3915+#define  BCMA_MIPS_IPSFLAG_IRQ2                0x00003F00 
     3916+#define  BCMA_MIPS_IPSFLAG_IRQ2_SHIFT  8 
     3917+/* which sbflags get routed to mips interrupt 3 */ 
     3918+#define  BCMA_MIPS_IPSFLAG_IRQ3                0x003F0000 
     3919+#define  BCMA_MIPS_IPSFLAG_IRQ3_SHIFT  16 
     3920+/* which sbflags get routed to mips interrupt 4 */ 
     3921+#define  BCMA_MIPS_IPSFLAG_IRQ4                0x3F000000 
     3922+#define  BCMA_MIPS_IPSFLAG_IRQ4_SHIFT  24 
     3923+ 
     3924+/* MIPS 74K core registers */ 
     3925+#define BCMA_MIPS_MIPS74K_CORECTL      0x0000 
     3926+#define BCMA_MIPS_MIPS74K_EXCEPTBASE   0x0004 
     3927+#define BCMA_MIPS_MIPS74K_BIST         0x000C 
     3928+#define BCMA_MIPS_MIPS74K_INTMASK_INT0 0x0014 
     3929+#define BCMA_MIPS_MIPS74K_INTMASK(int) \ 
     3930+       ((int) * 4 + BCMA_MIPS_MIPS74K_INTMASK_INT0) 
     3931+#define BCMA_MIPS_MIPS74K_NMIMASK      0x002C 
     3932+#define BCMA_MIPS_MIPS74K_GPIOSEL      0x0040 
     3933+#define BCMA_MIPS_MIPS74K_GPIOOUT      0x0044 
     3934+#define BCMA_MIPS_MIPS74K_GPIOEN       0x0048 
     3935+#define BCMA_MIPS_MIPS74K_CLKCTLST     0x01E0 
     3936+ 
     3937+#define BCMA_MIPS_OOBSELOUTA30         0x100 
     3938+ 
     3939+struct bcma_device; 
     3940+ 
     3941+struct bcma_drv_mips { 
     3942+       struct bcma_device *core; 
     3943+       u8 setup_done:1; 
     3944+       unsigned int assigned_irqs; 
     3945+}; 
     3946+ 
     3947+#ifdef CONFIG_BCMA_DRIVER_MIPS 
     3948+extern void bcma_core_mips_init(struct bcma_drv_mips *mcore); 
     3949+#else 
     3950+static inline void bcma_core_mips_init(struct bcma_drv_mips *mcore) { } 
     3951+#endif 
     3952+ 
     3953+extern u32 bcma_cpu_clock(struct bcma_drv_mips *mcore); 
     3954+ 
     3955+extern unsigned int bcma_core_mips_irq(struct bcma_device *dev); 
     3956+ 
     3957+#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */ 
     3958--- /dev/null 
     3959+++ b/include/linux/bcma/bcma_soc.h 
     3960@@ -0,0 +1,16 @@ 
     3961+#ifndef LINUX_BCMA_SOC_H_ 
     3962+#define LINUX_BCMA_SOC_H_ 
     3963+ 
     3964+#include <linux/bcma/bcma.h> 
     3965+ 
     3966+struct bcma_soc { 
     3967+       struct bcma_bus bus; 
     3968+       struct bcma_device core_cc; 
     3969+       struct bcma_device core_mips; 
     3970+}; 
     3971+ 
     3972+int __init bcma_host_soc_register(struct bcma_soc *soc); 
     3973+ 
     3974+int bcma_bus_register(struct bcma_bus *bus); 
     3975+ 
     3976+#endif /* LINUX_BCMA_SOC_H_ */ 
  • trunk/target/linux/generic/patches-2.6.31/941-ssb_update.patch

    r27731 r29574  
    3434--- a/drivers/ssb/b43_pci_bridge.c 
    3535+++ b/drivers/ssb/b43_pci_bridge.c 
    36 @@ -24,6 +24,7 @@ static const struct pci_device_id b43_pc 
     36@@ -5,12 +5,13 @@ 
     37  * because of its small size we include it in the SSB core 
     38  * instead of creating a standalone module. 
     39  * 
     40- * Copyright 2007  Michael Buesch <mb@bu3sch.de> 
     41+ * Copyright 2007  Michael Buesch <m@bues.ch> 
     42  * 
     43  * Licensed under the GNU/GPL. See COPYING for details. 
     44  */ 
     45  
     46 #include <linux/pci.h> 
     47+#include <linux/module.h> 
     48 #include <linux/ssb/ssb.h> 
     49  
     50 #include "ssb_private.h" 
     51@@ -24,6 +25,7 @@ static const struct pci_device_id b43_pc 
    3752        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) }, 
    3853        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4315) }, 
     
    4459--- a/drivers/ssb/driver_chipcommon.c 
    4560++