Changeset 37261


Ignore:
Timestamp:
2013-07-12T00:20:26+02:00 (5 years ago)
Author:
hauke
Message:

kernel: update bcma and ssb to wireless-testing/master master-2013-07-03

This updates 025-bcma_backport.patch and 020-ssb_update.patch to a
version of ssb and bcma used in recent wireless-testing. I removed all
patches adding serial and nand flash support before doing so to not
conflict with the existing flash support in the brcm47xx target. This
update was done to easily update the wireless drivers afterwards.

Signed-off-by: Hauke Mehrtens <hauke@…>

Location:
branches/attitude_adjustment
Files:
1 added
8 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/020-bcma-move-parallel-flash-into-a-union.patch

    r32670 r37261  
    1313--- a/drivers/bcma/driver_mips.c 
    1414+++ b/drivers/bcma/driver_mips.c 
    15 @@ -189,6 +189,7 @@ static void bcma_core_mips_flash_detect( 
     15@@ -218,6 +218,7 @@ static void bcma_core_mips_flash_detect( 
    1616                break; 
    1717        case BCMA_CC_FLASHT_PARA: 
     
    2323--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    2424+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    25 @@ -122,10 +122,68 @@ 
    26  #define  BCMA_CC_JCTL_EXT_EN           2               /* Enable external targets */ 
    27  #define  BCMA_CC_JCTL_EN               1               /* Enable Jtag master */ 
    28  #define BCMA_CC_FLASHCTL               0x0040 
    29 + 
    30 +/* Start/busy bit in flashcontrol */ 
    31 +#define  BCMA_CC_FLASHCTL_OPCODE       0x000000ff 
    32 +#define  BCMA_CC_FLASHCTL_ACTION       0x00000700 
    33 +#define  BCMA_CC_FLASHCTL_CS_ACTIVE    0x00001000      /* Chip Select Active, rev >= 20 */ 
    34  #define  BCMA_CC_FLASHCTL_START                0x80000000 
    35  #define  BCMA_CC_FLASHCTL_BUSY         BCMA_CC_FLASHCTL_START 
    36 + 
    37 +/* flashcontrol action+opcodes for ST flashes */ 
    38 +#define  BCMA_CC_FLASHCTL_ST_WREN      0x0006          /* Write Enable */ 
    39 +#define  BCMA_CC_FLASHCTL_ST_WRDIS     0x0004          /* Write Disable */ 
    40 +#define  BCMA_CC_FLASHCTL_ST_RDSR      0x0105          /* Read Status Register */ 
    41 +#define  BCMA_CC_FLASHCTL_ST_WRSR      0x0101          /* Write Status Register */ 
    42 +#define  BCMA_CC_FLASHCTL_ST_READ      0x0303          /* Read Data Bytes */ 
    43 +#define  BCMA_CC_FLASHCTL_ST_PP                0x0302          /* Page Program */ 
    44 +#define  BCMA_CC_FLASHCTL_ST_SE                0x02d8          /* Sector Erase */ 
    45 +#define  BCMA_CC_FLASHCTL_ST_BE                0x00c7          /* Bulk Erase */ 
    46 +#define  BCMA_CC_FLASHCTL_ST_DP                0x00b9          /* Deep Power-down */ 
    47 +#define  BCMA_CC_FLASHCTL_ST_RES       0x03ab          /* Read Electronic Signature */ 
    48 +#define  BCMA_CC_FLASHCTL_ST_CSA       0x1000          /* Keep chip select asserted */ 
    49 +#define  BCMA_CC_FLASHCTL_ST_SSE       0x0220          /* Sub-sector Erase */ 
    50 + 
    51 + 
    52 +/* flashcontrol action+opcodes for Atmel flashes */ 
    53 +#define  BCMA_CC_FLASHCTL_AT_READ                      0x07e8 
    54 +#define  BCMA_CC_FLASHCTL_AT_PAGE_READ                 0x07d2 
    55 +#define  BCMA_CC_FLASHCTL_AT_BUF1_READ 
    56 +#define  BCMA_CC_FLASHCTL_AT_BUF2_READ 
    57 +#define  BCMA_CC_FLASHCTL_AT_STATUS                    0x01d7 
    58 +#define  BCMA_CC_FLASHCTL_AT_BUF1_WRITE                        0x0384 
    59 +#define  BCMA_CC_FLASHCTL_AT_BUF2_WRITE                        0x0387 
    60 +#define  BCMA_CC_FLASHCTL_AT_BUF1_ERASE_PROGRAM                0x0283 
    61 +#define  BCMA_CC_FLASHCTL_AT_BUF2_ERASE_PROGRAM                0x0286 
    62 +#define  BCMA_CC_FLASHCTL_AT_BUF1_PROGRAM              0x0288 
    63 +#define  BCMA_CC_FLASHCTL_AT_BUF2_PROGRAM              0x0289 
    64 +#define  BCMA_CC_FLASHCTL_AT_PAGE_ERASE                        0x0281 
    65 +#define  BCMA_CC_FLASHCTL_AT_BLOCK_ERASE               0x0250 
    66 +#define  BCMA_CC_FLASHCTL_AT_BUF1_WRITE_ERASE_PROGRAM  0x0382 
    67 +#define  BCMA_CC_FLASHCTL_AT_BUF2_WRITE_ERASE_PROGRAM  0x0385 
    68 +#define  BCMA_CC_FLASHCTL_AT_BUF1_LOAD                 0x0253 
    69 +#define  BCMA_CC_FLASHCTL_AT_BUF2_LOAD                 0x0255 
    70 +#define  BCMA_CC_FLASHCTL_AT_BUF1_COMPARE              0x0260 
    71 +#define  BCMA_CC_FLASHCTL_AT_BUF2_COMPARE              0x0261 
    72 +#define  BCMA_CC_FLASHCTL_AT_BUF1_REPROGRAM            0x0258 
    73 +#define  BCMA_CC_FLASHCTL_AT_BUF2_REPROGRAM            0x0259 
    74 + 
    75  #define BCMA_CC_FLASHADDR              0x0044 
    76  #define BCMA_CC_FLASHDATA              0x0048 
    77 + 
    78 +/* Status register bits for ST flashes */ 
    79 +#define  BCMA_CC_FLASHDATA_ST_WIP      0x01            /* Write In Progress */ 
    80 +#define  BCMA_CC_FLASHDATA_ST_WEL      0x02            /* Write Enable Latch */ 
    81 +#define  BCMA_CC_FLASHDATA_ST_BP_MASK  0x1c            /* Block Protect */ 
    82 +#define  BCMA_CC_FLASHDATA_ST_BP_SHIFT 2 
    83 +#define  BCMA_CC_FLASHDATA_ST_SRWD     0x80            /* Status Register Write Disable */ 
    84 + 
    85 +/* Status register bits for Atmel flashes */ 
    86 +#define  BCMA_CC_FLASHDATA_AT_READY    0x80 
    87 +#define  BCMA_CC_FLASHDATA_AT_MISMATCH 0x40 
    88 +#define  BCMA_CC_FLASHDATA_AT_ID_MASK  0x38 
    89 +#define  BCMA_CC_FLASHDATA_AT_ID_SHIFT 3 
    90 + 
    91  #define BCMA_CC_BCAST_ADDR             0x0050 
    92  #define BCMA_CC_BCAST_DATA             0x0054 
    93  #define BCMA_CC_GPIOPULLUP             0x0058          /* Rev >= 20 only */ 
    94 @@ -360,6 +418,12 @@ 
    95  /* 4313 Chip specific ChipControl register bits */ 
    96  #define BCMA_CCTRL_4313_12MA_LED_DRIVE         0x00000007      /* 12 mA drive strengh for later 4313 */ 
     25@@ -562,6 +562,12 @@ 
     26 #define BCMA_RES_4314_HT_AVAIL                 BIT(28) 
     27 #define BCMA_RES_4314_MACPHY_CLK_AVAIL         BIT(29) 
    9728  
    9829+#define        BCMA_FLASH2                     0x1c000000      /* Flash Region 2 (region 1 shadowed here) */ 
     
    10536  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU) 
    10637  */ 
    107 @@ -369,6 +433,10 @@ struct bcma_chipcommon_pmu { 
     38@@ -571,6 +577,10 @@ struct bcma_chipcommon_pmu { 
    10839 }; 
    10940  
     
    11647        u8 buswidth; 
    11748        u32 window; 
    118 @@ -394,7 +462,10 @@ struct bcma_drv_cc { 
     49@@ -597,7 +607,10 @@ struct bcma_drv_cc { 
    11950        u16 fast_pwrup_delay; 
    12051        struct bcma_chipcommon_pmu pmu; 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/021-bcma-add-serial-flash-support-to-bcma.patch

    r32670 r37261  
    11--- a/drivers/bcma/Kconfig 
    22+++ b/drivers/bcma/Kconfig 
    3 @@ -38,6 +38,11 @@ config BCMA_HOST_SOC 
     3@@ -39,6 +39,11 @@ config BCMA_HOST_SOC 
    44        bool 
    55        depends on BCMA_DRIVER_MIPS 
     
    2424--- a/drivers/bcma/bcma_private.h 
    2525+++ b/drivers/bcma/bcma_private.h 
    26 @@ -51,6 +51,11 @@ void bcma_chipco_serial_init(struct bcma 
    27  u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
    28  u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
     26@@ -55,6 +55,11 @@ void bcma_chipco_serial_init(struct bcma 
     27 u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc); 
     28 u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc); 
    2929  
    3030+#ifdef CONFIG_BCMA_SFLASH 
     
    439439--- a/drivers/bcma/driver_mips.c 
    440440+++ b/drivers/bcma/driver_mips.c 
    441 @@ -185,7 +185,13 @@ static void bcma_core_mips_flash_detect( 
     441@@ -214,7 +214,13 @@ static void bcma_core_mips_flash_detect( 
    442442        switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
    443443        case BCMA_CC_FLASHT_STSER: 
     
    456456--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    457457+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    458 @@ -435,6 +435,7 @@ struct bcma_chipcommon_pmu { 
     458@@ -579,6 +579,7 @@ struct bcma_chipcommon_pmu { 
    459459 #ifdef CONFIG_BCMA_DRIVER_MIPS 
    460460 enum bcma_flash_type { 
     
    464464  
    465465 struct bcma_pflash { 
    466 @@ -443,6 +444,14 @@ struct bcma_pflash { 
     466@@ -587,6 +588,14 @@ struct bcma_pflash { 
    467467        u32 window_size; 
    468468 }; 
     
    479479        void *regs; 
    480480        unsigned long clockspeed; 
    481 @@ -465,6 +474,9 @@ struct bcma_drv_cc { 
     481@@ -610,6 +619,9 @@ struct bcma_drv_cc { 
    482482        enum bcma_flash_type flash_type; 
    483483        union { 
     
    489489  
    490490        int nr_serial_ports; 
    491 @@ -520,4 +532,14 @@ extern void bcma_chipco_regctl_maskset(s 
    492                                        u32 offset, u32 mask, u32 set); 
    493  extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid); 
     491@@ -680,4 +692,14 @@ extern void bcma_pmu_spuravoid_pllupdate 
     492  
     493 extern u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc); 
    494494  
    495495+#ifdef CONFIG_BCMA_SFLASH 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/022-ssb-move-flash-to-chipcommon.patch

    r33000 r37261  
    6464  
    6565-       mcore->flash_buswidth = 2; 
    66 -       if (bus->chipco.dev) { 
     66-       if (ssb_chipco_available(&bus->chipco)) { 
    6767-               mcore->flash_window = 0x1c000000; 
    6868-               mcore->flash_window_size = 0x02000000; 
    6969+       /* When there is no chipcommon on the bus there is 4MB flash */ 
    70 +       if (!bus->chipco.dev) { 
     70+       if (!ssb_chipco_available(&bus->chipco)) { 
    7171+               pr_info("found parallel flash.\n"); 
    7272+               bus->chipco.flash_type = SSB_PFLASH; 
     
    105105--- a/include/linux/ssb/ssb_driver_chipcommon.h 
    106106+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
    107 @@ -582,6 +582,18 @@ struct ssb_chipcommon_pmu { 
     107@@ -583,6 +583,18 @@ struct ssb_chipcommon_pmu { 
    108108        u32 crystalfreq;        /* The active crystal frequency (in kHz) */ 
    109109 }; 
     
    124124        struct ssb_device *dev; 
    125125        u32 capabilities; 
    126 @@ -589,6 +601,12 @@ struct ssb_chipcommon { 
    127         /* Fast Powerup Delay constant */ 
    128         u16 fast_pwrup_delay; 
     126@@ -593,6 +605,12 @@ struct ssb_chipcommon { 
    129127        struct ssb_chipcommon_pmu pmu; 
     128        u32 ticks_per_ms; 
     129        u32 max_timer_ms; 
    130130+#ifdef CONFIG_SSB_DRIVER_MIPS 
    131131+       enum ssb_flash_type flash_type; 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/023-ssb-add-serial-flash-support.patch

    r31126 r37261  
    496496--- a/drivers/ssb/ssb_private.h 
    497497+++ b/drivers/ssb/ssb_private.h 
    498 @@ -192,6 +192,10 @@ extern int ssb_devices_freeze(struct ssb 
     498@@ -204,6 +204,10 @@ extern int ssb_devices_freeze(struct ssb 
    499499 extern int ssb_devices_thaw(struct ssb_freeze_context *ctx); 
    500500  
     
    509509--- a/include/linux/ssb/ssb_driver_chipcommon.h 
    510510+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
    511 @@ -503,8 +503,10 @@ 
     511@@ -504,8 +504,10 @@ 
    512512 #define SSB_CHIPCO_FLASHCTL_ST_PP      0x0302          /* Page Program */ 
    513513 #define SSB_CHIPCO_FLASHCTL_ST_SE      0x02D8          /* Sector Erase */ 
     
    522522 /* Status register bits for ST flashes */ 
    523523 #define SSB_CHIPCO_FLASHSTA_ST_WIP     0x01            /* Write In Progress */ 
    524 @@ -585,6 +587,7 @@ struct ssb_chipcommon_pmu { 
     524@@ -586,6 +588,7 @@ struct ssb_chipcommon_pmu { 
    525525 #ifdef CONFIG_SSB_DRIVER_MIPS 
    526526 enum ssb_flash_type { 
     
    530530  
    531531 struct ssb_pflash { 
    532 @@ -592,6 +595,14 @@ struct ssb_pflash { 
     532@@ -593,6 +596,14 @@ struct ssb_pflash { 
    533533        u32 window; 
    534534        u32 window_size; 
     
    545545  
    546546 struct ssb_chipcommon { 
    547 @@ -605,6 +616,9 @@ struct ssb_chipcommon { 
     547@@ -609,6 +620,9 @@ struct ssb_chipcommon { 
    548548        enum ssb_flash_type flash_type; 
    549549        union { 
     
    555555 #endif /* CONFIG_SSB_DRIVER_MIPS */ 
    556556 }; 
    557 @@ -666,6 +680,16 @@ extern int ssb_chipco_serial_init(struct 
     557@@ -671,6 +685,16 @@ extern int ssb_chipco_serial_init(struct 
    558558                                  struct ssb_serial_port *ports); 
    559559 #endif /* CONFIG_SSB_SERIAL */ 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/030-bcm47xx-bcma-nandflash.patch

    r33209 r37261  
    205205--- a/drivers/bcma/Kconfig 
    206206+++ b/drivers/bcma/Kconfig 
    207 @@ -43,6 +43,11 @@ config BCMA_SFLASH 
     207@@ -44,6 +44,11 @@ config BCMA_SFLASH 
    208208        depends on BCMA_DRIVER_MIPS 
    209209        default y 
     
    229229--- a/drivers/bcma/bcma_private.h 
    230230+++ b/drivers/bcma/bcma_private.h 
    231 @@ -56,6 +56,11 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
     231@@ -60,6 +60,11 @@ u32 bcma_pmu_get_cpu_clock(struct bcma_d 
    232232 int bcma_sflash_init(struct bcma_drv_cc *cc); 
    233233 #endif /* CONFIG_BCMA_SFLASH */ 
     
    408408  * Licensed under the GNU/GPL. See COPYING for details. 
    409409  */ 
    410 @@ -182,6 +183,17 @@ static void bcma_core_mips_flash_detect( 
     410@@ -211,6 +212,17 @@ static void bcma_core_mips_flash_detect( 
    411411 { 
    412412        struct bcma_bus *bus = mcore->core->bus; 
     
    961961--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    962962+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    963 @@ -436,6 +436,7 @@ struct bcma_chipcommon_pmu { 
     963@@ -580,6 +580,7 @@ struct bcma_chipcommon_pmu { 
    964964 enum bcma_flash_type { 
    965965        BCMA_PFLASH, 
     
    969969  
    970970 struct bcma_pflash { 
    971 @@ -452,6 +453,14 @@ struct bcma_sflash { 
     971@@ -596,6 +597,14 @@ struct bcma_sflash { 
    972972 }; 
    973973 #endif /* CONFIG_BCMA_SFLASH */ 
     
    984984        void *regs; 
    985985        unsigned long clockspeed; 
    986 @@ -477,6 +486,9 @@ struct bcma_drv_cc { 
     986@@ -622,6 +631,9 @@ struct bcma_drv_cc { 
    987987 #ifdef CONFIG_BCMA_SFLASH 
    988988                struct bcma_sflash sflash; 
     
    994994  
    995995        int nr_serial_ports; 
    996 @@ -542,4 +554,13 @@ int bcma_sflash_write(struct bcma_drv_cc 
     996@@ -702,4 +714,13 @@ int bcma_sflash_write(struct bcma_drv_cc 
    997997 int bcma_sflash_erase(struct bcma_drv_cc *cc, u32 offset); 
    998998 #endif /* CONFIG_BCMA_SFLASH */ 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/280-activate_ssb_support_in_usb.patch

    r29575 r37261  
    66--- a/drivers/bcma/Kconfig 
    77+++ b/drivers/bcma/Kconfig 
    8 @@ -37,6 +37,7 @@ config BCMA_DRIVER_PCI_HOSTMODE 
     8@@ -38,6 +38,7 @@ config BCMA_DRIVER_PCI_HOSTMODE 
    99 config BCMA_HOST_SOC 
    1010        bool 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/500-ssb-add-function-to-return-number-of-gpio-lines.patch

    r32992 r37261  
    11--- a/drivers/ssb/embedded.c 
    22+++ b/drivers/ssb/embedded.c 
    3 @@ -136,6 +136,18 @@ u32 ssb_gpio_polarity(struct ssb_bus *bu 
     3@@ -170,6 +170,18 @@ u32 ssb_gpio_polarity(struct ssb_bus *bu 
    44 } 
    55 EXPORT_SYMBOL(ssb_gpio_polarity); 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/501-bcma-add-gpio-driver.patch

    r33600 r37261  
    1 --- a/drivers/bcma/driver_chipcommon.c 
    2 +++ b/drivers/bcma/driver_chipcommon.c 
    3 @@ -70,6 +70,8 @@ void bcma_core_chipcommon_init(struct bc 
    4                          (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); 
    5         } 
    6   
    7 +       spin_lock_init(&cc->gpio_lock); 
    8 + 
    9         cc->setup_done = true; 
    10  } 
    11   
    12 @@ -92,34 +94,81 @@ u32 bcma_chipco_irq_status(struct bcma_d 
    13   
    14  u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask) 
    15  { 
    16 -       return bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask; 
    17 +       unsigned long flags; 
    18 +       u32 res; 
    19 + 
    20 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    21 +       res = bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask; 
    22 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    23 + 
    24 +       return res; 
    25  } 
    26 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_in); 
    27   
    28  u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value) 
    29  { 
    30 -       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
    31 +       unsigned long flags; 
    32 +       u32 res; 
    33 + 
    34 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    35 +       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
    36 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    37 + 
    38 +       return res; 
    39  } 
    40 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out); 
    41   
    42  u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value) 
    43  { 
    44 -       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
    45 +       unsigned long flags; 
    46 +       u32 res; 
    47 + 
    48 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    49 +       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
    50 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    51 + 
    52 +       return res; 
    53  } 
    54 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen); 
    55   
    56  u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value) 
    57  { 
    58 -       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
    59 +       unsigned long flags; 
    60 +       u32 res; 
    61 + 
    62 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    63 +       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
    64 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    65 + 
    66 +       return res; 
    67  } 
    68  EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control); 
    69   
    70  u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value) 
    71  { 
    72 -       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
    73 +       unsigned long flags; 
    74 +       u32 res; 
    75 + 
    76 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    77 +       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
    78 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    79 + 
    80 +       return res; 
    81  } 
    82 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_intmask); 
    83   
    84  u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value) 
    85  { 
    86 -       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
    87 +       unsigned long flags; 
    88 +       u32 res; 
    89 + 
    90 +       spin_lock_irqsave(&cc->gpio_lock, flags); 
    91 +       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
    92 +       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    93 + 
    94 +       return res; 
    95  } 
    96 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity); 
    97   
    98  #ifdef CONFIG_BCMA_DRIVER_MIPS 
    99  void bcma_chipco_serial_init(struct bcma_drv_cc *cc) 
    1001--- a/include/linux/bcma/bcma_driver_chipcommon.h 
    1012+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
    102 @@ -495,6 +495,9 @@ struct bcma_drv_cc { 
    103         int nr_serial_ports; 
    104         struct bcma_serial_port serial_ports[4]; 
    105  #endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    106 + 
    107 +       /* Lock for GPIO register access. */ 
    108 +       spinlock_t gpio_lock; 
    109  }; 
    110   
    111  /* Register access */ 
    112 @@ -525,13 +528,22 @@ void bcma_chipco_irq_mask(struct bcma_dr 
     3@@ -678,6 +678,8 @@ void bcma_chipco_irq_mask(struct bcma_dr 
    1134  
    1145 u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask); 
     
    1178+ 
    1189 /* Chipcommon GPIO pin access. */ 
    119 -u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask); 
    120 -u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    121 -u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    122 -u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    123 -u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    124 -u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    125 +extern u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask); 
    126 +extern u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    127 +extern u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    128 +extern u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, 
    129 +                                   u32 value); 
    130 +extern u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, 
    131 +                                   u32 value); 
    132 +extern u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, 
    133 +                                    u32 value); 
     10 u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask); 
     11 u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     12@@ -687,6 +689,10 @@ u32 bcma_chipco_gpio_intmask(struct bcma 
     13 u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     14 u32 bcma_chipco_gpio_pullup(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     15 u32 bcma_chipco_gpio_pulldown(struct bcma_drv_cc *cc, u32 mask, u32 value); 
    13416+static inline int bcma_chipco_gpio_count(void) 
    13517+{ 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/700-ssb-gigabit-ethernet-driver.patch

    r33004 r37261  
    401401 #define PCI_DEVICE_ID_TIGON3_5715      0x1678 
    402402 #define PCI_DEVICE_ID_TIGON3_5715S     0x1679 
    403 --- a/include/linux/ssb/ssb_driver_gige.h 
    404 +++ b/include/linux/ssb/ssb_driver_gige.h 
    405 @@ -97,21 +97,12 @@ static inline bool ssb_gige_must_flush_p 
    406         return 0; 
    407  } 
    408   
    409 -#ifdef CONFIG_BCM47XX 
    410 -#include <asm/mach-bcm47xx/nvram.h> 
    411 -/* Get the device MAC address */ 
    412 -static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
    413 -{ 
    414 -       char buf[20]; 
    415 -       if (nvram_getenv("et0macaddr", buf, sizeof(buf)) < 0) 
    416 -               return; 
    417 -       nvram_parse_macaddr(buf, macaddr); 
    418 -} 
    419 -#else 
    420  static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
    421  { 
    422 +       struct ssb_gige *dev = pdev_to_ssb_gige(pdev); 
    423 + 
    424 +       memcpy(macaddr, dev->dev->bus->sprom.et0mac, 6); 
    425  } 
    426 -#endif 
    427   
    428  extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, 
    429                                           struct pci_dev *pdev); 
    430 @@ -175,6 +166,9 @@ static inline bool ssb_gige_must_flush_p 
    431  { 
    432         return 0; 
    433  } 
    434 +static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
    435 +{ 
    436 +} 
    437   
    438  #endif /* CONFIG_SSB_DRIVER_GIGE */ 
    439  #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ 
  • branches/attitude_adjustment/target/linux/brcm47xx/patches-3.3/976-ssb_increase_pci_delay.patch

    r30481 r37261  
    11--- a/drivers/ssb/driver_pcicore.c 
    22+++ b/drivers/ssb/driver_pcicore.c 
    3 @@ -376,7 +376,7 @@ static void __devinit ssb_pcicore_init_h 
     3@@ -375,7 +375,7 @@ static void __devinit ssb_pcicore_init_h 
    44        set_io_port_base(ssb_pcicore_controller.io_map_base); 
    55        /* Give some time to the PCI controller to configure itself with the new 
  • branches/attitude_adjustment/target/linux/generic/config-3.3

    r33928 r37261  
    194194# CONFIG_BCM63XX_PHY is not set 
    195195# CONFIG_BCMA is not set 
     196# CONFIG_BCMA_DRIVER_GPIO is not set 
    196197# CONFIG_BCM_WIMAX is not set 
    197198# CONFIG_BDI_SWITCH is not set 
     
    28432844# CONFIG_SQUASHFS_ZLIB is not set 
    28442845# CONFIG_SSB is not set 
     2846# CONFIG_SSB_DRIVER_GPIO is not set 
    28452847# CONFIG_SSB_DEBUG is not set 
    28462848# CONFIG_SSB_PCMCIAHOST is not set 
  • branches/attitude_adjustment/target/linux/generic/patches-3.3/020-ssb_update.patch

    r32580 r37261  
     1--- a/drivers/ssb/Kconfig 
     2+++ b/drivers/ssb/Kconfig 
     3@@ -160,4 +160,12 @@ config SSB_DRIVER_GIGE 
     4  
     5          If unsure, say N 
     6  
     7+config SSB_DRIVER_GPIO 
     8+       bool "SSB GPIO driver" 
     9+       depends on SSB && GPIOLIB 
     10+       help 
     11+         Driver to provide access to the GPIO pins on the bus. 
     12+ 
     13+         If unsure, say N 
     14+ 
     15 endmenu 
     16--- a/drivers/ssb/Makefile 
     17+++ b/drivers/ssb/Makefile 
     18@@ -15,6 +15,7 @@ ssb-$(CONFIG_SSB_DRIVER_MIPS)         += driver 
     19 ssb-$(CONFIG_SSB_DRIVER_EXTIF)         += driver_extif.o 
     20 ssb-$(CONFIG_SSB_DRIVER_PCICORE)       += driver_pcicore.o 
     21 ssb-$(CONFIG_SSB_DRIVER_GIGE)          += driver_gige.o 
     22+ssb-$(CONFIG_SSB_DRIVER_GPIO)          += driver_gpio.o 
     23  
     24 # b43 pci-ssb-bridge driver 
     25 # Not strictly a part of SSB, but kept here for convenience 
    126--- a/drivers/ssb/b43_pci_bridge.c 
    227+++ b/drivers/ssb/b43_pci_bridge.c 
    3 @@ -29,11 +29,14 @@ static const struct pci_device_id b43_pc 
     28@@ -29,11 +29,15 @@ static const struct pci_device_id b43_pc 
    429        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) }, 
    530        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) }, 
     
    1338        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432b) }, 
    1439+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x432c) }, 
     40+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4350) }, 
    1541        { 0, }, 
    1642 }; 
    1743 MODULE_DEVICE_TABLE(pci, b43_pci_bridge_tbl); 
     44--- a/drivers/ssb/driver_chipcommon.c 
     45+++ b/drivers/ssb/driver_chipcommon.c 
     46@@ -4,6 +4,7 @@ 
     47  * 
     48  * Copyright 2005, Broadcom Corporation 
     49  * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     50+ * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
     51  * 
     52  * Licensed under the GNU/GPL. See COPYING for details. 
     53  */ 
     54@@ -12,6 +13,7 @@ 
     55 #include <linux/ssb/ssb_regs.h> 
     56 #include <linux/export.h> 
     57 #include <linux/pci.h> 
     58+#include <linux/bcm47xx_wdt.h> 
     59  
     60 #include "ssb_private.h" 
     61  
     62@@ -280,13 +282,79 @@ static void calc_fast_powerup_delay(stru 
     63        cc->fast_pwrup_delay = tmp; 
     64 } 
     65  
     66+static u32 ssb_chipco_alp_clock(struct ssb_chipcommon *cc) 
     67+{ 
     68+       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) 
     69+               return ssb_pmu_get_alp_clock(cc); 
     70+ 
     71+       return 20000000; 
     72+} 
     73+ 
     74+static u32 ssb_chipco_watchdog_get_max_timer(struct ssb_chipcommon *cc) 
     75+{ 
     76+       u32 nb; 
     77+ 
     78+       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) { 
     79+               if (cc->dev->id.revision < 26) 
     80+                       nb = 16; 
     81+               else 
     82+                       nb = (cc->dev->id.revision >= 37) ? 32 : 24; 
     83+       } else { 
     84+               nb = 28; 
     85+       } 
     86+       if (nb == 32) 
     87+               return 0xffffffff; 
     88+       else 
     89+               return (1 << nb) - 1; 
     90+} 
     91+ 
     92+u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks) 
     93+{ 
     94+       struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt); 
     95+ 
     96+       if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB) 
     97+               return 0; 
     98+ 
     99+       return ssb_chipco_watchdog_timer_set(cc, ticks); 
     100+} 
     101+ 
     102+u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms) 
     103+{ 
     104+       struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt); 
     105+       u32 ticks; 
     106+ 
     107+       if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB) 
     108+               return 0; 
     109+ 
     110+       ticks = ssb_chipco_watchdog_timer_set(cc, cc->ticks_per_ms * ms); 
     111+       return ticks / cc->ticks_per_ms; 
     112+} 
     113+ 
     114+static int ssb_chipco_watchdog_ticks_per_ms(struct ssb_chipcommon *cc) 
     115+{ 
     116+       struct ssb_bus *bus = cc->dev->bus; 
     117+ 
     118+       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) { 
     119+                       /* based on 32KHz ILP clock */ 
     120+                       return 32; 
     121+       } else { 
     122+               if (cc->dev->id.revision < 18) 
     123+                       return ssb_clockspeed(bus) / 1000; 
     124+               else 
     125+                       return ssb_chipco_alp_clock(cc) / 1000; 
     126+       } 
     127+} 
     128+ 
     129 void ssb_chipcommon_init(struct ssb_chipcommon *cc) 
     130 { 
     131        if (!cc->dev) 
     132                return; /* We don't have a ChipCommon */ 
     133+ 
     134+       spin_lock_init(&cc->gpio_lock); 
     135+ 
     136        if (cc->dev->id.revision >= 11) 
     137                cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT); 
     138-       ssb_dprintk(KERN_INFO PFX "chipcommon status is 0x%x\n", cc->status); 
     139+       ssb_dbg("chipcommon status is 0x%x\n", cc->status); 
     140  
     141        if (cc->dev->id.revision >= 20) { 
     142                chipco_write32(cc, SSB_CHIPCO_GPIOPULLUP, 0); 
     143@@ -297,6 +365,11 @@ void ssb_chipcommon_init(struct ssb_chip 
     144        chipco_powercontrol_init(cc); 
     145        ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST); 
     146        calc_fast_powerup_delay(cc); 
     147+ 
     148+       if (cc->dev->bus->bustype == SSB_BUSTYPE_SSB) { 
     149+               cc->ticks_per_ms = ssb_chipco_watchdog_ticks_per_ms(cc); 
     150+               cc->max_timer_ms = ssb_chipco_watchdog_get_max_timer(cc) / cc->ticks_per_ms; 
     151+       } 
     152 } 
     153  
     154 void ssb_chipco_suspend(struct ssb_chipcommon *cc) 
     155@@ -395,10 +468,27 @@ void ssb_chipco_timing_init(struct ssb_c 
     156 } 
     157  
     158 /* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */ 
     159-void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks) 
     160+u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks) 
     161 { 
     162-       /* instant NMI */ 
     163-       chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks); 
     164+       u32 maxt; 
     165+       enum ssb_clkmode clkmode; 
     166+ 
     167+       maxt = ssb_chipco_watchdog_get_max_timer(cc); 
     168+       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) { 
     169+               if (ticks == 1) 
     170+                       ticks = 2; 
     171+               else if (ticks > maxt) 
     172+                       ticks = maxt; 
     173+               chipco_write32(cc, SSB_CHIPCO_PMU_WATCHDOG, ticks); 
     174+       } else { 
     175+               clkmode = ticks ? SSB_CLKMODE_FAST : SSB_CLKMODE_DYNAMIC; 
     176+               ssb_chipco_set_clockmode(cc, clkmode); 
     177+               if (ticks > maxt) 
     178+                       ticks = maxt; 
     179+               /* instant NMI */ 
     180+               chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks); 
     181+       } 
     182+       return ticks; 
     183 } 
     184  
     185 void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     186@@ -418,28 +508,93 @@ u32 ssb_chipco_gpio_in(struct ssb_chipco 
     187  
     188 u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     189 { 
     190-       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value); 
     191+       unsigned long flags; 
     192+       u32 res = 0; 
     193+ 
     194+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     195+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value); 
     196+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     197+ 
     198+       return res; 
     199 } 
     200  
     201 u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     202 { 
     203-       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value); 
     204+       unsigned long flags; 
     205+       u32 res = 0; 
     206+ 
     207+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     208+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value); 
     209+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     210+ 
     211+       return res; 
     212 } 
     213  
     214 u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     215 { 
     216-       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value); 
     217+       unsigned long flags; 
     218+       u32 res = 0; 
     219+ 
     220+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     221+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value); 
     222+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     223+ 
     224+       return res; 
     225 } 
     226 EXPORT_SYMBOL(ssb_chipco_gpio_control); 
     227  
     228 u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     229 { 
     230-       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value); 
     231+       unsigned long flags; 
     232+       u32 res = 0; 
     233+ 
     234+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     235+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value); 
     236+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     237+ 
     238+       return res; 
     239 } 
     240  
     241 u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     242 { 
     243-       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value); 
     244+       unsigned long flags; 
     245+       u32 res = 0; 
     246+ 
     247+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     248+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value); 
     249+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     250+ 
     251+       return res; 
     252+} 
     253+ 
     254+u32 ssb_chipco_gpio_pullup(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     255+{ 
     256+       unsigned long flags; 
     257+       u32 res = 0; 
     258+ 
     259+       if (cc->dev->id.revision < 20) 
     260+               return 0xffffffff; 
     261+ 
     262+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     263+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPULLUP, mask, value); 
     264+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     265+ 
     266+       return res; 
     267+} 
     268+ 
     269+u32 ssb_chipco_gpio_pulldown(struct ssb_chipcommon *cc, u32 mask, u32 value) 
     270+{ 
     271+       unsigned long flags; 
     272+       u32 res = 0; 
     273+ 
     274+       if (cc->dev->id.revision < 20) 
     275+               return 0xffffffff; 
     276+ 
     277+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     278+       res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPULLDOWN, mask, value); 
     279+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     280+ 
     281+       return res; 
     282 } 
     283  
     284 #ifdef CONFIG_SSB_SERIAL 
     285@@ -473,12 +628,7 @@ int ssb_chipco_serial_init(struct ssb_ch 
     286                                       chipco_read32(cc, SSB_CHIPCO_CORECTL) 
     287                                       | SSB_CHIPCO_CORECTL_UARTCLK0); 
     288                } else if ((ccrev >= 11) && (ccrev != 15)) { 
     289-                       /* Fixed ALP clock */ 
     290-                       baud_base = 20000000; 
     291-                       if (cc->capabilities & SSB_CHIPCO_CAP_PMU) { 
     292-                               /* FIXME: baud_base is different for devices with a PMU */ 
     293-                               SSB_WARN_ON(1); 
     294-                       } 
     295+                       baud_base = ssb_chipco_alp_clock(cc); 
     296                        div = 1; 
     297                        if (ccrev >= 21) { 
     298                                /* Turn off UART clock before switching clocksource. */ 
    18299--- a/drivers/ssb/driver_chipcommon_pmu.c 
    19300+++ b/drivers/ssb/driver_chipcommon_pmu.c 
     
    23304 #include <linux/export.h> 
    24305+#ifdef CONFIG_BCM47XX 
    25 +#include <asm/mach-bcm47xx/nvram.h> 
     306+#include <nvram.h> 
    26307+#endif 
    27308  
     
    39320                e = pmu0_plltab_find_entry(crystalfreq); 
    40321        if (!e) 
     322@@ -111,8 +110,8 @@ static void ssb_pmu0_pllinit_r0(struct s 
     323                return; 
     324        } 
     325  
     326-       ssb_printk(KERN_INFO PFX "Programming PLL to %u.%03u MHz\n", 
     327-                  (crystalfreq / 1000), (crystalfreq % 1000)); 
     328+       ssb_info("Programming PLL to %u.%03u MHz\n", 
     329+                crystalfreq / 1000, crystalfreq % 1000); 
     330  
     331        /* First turn the PLL off. */ 
     332        switch (bus->chip_id) { 
     333@@ -139,7 +138,7 @@ static void ssb_pmu0_pllinit_r0(struct s 
     334        } 
     335        tmp = chipco_read32(cc, SSB_CHIPCO_CLKCTLST); 
     336        if (tmp & SSB_CHIPCO_CLKCTLST_HAVEHT) 
     337-               ssb_printk(KERN_EMERG PFX "Failed to turn the PLL off!\n"); 
     338+               ssb_emerg("Failed to turn the PLL off!\n"); 
     339  
     340        /* Set PDIV in PLL control 0. */ 
     341        pllctl = ssb_chipco_pll_read(cc, SSB_PMU0_PLLCTL0); 
     342@@ -250,8 +249,8 @@ static void ssb_pmu1_pllinit_r0(struct s 
     343                return; 
     344        } 
     345  
     346-       ssb_printk(KERN_INFO PFX "Programming PLL to %u.%03u MHz\n", 
     347-                  (crystalfreq / 1000), (crystalfreq % 1000)); 
     348+       ssb_info("Programming PLL to %u.%03u MHz\n", 
     349+                crystalfreq / 1000, crystalfreq % 1000); 
     350  
     351        /* First turn the PLL off. */ 
     352        switch (bus->chip_id) { 
     353@@ -276,7 +275,7 @@ static void ssb_pmu1_pllinit_r0(struct s 
     354        } 
     355        tmp = chipco_read32(cc, SSB_CHIPCO_CLKCTLST); 
     356        if (tmp & SSB_CHIPCO_CLKCTLST_HAVEHT) 
     357-               ssb_printk(KERN_EMERG PFX "Failed to turn the PLL off!\n"); 
     358+               ssb_emerg("Failed to turn the PLL off!\n"); 
     359  
     360        /* Set p1div and p2div. */ 
     361        pllctl = ssb_chipco_pll_read(cc, SSB_PMU1_PLLCTL0); 
    41362@@ -321,7 +320,11 @@ static void ssb_pmu_pll_init(struct ssb_ 
    42363        u32 crystalfreq = 0; /* in kHz. 0 = keep default freq. */ 
     
    64385                break; 
    65386        case 0x4322: 
    66 @@ -607,3 +614,34 @@ void ssb_pmu_set_ldo_paref(struct ssb_ch 
     387@@ -339,10 +346,11 @@ static void ssb_pmu_pll_init(struct ssb_ 
     388                        chipco_write32(cc, SSB_CHIPCO_PLLCTL_DATA, 0x380005C0); 
     389                } 
     390                break; 
     391+       case 43222: 
     392+               break; 
     393        default: 
     394-               ssb_printk(KERN_ERR PFX 
     395-                          "ERROR: PLL init unknown for device %04X\n", 
     396-                          bus->chip_id); 
     397+               ssb_err("ERROR: PLL init unknown for device %04X\n", 
     398+                       bus->chip_id); 
     399        } 
     400 } 
     401  
     402@@ -427,6 +435,7 @@ static void ssb_pmu_resources_init(struc 
     403                 min_msk = 0xCBB; 
     404                 break; 
     405        case 0x4322: 
     406+       case 43222: 
     407                /* We keep the default settings: 
     408                 * min_msk = 0xCBB 
     409                 * max_msk = 0x7FFFF 
     410@@ -462,9 +471,8 @@ static void ssb_pmu_resources_init(struc 
     411                max_msk = 0xFFFFF; 
     412                break; 
     413        default: 
     414-               ssb_printk(KERN_ERR PFX 
     415-                          "ERROR: PMU resource config unknown for device %04X\n", 
     416-                          bus->chip_id); 
     417+               ssb_err("ERROR: PMU resource config unknown for device %04X\n", 
     418+                       bus->chip_id); 
     419        } 
     420  
     421        if (updown_tab) { 
     422@@ -516,8 +524,8 @@ void ssb_pmu_init(struct ssb_chipcommon 
     423        pmucap = chipco_read32(cc, SSB_CHIPCO_PMU_CAP); 
     424        cc->pmu.rev = (pmucap & SSB_CHIPCO_PMU_CAP_REVISION); 
     425  
     426-       ssb_dprintk(KERN_DEBUG PFX "Found rev %u PMU (capabilities 0x%08X)\n", 
     427-                   cc->pmu.rev, pmucap); 
     428+       ssb_dbg("Found rev %u PMU (capabilities 0x%08X)\n", 
     429+               cc->pmu.rev, pmucap); 
     430  
     431        if (cc->pmu.rev == 1) 
     432                chipco_mask32(cc, SSB_CHIPCO_PMU_CTL, 
     433@@ -607,3 +615,102 @@ void ssb_pmu_set_ldo_paref(struct ssb_ch 
    67434  
    68435 EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage); 
    69436 EXPORT_SYMBOL(ssb_pmu_set_ldo_paref); 
     437+ 
     438+static u32 ssb_pmu_get_alp_clock_clk0(struct ssb_chipcommon *cc) 
     439+{ 
     440+       u32 crystalfreq; 
     441+       const struct pmu0_plltab_entry *e = NULL; 
     442+ 
     443+       crystalfreq = chipco_read32(cc, SSB_CHIPCO_PMU_CTL) & 
     444+                     SSB_CHIPCO_PMU_CTL_XTALFREQ >> SSB_CHIPCO_PMU_CTL_XTALFREQ_SHIFT; 
     445+       e = pmu0_plltab_find_entry(crystalfreq); 
     446+       BUG_ON(!e); 
     447+       return e->freq * 1000; 
     448+} 
     449+ 
     450+u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc) 
     451+{ 
     452+       struct ssb_bus *bus = cc->dev->bus; 
     453+ 
     454+       switch (bus->chip_id) { 
     455+       case 0x5354: 
     456+               ssb_pmu_get_alp_clock_clk0(cc); 
     457+       default: 
     458+               ssb_err("ERROR: PMU alp clock unknown for device %04X\n", 
     459+                       bus->chip_id); 
     460+               return 0; 
     461+       } 
     462+} 
    70463+ 
    71464+u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc) 
     
    78471+               return 240000000; 
    79472+       default: 
    80 +               ssb_printk(KERN_ERR PFX 
    81 +                          "ERROR: PMU cpu clock unknown for device %04X\n", 
    82 +                          bus->chip_id); 
     473+               ssb_err("ERROR: PMU cpu clock unknown for device %04X\n", 
     474+                       bus->chip_id); 
    83475+               return 0; 
    84476+       } 
     
    93485+               return 120000000; 
    94486+       default: 
    95 +               ssb_printk(KERN_ERR PFX 
    96 +                          "ERROR: PMU controlclock unknown for device %04X\n", 
    97 +                          bus->chip_id); 
     487+               ssb_err("ERROR: PMU controlclock unknown for device %04X\n", 
     488+                       bus->chip_id); 
    98489+               return 0; 
    99490+       } 
    100491+} 
     492+ 
     493+void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid) 
     494+{ 
     495+       u32 pmu_ctl = 0; 
     496+ 
     497+       switch (cc->dev->bus->chip_id) { 
     498+       case 0x4322: 
     499+               ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100070); 
     500+               ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x1014140a); 
     501+               ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888854); 
     502+               if (spuravoid == 1) 
     503+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05201828); 
     504+               else 
     505+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x05001828); 
     506+               pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; 
     507+               break; 
     508+       case 43222: 
     509+               if (spuravoid == 1) { 
     510+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11500008); 
     511+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x0C000C06); 
     512+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x0F600a08); 
     513+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL3, 0x00000000); 
     514+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL4, 0x2001E920); 
     515+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888815); 
     516+               } else { 
     517+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL0, 0x11100008); 
     518+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL1, 0x0c000c06); 
     519+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL2, 0x03000a08); 
     520+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL3, 0x00000000); 
     521+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL4, 0x200005c0); 
     522+                       ssb_chipco_pll_write(cc, SSB_PMU1_PLLCTL5, 0x88888855); 
     523+               } 
     524+               pmu_ctl = SSB_CHIPCO_PMU_CTL_PLL_UPD; 
     525+               break; 
     526+       default: 
     527+               ssb_printk(KERN_ERR PFX 
     528+                          "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", 
     529+                          cc->dev->bus->chip_id); 
     530+               return; 
     531+       } 
     532+ 
     533+       chipco_set32(cc, SSB_CHIPCO_PMU_CTL, pmu_ctl); 
     534+} 
     535+EXPORT_SYMBOL_GPL(ssb_pmu_spuravoid_pllupdate); 
     536--- a/drivers/ssb/driver_extif.c 
     537+++ b/drivers/ssb/driver_extif.c 
     538@@ -112,10 +112,37 @@ void ssb_extif_get_clockcontrol(struct s 
     539        *m = extif_read32(extif, SSB_EXTIF_CLOCK_SB); 
     540 } 
     541  
     542-void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, 
     543-                                 u32 ticks) 
     544+u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks) 
     545 { 
     546+       struct ssb_extif *extif = bcm47xx_wdt_get_drvdata(wdt); 
     547+ 
     548+       return ssb_extif_watchdog_timer_set(extif, ticks); 
     549+} 
     550+ 
     551+u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms) 
     552+{ 
     553+       struct ssb_extif *extif = bcm47xx_wdt_get_drvdata(wdt); 
     554+       u32 ticks = (SSB_EXTIF_WATCHDOG_CLK / 1000) * ms; 
     555+ 
     556+       ticks = ssb_extif_watchdog_timer_set(extif, ticks); 
     557+ 
     558+       return (ticks * 1000) / SSB_EXTIF_WATCHDOG_CLK; 
     559+} 
     560+ 
     561+u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks) 
     562+{ 
     563+       if (ticks > SSB_EXTIF_WATCHDOG_MAX_TIMER) 
     564+               ticks = SSB_EXTIF_WATCHDOG_MAX_TIMER; 
     565        extif_write32(extif, SSB_EXTIF_WATCHDOG, ticks); 
     566+ 
     567+       return ticks; 
     568+} 
     569+ 
     570+void ssb_extif_init(struct ssb_extif *extif) 
     571+{ 
     572+       if (!extif->dev) 
     573+               return; /* We don't have a Extif core */ 
     574+       spin_lock_init(&extif->gpio_lock); 
     575 } 
     576  
     577 u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask) 
     578@@ -125,22 +152,50 @@ u32 ssb_extif_gpio_in(struct ssb_extif * 
     579  
     580 u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value) 
     581 { 
     582-       return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0), 
     583+       unsigned long flags; 
     584+       u32 res = 0; 
     585+ 
     586+       spin_lock_irqsave(&extif->gpio_lock, flags); 
     587+       res = extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0), 
     588                                   mask, value); 
     589+       spin_unlock_irqrestore(&extif->gpio_lock, flags); 
     590+ 
     591+       return res; 
     592 } 
     593  
     594 u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value) 
     595 { 
     596-       return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0), 
     597+       unsigned long flags; 
     598+       u32 res = 0; 
     599+ 
     600+       spin_lock_irqsave(&extif->gpio_lock, flags); 
     601+       res = extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0), 
     602                                   mask, value); 
     603+       spin_unlock_irqrestore(&extif->gpio_lock, flags); 
     604+ 
     605+       return res; 
     606 } 
     607  
     608 u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value) 
     609 { 
     610-       return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTPOL, mask, value); 
     611+       unsigned long flags; 
     612+       u32 res = 0; 
     613+ 
     614+       spin_lock_irqsave(&extif->gpio_lock, flags); 
     615+       res = extif_write32_masked(extif, SSB_EXTIF_GPIO_INTPOL, mask, value); 
     616+       spin_unlock_irqrestore(&extif->gpio_lock, flags); 
     617+ 
     618+       return res; 
     619 } 
     620  
     621 u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value) 
     622 { 
     623-       return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTMASK, mask, value); 
     624+       unsigned long flags; 
     625+       u32 res = 0; 
     626+ 
     627+       spin_lock_irqsave(&extif->gpio_lock, flags); 
     628+       res = extif_write32_masked(extif, SSB_EXTIF_GPIO_INTMASK, mask, value); 
     629+       spin_unlock_irqrestore(&extif->gpio_lock, flags); 
     630+ 
     631+       return res; 
     632 } 
     633--- /dev/null 
     634+++ b/drivers/ssb/driver_gpio.c 
     635@@ -0,0 +1,210 @@ 
     636+/* 
     637+ * Sonics Silicon Backplane 
     638+ * GPIO driver 
     639+ * 
     640+ * Copyright 2011, Broadcom Corporation 
     641+ * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
     642+ * 
     643+ * Licensed under the GNU/GPL. See COPYING for details. 
     644+ */ 
     645+ 
     646+#include <linux/gpio.h> 
     647+#include <linux/export.h> 
     648+#include <linux/ssb/ssb.h> 
     649+ 
     650+#include "ssb_private.h" 
     651+ 
     652+static struct ssb_bus *ssb_gpio_get_bus(struct gpio_chip *chip) 
     653+{ 
     654+       return container_of(chip, struct ssb_bus, gpio); 
     655+} 
     656+ 
     657+static int ssb_gpio_chipco_get_value(struct gpio_chip *chip, unsigned gpio) 
     658+{ 
     659+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     660+ 
     661+       return !!ssb_chipco_gpio_in(&bus->chipco, 1 << gpio); 
     662+} 
     663+ 
     664+static void ssb_gpio_chipco_set_value(struct gpio_chip *chip, unsigned gpio, 
     665+                                     int value) 
     666+{ 
     667+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     668+ 
     669+       ssb_chipco_gpio_out(&bus->chipco, 1 << gpio, value ? 1 << gpio : 0); 
     670+} 
     671+ 
     672+static int ssb_gpio_chipco_direction_input(struct gpio_chip *chip, 
     673+                                          unsigned gpio) 
     674+{ 
     675+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     676+ 
     677+       ssb_chipco_gpio_outen(&bus->chipco, 1 << gpio, 0); 
     678+       return 0; 
     679+} 
     680+ 
     681+static int ssb_gpio_chipco_direction_output(struct gpio_chip *chip, 
     682+                                           unsigned gpio, int value) 
     683+{ 
     684+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     685+ 
     686+       ssb_chipco_gpio_outen(&bus->chipco, 1 << gpio, 1 << gpio); 
     687+       ssb_chipco_gpio_out(&bus->chipco, 1 << gpio, value ? 1 << gpio : 0); 
     688+       return 0; 
     689+} 
     690+ 
     691+static int ssb_gpio_chipco_request(struct gpio_chip *chip, unsigned gpio) 
     692+{ 
     693+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     694+ 
     695+       ssb_chipco_gpio_control(&bus->chipco, 1 << gpio, 0); 
     696+       /* clear pulldown */ 
     697+       ssb_chipco_gpio_pulldown(&bus->chipco, 1 << gpio, 0); 
     698+       /* Set pullup */ 
     699+       ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 1 << gpio); 
     700+ 
     701+       return 0; 
     702+} 
     703+ 
     704+static void ssb_gpio_chipco_free(struct gpio_chip *chip, unsigned gpio) 
     705+{ 
     706+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     707+ 
     708+       /* clear pullup */ 
     709+       ssb_chipco_gpio_pullup(&bus->chipco, 1 << gpio, 0); 
     710+} 
     711+ 
     712+static int ssb_gpio_chipco_to_irq(struct gpio_chip *chip, unsigned gpio) 
     713+{ 
     714+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     715+ 
     716+       if (bus->bustype == SSB_BUSTYPE_SSB) 
     717+               return ssb_mips_irq(bus->chipco.dev) + 2; 
     718+       else 
     719+               return -EINVAL; 
     720+} 
     721+ 
     722+static int ssb_gpio_chipco_init(struct ssb_bus *bus) 
     723+{ 
     724+       struct gpio_chip *chip = &bus->gpio; 
     725+ 
     726+       chip->label             = "ssb_chipco_gpio"; 
     727+       chip->owner             = THIS_MODULE; 
     728+       chip->request           = ssb_gpio_chipco_request; 
     729+       chip->free              = ssb_gpio_chipco_free; 
     730+       chip->get               = ssb_gpio_chipco_get_value; 
     731+       chip->set               = ssb_gpio_chipco_set_value; 
     732+       chip->direction_input   = ssb_gpio_chipco_direction_input; 
     733+       chip->direction_output  = ssb_gpio_chipco_direction_output; 
     734+       chip->to_irq            = ssb_gpio_chipco_to_irq; 
     735+       chip->ngpio             = 16; 
     736+       /* There is just one SoC in one device and its GPIO addresses should be 
     737+        * deterministic to address them more easily. The other buses could get 
     738+        * a random base number. */ 
     739+       if (bus->bustype == SSB_BUSTYPE_SSB) 
     740+               chip->base              = 0; 
     741+       else 
     742+               chip->base              = -1; 
     743+ 
     744+       return gpiochip_add(chip); 
     745+} 
     746+ 
     747+#ifdef CONFIG_SSB_DRIVER_EXTIF 
     748+ 
     749+static int ssb_gpio_extif_get_value(struct gpio_chip *chip, unsigned gpio) 
     750+{ 
     751+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     752+ 
     753+       return !!ssb_extif_gpio_in(&bus->extif, 1 << gpio); 
     754+} 
     755+ 
     756+static void ssb_gpio_extif_set_value(struct gpio_chip *chip, unsigned gpio, 
     757+                                    int value) 
     758+{ 
     759+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     760+ 
     761+       ssb_extif_gpio_out(&bus->extif, 1 << gpio, value ? 1 << gpio : 0); 
     762+} 
     763+ 
     764+static int ssb_gpio_extif_direction_input(struct gpio_chip *chip, 
     765+                                         unsigned gpio) 
     766+{ 
     767+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     768+ 
     769+       ssb_extif_gpio_outen(&bus->extif, 1 << gpio, 0); 
     770+       return 0; 
     771+} 
     772+ 
     773+static int ssb_gpio_extif_direction_output(struct gpio_chip *chip, 
     774+                                          unsigned gpio, int value) 
     775+{ 
     776+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     777+ 
     778+       ssb_extif_gpio_outen(&bus->extif, 1 << gpio, 1 << gpio); 
     779+       ssb_extif_gpio_out(&bus->extif, 1 << gpio, value ? 1 << gpio : 0); 
     780+       return 0; 
     781+} 
     782+ 
     783+static int ssb_gpio_extif_to_irq(struct gpio_chip *chip, unsigned gpio) 
     784+{ 
     785+       struct ssb_bus *bus = ssb_gpio_get_bus(chip); 
     786+ 
     787+       if (bus->bustype == SSB_BUSTYPE_SSB) 
     788+               return ssb_mips_irq(bus->extif.dev) + 2; 
     789+       else 
     790+               return -EINVAL; 
     791+} 
     792+ 
     793+static int ssb_gpio_extif_init(struct ssb_bus *bus) 
     794+{ 
     795+       struct gpio_chip *chip = &bus->gpio; 
     796+ 
     797+       chip->label             = "ssb_extif_gpio"; 
     798+       chip->owner             = THIS_MODULE; 
     799+       chip->get               = ssb_gpio_extif_get_value; 
     800+       chip->set               = ssb_gpio_extif_set_value; 
     801+       chip->direction_input   = ssb_gpio_extif_direction_input; 
     802+       chip->direction_output  = ssb_gpio_extif_direction_output; 
     803+       chip->to_irq            = ssb_gpio_extif_to_irq; 
     804+       chip->ngpio             = 5; 
     805+       /* There is just one SoC in one device and its GPIO addresses should be 
     806+        * deterministic to address them more easily. The other buses could get 
     807+        * a random base number. */ 
     808+       if (bus->bustype == SSB_BUSTYPE_SSB) 
     809+               chip->base              = 0; 
     810+       else 
     811+               chip->base              = -1; 
     812+ 
     813+       return gpiochip_add(chip); 
     814+} 
     815+ 
     816+#else 
     817+static int ssb_gpio_extif_init(struct ssb_bus *bus) 
     818+{ 
     819+       return -ENOTSUPP; 
     820+} 
     821+#endif 
     822+ 
     823+int ssb_gpio_init(struct ssb_bus *bus) 
     824+{ 
     825+       if (ssb_chipco_available(&bus->chipco)) 
     826+               return ssb_gpio_chipco_init(bus); 
     827+       else if (ssb_extif_available(&bus->extif)) 
     828+               return ssb_gpio_extif_init(bus); 
     829+       else 
     830+               SSB_WARN_ON(1); 
     831+ 
     832+       return -1; 
     833+} 
     834+ 
     835+int ssb_gpio_unregister(struct ssb_bus *bus) 
     836+{ 
     837+       if (ssb_chipco_available(&bus->chipco) || 
     838+           ssb_extif_available(&bus->extif)) { 
     839+               return gpiochip_remove(&bus->gpio); 
     840+       } else { 
     841+               SSB_WARN_ON(1); 
     842+       } 
     843+ 
     844+       return -1; 
     845+} 
    101846--- a/drivers/ssb/driver_mipscore.c 
    102847+++ b/drivers/ssb/driver_mipscore.c 
    103 @@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m 
     848@@ -17,7 +17,6 @@ 
     849  
     850 #include "ssb_private.h" 
     851  
     852- 
     853 static inline u32 mips_read32(struct ssb_mipscore *mcore, 
     854                              u16 offset) 
     855 { 
     856@@ -147,21 +146,22 @@ static void set_irq(struct ssb_device *d 
     857                irqflag |= (ipsflag & ~ipsflag_irq_mask[irq]); 
     858                ssb_write32(mdev, SSB_IPSFLAG, irqflag); 
     859        } 
     860-       ssb_dprintk(KERN_INFO PFX 
     861-                   "set_irq: core 0x%04x, irq %d => %d\n", 
     862-                   dev->id.coreid, oldirq+2, irq+2); 
     863+       ssb_dbg("set_irq: core 0x%04x, irq %d => %d\n", 
     864+               dev->id.coreid, oldirq+2, irq+2); 
     865 } 
     866  
     867 static void print_irq(struct ssb_device *dev, unsigned int irq) 
     868 { 
     869-       int i; 
     870        static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"}; 
     871-       ssb_dprintk(KERN_INFO PFX 
     872-               "core 0x%04x, irq :", dev->id.coreid); 
     873-       for (i = 0; i <= 6; i++) { 
     874-               ssb_dprintk(" %s%s", irq_name[i], i==irq?"*":" "); 
     875-       } 
     876-       ssb_dprintk("\n"); 
     877+       ssb_dbg("core 0x%04x, irq : %s%s %s%s %s%s %s%s %s%s %s%s %s%s\n", 
     878+               dev->id.coreid, 
     879+               irq_name[0], irq == 0 ? "*" : " ", 
     880+               irq_name[1], irq == 1 ? "*" : " ", 
     881+               irq_name[2], irq == 2 ? "*" : " ", 
     882+               irq_name[3], irq == 3 ? "*" : " ", 
     883+               irq_name[4], irq == 4 ? "*" : " ", 
     884+               irq_name[5], irq == 5 ? "*" : " ", 
     885+               irq_name[6], irq == 6 ? "*" : " "); 
     886 } 
     887  
     888 static void dump_irq(struct ssb_bus *bus) 
     889@@ -178,9 +178,9 @@ static void ssb_mips_serial_init(struct 
     890 { 
     891        struct ssb_bus *bus = mcore->dev->bus; 
     892  
     893-       if (bus->extif.dev) 
     894+       if (ssb_extif_available(&bus->extif)) 
     895                mcore->nr_serial_ports = ssb_extif_serial_init(&bus->extif, mcore->serial_ports); 
     896-       else if (bus->chipco.dev) 
     897+       else if (ssb_chipco_available(&bus->chipco)) 
     898                mcore->nr_serial_ports = ssb_chipco_serial_init(&bus->chipco, mcore->serial_ports); 
     899        else 
     900                mcore->nr_serial_ports = 0; 
     901@@ -191,7 +191,7 @@ static void ssb_mips_flash_detect(struct 
     902        struct ssb_bus *bus = mcore->dev->bus; 
     903  
     904        mcore->flash_buswidth = 2; 
     905-       if (bus->chipco.dev) { 
     906+       if (ssb_chipco_available(&bus->chipco)) { 
     907                mcore->flash_window = 0x1c000000; 
     908                mcore->flash_window_size = 0x02000000; 
     909                if ((ssb_read32(bus->chipco.dev, SSB_CHIPCO_FLASH_CFG) 
     910@@ -208,9 +208,12 @@ u32 ssb_cpu_clock(struct ssb_mipscore *m 
    104911        struct ssb_bus *bus = mcore->dev->bus; 
    105912        u32 pll_type, n, m, rate = 0; 
    106913  
     914-       if (bus->extif.dev) { 
    107915+       if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU) 
    108916+               return ssb_pmu_get_cpu_clock(&bus->chipco); 
    109917+ 
    110         if (bus->extif.dev) { 
     918+       if (ssb_extif_available(&bus->extif)) { 
    111919                ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m); 
    112         } else if (bus->chipco.dev) { 
     920-       } else if (bus->chipco.dev) { 
     921+       } else if (ssb_chipco_available(&bus->chipco)) { 
     922                ssb_chipco_get_clockcpu(&bus->chipco, &pll_type, &n, &m); 
     923        } else 
     924                return 0; 
     925@@ -238,7 +241,7 @@ void ssb_mipscore_init(struct ssb_mipsco 
     926        if (!mcore->dev) 
     927                return; /* We don't have a MIPS core */ 
     928  
     929-       ssb_dprintk(KERN_INFO PFX "Initializing MIPS core...\n"); 
     930+       ssb_dbg("Initializing MIPS core...\n"); 
     931  
     932        bus = mcore->dev->bus; 
     933        hz = ssb_clockspeed(bus); 
     934@@ -246,9 +249,9 @@ void ssb_mipscore_init(struct ssb_mipsco 
     935                hz = 100000000; 
     936        ns = 1000000000 / hz; 
     937  
     938-       if (bus->extif.dev) 
     939+       if (ssb_extif_available(&bus->extif)) 
     940                ssb_extif_timing_init(&bus->extif, ns); 
     941-       else if (bus->chipco.dev) 
     942+       else if (ssb_chipco_available(&bus->chipco)) 
     943                ssb_chipco_timing_init(&bus->chipco, ns); 
     944  
     945        /* Assign IRQs to all cores on the bus, start with irq line 2, because serial usually takes 1 */ 
     946@@ -286,7 +289,7 @@ void ssb_mipscore_init(struct ssb_mipsco 
     947                        break; 
     948                } 
     949        } 
     950-       ssb_dprintk(KERN_INFO PFX "after irq reconfiguration\n"); 
     951+       ssb_dbg("after irq reconfiguration\n"); 
     952        dump_irq(bus); 
     953  
     954        ssb_mips_serial_init(mcore); 
     955--- a/drivers/ssb/driver_pcicore.c 
     956+++ b/drivers/ssb/driver_pcicore.c 
     957@@ -263,8 +263,7 @@ int ssb_pcicore_plat_dev_init(struct pci 
     958                return -ENODEV; 
     959        } 
     960  
     961-       ssb_printk(KERN_INFO "PCI: Fixing up device %s\n", 
     962-                  pci_name(d)); 
     963+       ssb_info("PCI: Fixing up device %s\n", pci_name(d)); 
     964  
     965        /* Fix up interrupt lines */ 
     966        d->irq = ssb_mips_irq(extpci_core->dev) + 2; 
     967@@ -285,12 +284,12 @@ static void ssb_pcicore_fixup_pcibridge( 
     968        if (dev->bus->number != 0 || PCI_SLOT(dev->devfn) != 0) 
     969                return; 
     970  
     971-       ssb_printk(KERN_INFO "PCI: Fixing up bridge %s\n", pci_name(dev)); 
     972+       ssb_info("PCI: Fixing up bridge %s\n", pci_name(dev)); 
     973  
     974        /* Enable PCI bridge bus mastering and memory space */ 
     975        pci_set_master(dev); 
     976        if (pcibios_enable_device(dev, ~0) < 0) { 
     977-               ssb_printk(KERN_ERR "PCI: SSB bridge enable failed\n"); 
     978+               ssb_err("PCI: SSB bridge enable failed\n"); 
     979                return; 
     980        } 
     981  
     982@@ -299,8 +298,8 @@ static void ssb_pcicore_fixup_pcibridge( 
     983  
     984        /* Make sure our latency is high enough to handle the devices behind us */ 
     985        lat = 168; 
     986-       ssb_printk(KERN_INFO "PCI: Fixing latency timer of device %s to %u\n", 
     987-                  pci_name(dev), lat); 
     988+       ssb_info("PCI: Fixing latency timer of device %s to %u\n", 
     989+                pci_name(dev), lat); 
     990        pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat); 
     991 } 
     992 DECLARE_PCI_FIXUP_EARLY(PCI_ANY_ID, PCI_ANY_ID, ssb_pcicore_fixup_pcibridge); 
     993@@ -323,7 +322,7 @@ static void __devinit ssb_pcicore_init_h 
     994                return; 
     995        extpci_core = pc; 
     996  
     997-       ssb_dprintk(KERN_INFO PFX "PCIcore in host mode found\n"); 
     998+       ssb_dbg("PCIcore in host mode found\n"); 
     999        /* Reset devices on the external PCI bus */ 
     1000        val = SSB_PCICORE_CTL_RST_OE; 
     1001        val |= SSB_PCICORE_CTL_CLK_OE; 
     1002@@ -338,7 +337,7 @@ static void __devinit ssb_pcicore_init_h 
     1003        udelay(1); /* Assertion time demanded by the PCI standard */ 
     1004  
     1005        if (pc->dev->bus->has_cardbus_slot) { 
     1006-               ssb_dprintk(KERN_INFO PFX "CardBus slot detected\n"); 
     1007+               ssb_dbg("CardBus slot detected\n"); 
     1008                pc->cardbusmode = 1; 
     1009                /* GPIO 1 resets the bridge */ 
     1010                ssb_gpio_out(pc->dev->bus, 1, 1); 
     1011--- a/drivers/ssb/embedded.c 
     1012+++ b/drivers/ssb/embedded.c 
     1013@@ -4,11 +4,13 @@ 
     1014  * 
     1015  * Copyright 2005-2008, Broadcom Corporation 
     1016  * Copyright 2006-2008, Michael Buesch <m@bues.ch> 
     1017+ * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
     1018  * 
     1019  * Licensed under the GNU/GPL. See COPYING for details. 
     1020  */ 
     1021  
     1022 #include <linux/export.h> 
     1023+#include <linux/platform_device.h> 
     1024 #include <linux/ssb/ssb.h> 
     1025 #include <linux/ssb/ssb_embedded.h> 
     1026 #include <linux/ssb/ssb_driver_pci.h> 
     1027@@ -32,6 +34,38 @@ int ssb_watchdog_timer_set(struct ssb_bu 
     1028 } 
     1029 EXPORT_SYMBOL(ssb_watchdog_timer_set); 
     1030  
     1031+int ssb_watchdog_register(struct ssb_bus *bus) 
     1032+{ 
     1033+       struct bcm47xx_wdt wdt = {}; 
     1034+       struct platform_device *pdev; 
     1035+ 
     1036+       if (ssb_chipco_available(&bus->chipco)) { 
     1037+               wdt.driver_data = &bus->chipco; 
     1038+               wdt.timer_set = ssb_chipco_watchdog_timer_set_wdt; 
     1039+               wdt.timer_set_ms = ssb_chipco_watchdog_timer_set_ms; 
     1040+               wdt.max_timer_ms = bus->chipco.max_timer_ms; 
     1041+       } else if (ssb_extif_available(&bus->extif)) { 
     1042+               wdt.driver_data = &bus->extif; 
     1043+               wdt.timer_set = ssb_extif_watchdog_timer_set_wdt; 
     1044+               wdt.timer_set_ms = ssb_extif_watchdog_timer_set_ms; 
     1045+               wdt.max_timer_ms = SSB_EXTIF_WATCHDOG_MAX_TIMER_MS; 
     1046+       } else { 
     1047+               return -ENODEV; 
     1048+       } 
     1049+ 
     1050+       pdev = platform_device_register_data(NULL, "bcm47xx-wdt", 
     1051+                                            bus->busnumber, &wdt, 
     1052+                                            sizeof(wdt)); 
     1053+       if (IS_ERR(pdev)) { 
     1054+               ssb_dbg("can not register watchdog device, err: %li\n", 
     1055+                       PTR_ERR(pdev)); 
     1056+               return PTR_ERR(pdev); 
     1057+       } 
     1058+ 
     1059+       bus->watchdog = pdev; 
     1060+       return 0; 
     1061+} 
     1062+ 
     1063 u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask) 
     1064 { 
     1065        unsigned long flags; 
    1131066--- a/drivers/ssb/main.c 
    1141067+++ b/drivers/ssb/main.c 
    115 @@ -140,19 +140,6 @@ static void ssb_device_put(struct ssb_de 
     1068@@ -13,6 +13,7 @@ 
     1069 #include <linux/delay.h> 
     1070 #include <linux/io.h> 
     1071 #include <linux/module.h> 
     1072+#include <linux/platform_device.h> 
     1073 #include <linux/ssb/ssb.h> 
     1074 #include <linux/ssb/ssb_regs.h> 
     1075 #include <linux/ssb/ssb_driver_gige.h> 
     1076@@ -140,19 +141,6 @@ static void ssb_device_put(struct ssb_de 
    1161077                put_device(dev->dev); 
    1171078 } 
     
    1331094 { 
    1341095        struct ssb_device *ssb_dev = dev_to_ssb_dev(dev); 
    135 @@ -250,11 +237,9 @@ int ssb_devices_freeze(struct ssb_bus *b 
     1096@@ -250,11 +238,9 @@ int ssb_devices_freeze(struct ssb_bus *b 
    1361097                        ssb_device_put(sdev); 
    1371098                        continue; 
     
    1471108                ctx->device_frozen[i] = 1; 
    1481109        } 
    149 @@ -293,7 +278,6 @@ int ssb_devices_thaw(struct ssb_freeze_c 
    150                                    dev_name(sdev->dev)); 
     1110@@ -289,11 +275,10 @@ int ssb_devices_thaw(struct ssb_freeze_c 
     1111  
     1112                err = sdrv->probe(sdev, &sdev->id); 
     1113                if (err) { 
     1114-                       ssb_printk(KERN_ERR PFX "Failed to thaw device %s\n", 
     1115-                                  dev_name(sdev->dev)); 
     1116+                       ssb_err("Failed to thaw device %s\n", 
     1117+                               dev_name(sdev->dev)); 
    1511118                        result = err; 
    1521119                } 
     
    1551122        } 
    1561123  
    157 @@ -1094,6 +1078,9 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
     1124@@ -449,10 +434,23 @@ static void ssb_devices_unregister(struc 
     1125                if (sdev->dev) 
     1126                        device_unregister(sdev->dev); 
     1127        } 
     1128+ 
     1129+#ifdef CONFIG_SSB_EMBEDDED 
     1130+       if (bus->bustype == SSB_BUSTYPE_SSB) 
     1131+               platform_device_unregister(bus->watchdog); 
     1132+#endif 
     1133 } 
     1134  
     1135 void ssb_bus_unregister(struct ssb_bus *bus) 
     1136 { 
     1137+       int err; 
     1138+ 
     1139+       err = ssb_gpio_unregister(bus); 
     1140+       if (err == -EBUSY) 
     1141+               ssb_dbg("Some GPIOs are still in use\n"); 
     1142+       else if (err) 
     1143+               ssb_dbg("Can not unregister GPIO driver: %i\n", err); 
     1144+ 
     1145        ssb_buses_lock(); 
     1146        ssb_devices_unregister(bus); 
     1147        list_del(&bus->list); 
     1148@@ -498,8 +496,7 @@ static int ssb_devices_register(struct s 
     1149  
     1150                devwrap = kzalloc(sizeof(*devwrap), GFP_KERNEL); 
     1151                if (!devwrap) { 
     1152-                       ssb_printk(KERN_ERR PFX 
     1153-                                  "Could not allocate device\n"); 
     1154+                       ssb_err("Could not allocate device\n"); 
     1155                        err = -ENOMEM; 
     1156                        goto error; 
     1157                } 
     1158@@ -538,9 +535,7 @@ static int ssb_devices_register(struct s 
     1159                sdev->dev = dev; 
     1160                err = device_register(dev); 
     1161                if (err) { 
     1162-                       ssb_printk(KERN_ERR PFX 
     1163-                                  "Could not register %s\n", 
     1164-                                  dev_name(dev)); 
     1165+                       ssb_err("Could not register %s\n", dev_name(dev)); 
     1166                        /* Set dev to NULL to not unregister 
     1167                         * dev on error unwinding. */ 
     1168                        sdev->dev = NULL; 
     1169@@ -577,6 +572,8 @@ static int __devinit ssb_attach_queued_b 
     1170                if (err) 
     1171                        goto error; 
     1172                ssb_pcicore_init(&bus->pcicore); 
     1173+               if (bus->bustype == SSB_BUSTYPE_SSB) 
     1174+                       ssb_watchdog_register(bus); 
     1175                ssb_bus_may_powerdown(bus); 
     1176  
     1177                err = ssb_devices_register(bus); 
     1178@@ -812,7 +809,13 @@ static int __devinit ssb_bus_register(st 
     1179        if (err) 
     1180                goto err_pcmcia_exit; 
     1181        ssb_chipcommon_init(&bus->chipco); 
     1182+       ssb_extif_init(&bus->extif); 
     1183        ssb_mipscore_init(&bus->mipscore); 
     1184+       err = ssb_gpio_init(bus); 
     1185+       if (err == -ENOTSUPP) 
     1186+               ssb_dbg("GPIO driver not activated\n"); 
     1187+       else if (err) 
     1188+               ssb_dbg("Error registering GPIO driver: %i\n", err); 
     1189        err = ssb_fetch_invariants(bus, get_invariants); 
     1190        if (err) { 
     1191                ssb_bus_may_powerdown(bus); 
     1192@@ -863,11 +866,11 @@ int __devinit ssb_bus_pcibus_register(st 
     1193  
     1194        err = ssb_bus_register(bus, ssb_pci_get_invariants, 0); 
     1195        if (!err) { 
     1196-               ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
     1197-                          "PCI device %s\n", dev_name(&host_pci->dev)); 
     1198+               ssb_info("Sonics Silicon Backplane found on PCI device %s\n", 
     1199+                        dev_name(&host_pci->dev)); 
     1200        } else { 
     1201-               ssb_printk(KERN_ERR PFX "Failed to register PCI version" 
     1202-                          " of SSB with error %d\n", err); 
     1203+               ssb_err("Failed to register PCI version of SSB with error %d\n", 
     1204+                       err); 
     1205        } 
     1206  
     1207        return err; 
     1208@@ -888,8 +891,8 @@ int __devinit ssb_bus_pcmciabus_register 
     1209  
     1210        err = ssb_bus_register(bus, ssb_pcmcia_get_invariants, baseaddr); 
     1211        if (!err) { 
     1212-               ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
     1213-                          "PCMCIA device %s\n", pcmcia_dev->devname); 
     1214+               ssb_info("Sonics Silicon Backplane found on PCMCIA device %s\n", 
     1215+                        pcmcia_dev->devname); 
     1216        } 
     1217  
     1218        return err; 
     1219@@ -911,8 +914,8 @@ int __devinit ssb_bus_sdiobus_register(s 
     1220  
     1221        err = ssb_bus_register(bus, ssb_sdio_get_invariants, ~0); 
     1222        if (!err) { 
     1223-               ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found on " 
     1224-                          "SDIO device %s\n", sdio_func_id(func)); 
     1225+               ssb_info("Sonics Silicon Backplane found on SDIO device %s\n", 
     1226+                        sdio_func_id(func)); 
     1227        } 
     1228  
     1229        return err; 
     1230@@ -931,8 +934,8 @@ int __devinit ssb_bus_ssbbus_register(st 
     1231  
     1232        err = ssb_bus_register(bus, get_invariants, baseaddr); 
     1233        if (!err) { 
     1234-               ssb_printk(KERN_INFO PFX "Sonics Silicon Backplane found at " 
     1235-                          "address 0x%08lX\n", baseaddr); 
     1236+               ssb_info("Sonics Silicon Backplane found at address 0x%08lX\n", 
     1237+                        baseaddr); 
     1238        } 
     1239  
     1240        return err; 
     1241@@ -1094,6 +1097,9 @@ u32 ssb_clockspeed(struct ssb_bus *bus) 
    1581242        u32 plltype; 
    1591243        u32 clkctl_n, clkctl_m; 
     
    1651249                ssb_extif_get_clockcontrol(&bus->extif, &plltype, 
    1661250                                           &clkctl_n, &clkctl_m); 
     1251@@ -1131,8 +1137,7 @@ static u32 ssb_tmslow_reject_bitmask(str 
     1252        case SSB_IDLOW_SSBREV_27:     /* same here */ 
     1253                return SSB_TMSLOW_REJECT;       /* this is a guess */ 
     1254        default: 
     1255-               printk(KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev); 
     1256-               WARN_ON(1); 
     1257+               WARN(1, KERN_INFO "ssb: Backplane Revision 0x%.8X\n", rev); 
     1258        } 
     1259        return (SSB_TMSLOW_REJECT | SSB_TMSLOW_REJECT_23); 
     1260 } 
     1261@@ -1324,7 +1329,7 @@ out: 
     1262 #endif 
     1263        return err; 
     1264 error: 
     1265-       ssb_printk(KERN_ERR PFX "Bus powerdown failed\n"); 
     1266+       ssb_err("Bus powerdown failed\n"); 
     1267        goto out; 
     1268 } 
     1269 EXPORT_SYMBOL(ssb_bus_may_powerdown); 
     1270@@ -1347,7 +1352,7 @@ int ssb_bus_powerup(struct ssb_bus *bus, 
     1271  
     1272        return 0; 
     1273 error: 
     1274-       ssb_printk(KERN_ERR PFX "Bus powerup failed\n"); 
     1275+       ssb_err("Bus powerup failed\n"); 
     1276        return err; 
     1277 } 
     1278 EXPORT_SYMBOL(ssb_bus_powerup); 
     1279@@ -1455,15 +1460,13 @@ static int __init ssb_modinit(void) 
     1280  
     1281        err = b43_pci_ssb_bridge_init(); 
     1282        if (err) { 
     1283-               ssb_printk(KERN_ERR "Broadcom 43xx PCI-SSB-bridge " 
     1284-                          "initialization failed\n"); 
     1285+               ssb_err("Broadcom 43xx PCI-SSB-bridge initialization failed\n"); 
     1286                /* don't fail SSB init because of this */ 
     1287                err = 0; 
     1288        } 
     1289        err = ssb_gige_init(); 
     1290        if (err) { 
     1291-               ssb_printk(KERN_ERR "SSB Broadcom Gigabit Ethernet " 
     1292-                          "driver initialization failed\n"); 
     1293+               ssb_err("SSB Broadcom Gigabit Ethernet driver initialization failed\n"); 
     1294                /* don't fail SSB init because of this */ 
     1295                err = 0; 
     1296        } 
    1671297--- a/drivers/ssb/pci.c 
    1681298+++ b/drivers/ssb/pci.c 
    169 @@ -178,6 +178,18 @@ err_pci: 
     1299@@ -56,7 +56,7 @@ int ssb_pci_switch_coreidx(struct ssb_bu 
     1300        } 
     1301        return 0; 
     1302 error: 
     1303-       ssb_printk(KERN_ERR PFX "Failed to switch to core %u\n", coreidx); 
     1304+       ssb_err("Failed to switch to core %u\n", coreidx); 
     1305        return -ENODEV; 
     1306 } 
     1307  
     1308@@ -67,10 +67,9 @@ int ssb_pci_switch_core(struct ssb_bus * 
     1309        unsigned long flags; 
     1310  
     1311 #if SSB_VERBOSE_PCICORESWITCH_DEBUG 
     1312-       ssb_printk(KERN_INFO PFX 
     1313-                  "Switching to %s core, index %d\n", 
     1314-                  ssb_core_name(dev->id.coreid), 
     1315-                  dev->core_index); 
     1316+       ssb_info("Switching to %s core, index %d\n", 
     1317+                ssb_core_name(dev->id.coreid), 
     1318+                dev->core_index); 
     1319 #endif 
     1320  
     1321        spin_lock_irqsave(&bus->bar_lock, flags); 
     1322@@ -178,6 +177,18 @@ err_pci: 
    1701323 #define SPEX(_outvar, _offset, _mask, _shift) \ 
    1711324        SPEX16(_outvar, _offset, _mask, _shift) 
     
    1861339 static inline u8 ssb_crc8(u8 crc, u8 data) 
    1871340 { 
    188 @@ -331,7 +343,6 @@ static void sprom_extract_r123(struct ss 
     1341@@ -219,6 +230,15 @@ static inline u8 ssb_crc8(u8 crc, u8 dat 
     1342        return t[crc ^ data]; 
     1343 } 
     1344  
     1345+static void sprom_get_mac(char *mac, const u16 *in) 
     1346+{ 
     1347+       int i; 
     1348+       for (i = 0; i < 3; i++) { 
     1349+               *mac++ = in[i] >> 8; 
     1350+               *mac++ = in[i]; 
     1351+       } 
     1352+} 
     1353+ 
     1354 static u8 ssb_sprom_crc(const u16 *sprom, u16 size) 
    1891355 { 
    190         int i; 
    191         u16 v; 
     1356        int word; 
     1357@@ -266,7 +286,7 @@ static int sprom_do_write(struct ssb_bus 
     1358        u32 spromctl; 
     1359        u16 size = bus->sprom_size; 
     1360  
     1361-       ssb_printk(KERN_NOTICE PFX "Writing SPROM. Do NOT turn off the power! Please stand by...\n"); 
     1362+       ssb_notice("Writing SPROM. Do NOT turn off the power! Please stand by...\n"); 
     1363        err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl); 
     1364        if (err) 
     1365                goto err_ctlreg; 
     1366@@ -274,17 +294,17 @@ static int sprom_do_write(struct ssb_bus 
     1367        err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl); 
     1368        if (err) 
     1369                goto err_ctlreg; 
     1370-       ssb_printk(KERN_NOTICE PFX "[ 0%%"); 
     1371+       ssb_notice("[ 0%%"); 
     1372        msleep(500); 
     1373        for (i = 0; i < size; i++) { 
     1374                if (i == size / 4) 
     1375-                       ssb_printk("25%%"); 
     1376+                       ssb_cont("25%%"); 
     1377                else if (i == size / 2) 
     1378-                       ssb_printk("50%%"); 
     1379+                       ssb_cont("50%%"); 
     1380                else if (i == (size * 3) / 4) 
     1381-                       ssb_printk("75%%"); 
     1382+                       ssb_cont("75%%"); 
     1383                else if (i % 2) 
     1384-                       ssb_printk("."); 
     1385+                       ssb_cont("."); 
     1386                writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2)); 
     1387                mmiowb(); 
     1388                msleep(20); 
     1389@@ -297,12 +317,12 @@ static int sprom_do_write(struct ssb_bus 
     1390        if (err) 
     1391                goto err_ctlreg; 
     1392        msleep(500); 
     1393-       ssb_printk("100%% ]\n"); 
     1394-       ssb_printk(KERN_NOTICE PFX "SPROM written.\n"); 
     1395+       ssb_cont("100%% ]\n"); 
     1396+       ssb_notice("SPROM written\n"); 
     1397  
     1398        return 0; 
     1399 err_ctlreg: 
     1400-       ssb_printk(KERN_ERR PFX "Could not access SPROM control register.\n"); 
     1401+       ssb_err("Could not access SPROM control register.\n"); 
     1402        return err; 
     1403 } 
     1404  
     1405@@ -327,11 +347,23 @@ static s8 r123_extract_antgain(u8 sprom_ 
     1406        return (s8)gain; 
     1407 } 
     1408  
     1409+static void sprom_extract_r23(struct ssb_sprom *out, const u16 *in) 
     1410+{ 
     1411+       SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); 
     1412+       SPEX(opo, SSB_SPROM2_OPO, SSB_SPROM2_OPO_VALUE, 0); 
     1413+       SPEX(pa1lob0, SSB_SPROM2_PA1LOB0, 0xFFFF, 0); 
     1414+       SPEX(pa1lob1, SSB_SPROM2_PA1LOB1, 0xFFFF, 0); 
     1415+       SPEX(pa1lob2, SSB_SPROM2_PA1LOB2, 0xFFFF, 0); 
     1416+       SPEX(pa1hib0, SSB_SPROM2_PA1HIB0, 0xFFFF, 0); 
     1417+       SPEX(pa1hib1, SSB_SPROM2_PA1HIB1, 0xFFFF, 0); 
     1418+       SPEX(pa1hib2, SSB_SPROM2_PA1HIB2, 0xFFFF, 0); 
     1419+       SPEX(maxpwr_ah, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_HI, 0); 
     1420+       SPEX(maxpwr_al, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_LO, 
     1421+            SSB_SPROM2_MAXP_A_LO_SHIFT); 
     1422+} 
     1423+ 
     1424 static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in) 
     1425 { 
     1426-       int i; 
     1427-       u16 v; 
    1921428-       s8 gain; 
    1931429        u16 loc[3]; 
    1941430  
    1951431        if (out->revision == 3)                 /* rev 3 moved MAC */ 
    196 @@ -361,8 +372,9 @@ static void sprom_extract_r123(struct ss 
     1432@@ -341,19 +373,10 @@ static void sprom_extract_r123(struct ss 
     1433                loc[1] = SSB_SPROM1_ET0MAC; 
     1434                loc[2] = SSB_SPROM1_ET1MAC; 
     1435        } 
     1436-       for (i = 0; i < 3; i++) { 
     1437-               v = in[SPOFF(loc[0]) + i]; 
     1438-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); 
     1439-       } 
     1440+       sprom_get_mac(out->il0mac, &in[SPOFF(loc[0])]); 
     1441        if (out->revision < 3) {        /* only rev 1-2 have et0, et1 */ 
     1442-               for (i = 0; i < 3; i++) { 
     1443-                       v = in[SPOFF(loc[1]) + i]; 
     1444-                       *(((__be16 *)out->et0mac) + i) = cpu_to_be16(v); 
     1445-               } 
     1446-               for (i = 0; i < 3; i++) { 
     1447-                       v = in[SPOFF(loc[2]) + i]; 
     1448-                       *(((__be16 *)out->et1mac) + i) = cpu_to_be16(v); 
     1449-               } 
     1450+               sprom_get_mac(out->et0mac, &in[SPOFF(loc[1])]); 
     1451+               sprom_get_mac(out->et1mac, &in[SPOFF(loc[2])]); 
     1452        } 
     1453        SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0); 
     1454        SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A, 
     1455@@ -361,8 +384,10 @@ static void sprom_extract_r123(struct ss 
    1971456        SPEX(et0mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0M, 14); 
    1981457        SPEX(et1mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1M, 15); 
     
    2001459-       SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE, 
    2011460-            SSB_SPROM1_BINF_CCODE_SHIFT); 
     1461+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); 
    2021462+       if (out->revision == 1) 
    2031463+               SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE, 
     
    2061466             SSB_SPROM1_BINF_ANTA_SHIFT); 
    2071467        SPEX(ant_available_bg, SSB_SPROM1_BINF, SSB_SPROM1_BINF_ANTBG, 
    208 @@ -388,22 +400,16 @@ static void sprom_extract_r123(struct ss 
     1468@@ -386,24 +411,19 @@ static void sprom_extract_r123(struct ss 
     1469             SSB_SPROM1_ITSSI_A_SHIFT); 
     1470        SPEX(itssi_bg, SSB_SPROM1_ITSSI, SSB_SPROM1_ITSSI_BG, 0); 
    2091471        SPEX(boardflags_lo, SSB_SPROM1_BFLLO, 0xFFFF, 0); 
    210         if (out->revision >= 2) 
    211                 SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); 
     1472-       if (out->revision >= 2) 
     1473-               SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0); 
     1474+ 
    2121475+       SPEX(alpha2[0], SSB_SPROM1_CCODE, 0xff00, 8); 
    2131476+       SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0); 
     
    2341497+                                                   SSB_SPROM1_AGAIN_A, 
    2351498+                                                   SSB_SPROM1_AGAIN_A_SHIFT); 
     1499+       if (out->revision >= 2) 
     1500+               sprom_extract_r23(out, in); 
    2361501 } 
    2371502  
    2381503 /* Revs 4 5 and 8 have partially shared layout */ 
    239 @@ -464,14 +470,17 @@ static void sprom_extract_r45(struct ssb 
     1504@@ -448,30 +468,30 @@ static void sprom_extract_r458(struct ss 
     1505  
     1506 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in) 
     1507 { 
     1508-       int i; 
     1509-       u16 v; 
     1510        u16 il0mac_offset; 
     1511  
     1512        if (out->revision == 4) 
     1513                il0mac_offset = SSB_SPROM4_IL0MAC; 
     1514        else 
     1515                il0mac_offset = SSB_SPROM5_IL0MAC; 
     1516-       /* extract the MAC address */ 
     1517-       for (i = 0; i < 3; i++) { 
     1518-               v = in[SPOFF(il0mac_offset) + i]; 
     1519-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); 
     1520-       } 
     1521+ 
     1522+       sprom_get_mac(out->il0mac, &in[SPOFF(il0mac_offset)]); 
     1523+ 
    2401524        SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0); 
    2411525        SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A, 
    2421526             SSB_SPROM4_ETHPHY_ET1A_SHIFT); 
    2431527+       SPEX(board_rev, SSB_SPROM4_BOARDREV, 0xFFFF, 0); 
     1528+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); 
    2441529        if (out->revision == 4) { 
    2451530-               SPEX(country_code, SSB_SPROM4_CCODE, 0xFFFF, 0); 
     
    2571542                SPEX(boardflags_hi, SSB_SPROM5_BFLHI, 0xFFFF, 0); 
    2581543                SPEX(boardflags2_lo, SSB_SPROM5_BFL2LO, 0xFFFF, 0); 
    259 @@ -504,16 +513,14 @@ static void sprom_extract_r45(struct ssb 
     1544@@ -504,16 +524,14 @@ static void sprom_extract_r45(struct ssb 
    2601545        } 
    2611546  
     
    2781563        sprom_extract_r458(out, in); 
    2791564  
    280 @@ -523,14 +530,22 @@ static void sprom_extract_r45(struct ssb 
     1565@@ -523,14 +541,21 @@ static void sprom_extract_r45(struct ssb 
    2811566 static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in) 
    2821567 { 
    2831568        int i; 
    2841569-       u16 v; 
    285 +       u16 v, o; 
     1570+       u16 o; 
    2861571+       u16 pwr_info_offset[] = { 
    2871572+               SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1, 
     
    2921577  
    2931578        /* extract the MAC address */ 
    294         for (i = 0; i < 3; i++) { 
    295                 v = in[SPOFF(SSB_SPROM8_IL0MAC) + i]; 
    296                 *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); 
    297         } 
     1579-       for (i = 0; i < 3; i++) { 
     1580-               v = in[SPOFF(SSB_SPROM8_IL0MAC) + i]; 
     1581-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v); 
     1582-       } 
    2981583-       SPEX(country_code, SSB_SPROM8_CCODE, 0xFFFF, 0); 
     1584+       sprom_get_mac(out->il0mac, &in[SPOFF(SSB_SPROM8_IL0MAC)]); 
     1585+ 
    2991586+       SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0); 
     1587+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0); 
    3001588+       SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8); 
    3011589+       SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0); 
     
    3031591        SPEX(boardflags_hi, SSB_SPROM8_BFLHI, 0xFFFF, 0); 
    3041592        SPEX(boardflags2_lo, SSB_SPROM8_BFL2LO, 0xFFFF, 0); 
    305 @@ -596,16 +611,46 @@ static void sprom_extract_r8(struct ssb_ 
     1593@@ -596,16 +621,46 @@ static void sprom_extract_r8(struct ssb_ 
    3061594        SPEX32(ofdm5ghpo, SSB_SPROM8_OFDM5GHPO, 0xFFFFFFFF, 0); 
    3071595  
     
    3561644        /* Extract FEM info */ 
    3571645        SPEX(fem.ghz2.tssipos, SSB_SPROM8_FEM2G, 
    358 @@ -630,6 +675,63 @@ static void sprom_extract_r8(struct ssb_ 
     1646@@ -630,6 +685,63 @@ static void sprom_extract_r8(struct ssb_ 
    3591647        SPEX(fem.ghz5.antswlut, SSB_SPROM8_FEM5G, 
    3601648                SSB_SROM8_FEM_ANTSWLUT, SSB_SROM8_FEM_ANTSWLUT_SHIFT); 
     
    4201708  
    4211709        /* TODO - get remaining rev 8 stuff needed */ 
    422 @@ -759,7 +861,6 @@ static void ssb_pci_get_boardinfo(struct 
     1710@@ -641,7 +753,7 @@ static int sprom_extract(struct ssb_bus 
     1711        memset(out, 0, sizeof(*out)); 
     1712  
     1713        out->revision = in[size - 1] & 0x00FF; 
     1714-       ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision); 
     1715+       ssb_dbg("SPROM revision %d detected\n", out->revision); 
     1716        memset(out->et0mac, 0xFF, 6);           /* preset et0 and et1 mac */ 
     1717        memset(out->et1mac, 0xFF, 6); 
     1718  
     1719@@ -650,7 +762,7 @@ static int sprom_extract(struct ssb_bus 
     1720                 * number stored in the SPROM. 
     1721                 * Always extract r1. */ 
     1722                out->revision = 1; 
     1723-               ssb_dprintk(KERN_DEBUG PFX "SPROM treated as revision %d\n", out->revision); 
     1724+               ssb_dbg("SPROM treated as revision %d\n", out->revision); 
     1725        } 
     1726  
     1727        switch (out->revision) { 
     1728@@ -667,9 +779,8 @@ static int sprom_extract(struct ssb_bus 
     1729                sprom_extract_r8(out, in); 
     1730                break; 
     1731        default: 
     1732-               ssb_printk(KERN_WARNING PFX "Unsupported SPROM" 
     1733-                          " revision %d detected. Will extract" 
     1734-                          " v1\n", out->revision); 
     1735+               ssb_warn("Unsupported SPROM revision %d detected. Will extract v1\n", 
     1736+                        out->revision); 
     1737                out->revision = 1; 
     1738                sprom_extract_r123(out, in); 
     1739        } 
     1740@@ -689,7 +800,7 @@ static int ssb_pci_sprom_get(struct ssb_ 
     1741        u16 *buf; 
     1742  
     1743        if (!ssb_is_sprom_available(bus)) { 
     1744-               ssb_printk(KERN_ERR PFX "No SPROM available!\n"); 
     1745+               ssb_err("No SPROM available!\n"); 
     1746                return -ENODEV; 
     1747        } 
     1748        if (bus->chipco.dev) {  /* can be unavailable! */ 
     1749@@ -708,7 +819,7 @@ static int ssb_pci_sprom_get(struct ssb_ 
     1750        } else { 
     1751                bus->sprom_offset = SSB_SPROM_BASE1; 
     1752        } 
     1753-       ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset); 
     1754+       ssb_dbg("SPROM offset is 0x%x\n", bus->sprom_offset); 
     1755  
     1756        buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); 
     1757        if (!buf) 
     1758@@ -733,18 +844,15 @@ static int ssb_pci_sprom_get(struct ssb_ 
     1759                         * available for this device in some other storage */ 
     1760                        err = ssb_fill_sprom_with_fallback(bus, sprom); 
     1761                        if (err) { 
     1762-                               ssb_printk(KERN_WARNING PFX "WARNING: Using" 
     1763-                                          " fallback SPROM failed (err %d)\n", 
     1764-                                          err); 
     1765+                               ssb_warn("WARNING: Using fallback SPROM failed (err %d)\n", 
     1766+                                        err); 
     1767                        } else { 
     1768-                               ssb_dprintk(KERN_DEBUG PFX "Using SPROM" 
     1769-                                           " revision %d provided by" 
     1770-                                           " platform.\n", sprom->revision); 
     1771+                               ssb_dbg("Using SPROM revision %d provided by platform\n", 
     1772+                                       sprom->revision); 
     1773                                err = 0; 
     1774                                goto out_free; 
     1775                        } 
     1776-                       ssb_printk(KERN_WARNING PFX "WARNING: Invalid" 
     1777-                                  " SPROM CRC (corrupt SPROM)\n"); 
     1778+                       ssb_warn("WARNING: Invalid SPROM CRC (corrupt SPROM)\n"); 
     1779                } 
     1780        } 
     1781        err = sprom_extract(bus, sprom, buf, bus->sprom_size); 
     1782@@ -759,7 +867,6 @@ static void ssb_pci_get_boardinfo(struct 
    4231783 { 
    4241784        bi->vendor = bus->host_pci->subsystem_vendor; 
     
    4301790--- a/drivers/ssb/pcmcia.c 
    4311791+++ b/drivers/ssb/pcmcia.c 
    432 @@ -676,14 +676,10 @@ static int ssb_pcmcia_do_get_invariants( 
     1792@@ -143,7 +143,7 @@ int ssb_pcmcia_switch_coreidx(struct ssb 
     1793  
     1794        return 0; 
     1795 error: 
     1796-       ssb_printk(KERN_ERR PFX "Failed to switch to core %u\n", coreidx); 
     1797+       ssb_err("Failed to switch to core %u\n", coreidx); 
     1798        return err; 
     1799 } 
     1800  
     1801@@ -153,10 +153,9 @@ int ssb_pcmcia_switch_core(struct ssb_bu 
     1802        int err; 
     1803  
     1804 #if SSB_VERBOSE_PCMCIACORESWITCH_DEBUG 
     1805-       ssb_printk(KERN_INFO PFX 
     1806-                  "Switching to %s core, index %d\n", 
     1807-                  ssb_core_name(dev->id.coreid), 
     1808-                  dev->core_index); 
     1809+       ssb_info("Switching to %s core, index %d\n", 
     1810+                ssb_core_name(dev->id.coreid), 
     1811+                dev->core_index); 
     1812 #endif 
     1813  
     1814        err = ssb_pcmcia_switch_coreidx(bus, dev->core_index); 
     1815@@ -192,7 +191,7 @@ int ssb_pcmcia_switch_segment(struct ssb 
     1816  
     1817        return 0; 
     1818 error: 
     1819-       ssb_printk(KERN_ERR PFX "Failed to switch pcmcia segment\n"); 
     1820+       ssb_err("Failed to switch pcmcia segment\n"); 
     1821        return err; 
     1822 } 
     1823  
     1824@@ -549,44 +548,39 @@ static int ssb_pcmcia_sprom_write_all(st 
     1825        bool failed = 0; 
     1826        size_t size = SSB_PCMCIA_SPROM_SIZE; 
     1827  
     1828-       ssb_printk(KERN_NOTICE PFX 
     1829-                  "Writing SPROM. Do NOT turn off the power! " 
     1830-                  "Please stand by...\n"); 
     1831+       ssb_notice("Writing SPROM. Do NOT turn off the power! Please stand by...\n"); 
     1832        err = ssb_pcmcia_sprom_command(bus, SSB_PCMCIA_SPROMCTL_WRITEEN); 
     1833        if (err) { 
     1834-               ssb_printk(KERN_NOTICE PFX 
     1835-                          "Could not enable SPROM write access.\n"); 
     1836+               ssb_notice("Could not enable SPROM write access\n"); 
     1837                return -EBUSY; 
     1838        } 
     1839-       ssb_printk(KERN_NOTICE PFX "[ 0%%"); 
     1840+       ssb_notice("[ 0%%"); 
     1841        msleep(500); 
     1842        for (i = 0; i < size; i++) { 
     1843                if (i == size / 4) 
     1844-                       ssb_printk("25%%"); 
     1845+                       ssb_cont("25%%"); 
     1846                else if (i == size / 2) 
     1847-                       ssb_printk("50%%"); 
     1848+                       ssb_cont("50%%"); 
     1849                else if (i == (size * 3) / 4) 
     1850-                       ssb_printk("75%%"); 
     1851+                       ssb_cont("75%%"); 
     1852                else if (i % 2) 
     1853-                       ssb_printk("."); 
     1854+                       ssb_cont("."); 
     1855                err = ssb_pcmcia_sprom_write(bus, i, sprom[i]); 
     1856                if (err) { 
     1857-                       ssb_printk(KERN_NOTICE PFX 
     1858-                                  "Failed to write to SPROM.\n"); 
     1859+                       ssb_notice("Failed to write to SPROM\n"); 
     1860                        failed = 1; 
     1861                        break; 
     1862                } 
     1863        } 
     1864        err = ssb_pcmcia_sprom_command(bus, SSB_PCMCIA_SPROMCTL_WRITEDIS); 
     1865        if (err) { 
     1866-               ssb_printk(KERN_NOTICE PFX 
     1867-                          "Could not disable SPROM write access.\n"); 
     1868+               ssb_notice("Could not disable SPROM write access\n"); 
     1869                failed = 1; 
     1870        } 
     1871        msleep(500); 
     1872        if (!failed) { 
     1873-               ssb_printk("100%% ]\n"); 
     1874-               ssb_printk(KERN_NOTICE PFX "SPROM written.\n"); 
     1875+               ssb_cont("100%% ]\n"); 
     1876+               ssb_notice("SPROM written\n"); 
     1877        } 
     1878  
     1879        return failed ? -EBUSY : 0; 
     1880@@ -676,14 +670,10 @@ static int ssb_pcmcia_do_get_invariants( 
    4331881        case SSB_PCMCIA_CIS_ANTGAIN: 
    4341882                GOTO_ERROR_ON(tuple->TupleDataLen != 2, 
     
    4491897        case SSB_PCMCIA_CIS_BFLAGS: 
    4501898                GOTO_ERROR_ON((tuple->TupleDataLen != 3) && 
     1899@@ -704,7 +694,7 @@ static int ssb_pcmcia_do_get_invariants( 
     1900        return -ENOSPC; /* continue with next entry */ 
     1901  
     1902 error: 
     1903-       ssb_printk(KERN_ERR PFX 
     1904+       ssb_err( 
     1905                   "PCMCIA: Failed to fetch device invariants: %s\n", 
     1906                   error_description); 
     1907        return -ENODEV; 
     1908@@ -726,7 +716,7 @@ int ssb_pcmcia_get_invariants(struct ssb 
     1909        res = pcmcia_loop_tuple(bus->host_pcmcia, CISTPL_FUNCE, 
     1910                                ssb_pcmcia_get_mac, sprom); 
     1911        if (res != 0) { 
     1912-               ssb_printk(KERN_ERR PFX 
     1913+               ssb_err( 
     1914                        "PCMCIA: Failed to fetch MAC address\n"); 
     1915                return -ENODEV; 
     1916        } 
     1917@@ -737,7 +727,7 @@ int ssb_pcmcia_get_invariants(struct ssb 
     1918        if ((res == 0) || (res == -ENOSPC)) 
     1919                return 0; 
     1920  
     1921-       ssb_printk(KERN_ERR PFX 
     1922+       ssb_err( 
     1923                        "PCMCIA: Failed to fetch device invariants\n"); 
     1924        return -ENODEV; 
     1925 } 
     1926@@ -847,6 +837,6 @@ int ssb_pcmcia_init(struct ssb_bus *bus) 
     1927  
     1928        return 0; 
     1929 error: 
     1930-       ssb_printk(KERN_ERR PFX "Failed to initialize PCMCIA host device\n"); 
     1931+       ssb_err("Failed to initialize PCMCIA host device\n"); 
     1932        return err; 
     1933 } 
    4511934--- a/drivers/ssb/scan.c 
    4521935+++ b/drivers/ssb/scan.c 
     
    4601943        return "UNKNOWN"; 
    4611944 } 
    462 @@ -318,6 +320,9 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     1945@@ -123,8 +125,7 @@ static u16 pcidev_to_chipid(struct pci_d 
     1946                chipid_fallback = 0x4401; 
     1947                break; 
     1948        default: 
     1949-               ssb_printk(KERN_ERR PFX 
     1950-                          "PCI-ID not in fallback list\n"); 
     1951+               ssb_err("PCI-ID not in fallback list\n"); 
     1952        } 
     1953  
     1954        return chipid_fallback; 
     1955@@ -150,8 +151,7 @@ static u8 chipid_to_nrcores(u16 chipid) 
     1956        case 0x4704: 
     1957                return 9; 
     1958        default: 
     1959-               ssb_printk(KERN_ERR PFX 
     1960-                          "CHIPID not in nrcores fallback list\n"); 
     1961+               ssb_err("CHIPID not in nrcores fallback list\n"); 
     1962        } 
     1963  
     1964        return 1; 
     1965@@ -318,12 +318,13 @@ int ssb_bus_scan(struct ssb_bus *bus, 
    4631966                        bus->chip_package = 0; 
    4641967                } 
    4651968        } 
    466 +       ssb_printk(KERN_INFO PFX "Found chip with id 0x%04X, rev 0x%02X and " 
    467 +                  "package 0x%02X\n", bus->chip_id, bus->chip_rev, 
    468 +                  bus->chip_package); 
     1969+       ssb_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n", 
     1970+                bus->chip_id, bus->chip_rev, bus->chip_package); 
    4691971        if (!bus->nr_devices) 
    4701972                bus->nr_devices = chipid_to_nrcores(bus->chip_id); 
    4711973        if (bus->nr_devices > ARRAY_SIZE(bus->devices)) { 
     1974-               ssb_printk(KERN_ERR PFX 
     1975-                          "More than %d ssb cores found (%d)\n", 
     1976-                          SSB_MAX_NR_CORES, bus->nr_devices); 
     1977+               ssb_err("More than %d ssb cores found (%d)\n", 
     1978+                       SSB_MAX_NR_CORES, bus->nr_devices); 
     1979                goto err_unmap; 
     1980        } 
     1981        if (bus->bustype == SSB_BUSTYPE_SSB) { 
     1982@@ -365,8 +366,7 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     1983                        nr_80211_cores++; 
     1984                        if (nr_80211_cores > 1) { 
     1985                                if (!we_support_multiple_80211_cores(bus)) { 
     1986-                                       ssb_dprintk(KERN_INFO PFX "Ignoring additional " 
     1987-                                                   "802.11 core\n"); 
     1988+                                       ssb_dbg("Ignoring additional 802.11 core\n"); 
     1989                                        continue; 
     1990                                } 
     1991                        } 
     1992@@ -374,8 +374,7 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     1993                case SSB_DEV_EXTIF: 
     1994 #ifdef CONFIG_SSB_DRIVER_EXTIF 
     1995                        if (bus->extif.dev) { 
     1996-                               ssb_printk(KERN_WARNING PFX 
     1997-                                          "WARNING: Multiple EXTIFs found\n"); 
     1998+                               ssb_warn("WARNING: Multiple EXTIFs found\n"); 
     1999                                break; 
     2000                        } 
     2001                        bus->extif.dev = dev; 
     2002@@ -383,8 +382,7 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     2003                        break; 
     2004                case SSB_DEV_CHIPCOMMON: 
     2005                        if (bus->chipco.dev) { 
     2006-                               ssb_printk(KERN_WARNING PFX 
     2007-                                          "WARNING: Multiple ChipCommon found\n"); 
     2008+                               ssb_warn("WARNING: Multiple ChipCommon found\n"); 
     2009                                break; 
     2010                        } 
     2011                        bus->chipco.dev = dev; 
     2012@@ -393,8 +391,7 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     2013                case SSB_DEV_MIPS_3302: 
     2014 #ifdef CONFIG_SSB_DRIVER_MIPS 
     2015                        if (bus->mipscore.dev) { 
     2016-                               ssb_printk(KERN_WARNING PFX 
     2017-                                          "WARNING: Multiple MIPS cores found\n"); 
     2018+                               ssb_warn("WARNING: Multiple MIPS cores found\n"); 
     2019                                break; 
     2020                        } 
     2021                        bus->mipscore.dev = dev; 
     2022@@ -415,8 +412,7 @@ int ssb_bus_scan(struct ssb_bus *bus, 
     2023                                } 
     2024                        } 
     2025                        if (bus->pcicore.dev) { 
     2026-                               ssb_printk(KERN_WARNING PFX 
     2027-                                          "WARNING: Multiple PCI(E) cores found\n"); 
     2028+                               ssb_warn("WARNING: Multiple PCI(E) cores found\n"); 
     2029                                break; 
     2030                        } 
     2031                        bus->pcicore.dev = dev; 
    4722032--- a/drivers/ssb/sdio.c 
    4732033+++ b/drivers/ssb/sdio.c 
     
    4912051                        case SSB_SDIO_CIS_BFLAGS: 
    4922052                                GOTO_ERROR_ON((tuple->size != 3) && 
     2053--- a/drivers/ssb/sprom.c 
     2054+++ b/drivers/ssb/sprom.c 
     2055@@ -127,13 +127,13 @@ ssize_t ssb_attr_sprom_store(struct ssb_ 
     2056                goto out_kfree; 
     2057        err = ssb_devices_freeze(bus, &freeze); 
     2058        if (err) { 
     2059-               ssb_printk(KERN_ERR PFX "SPROM write: Could not freeze all devices\n"); 
     2060+               ssb_err("SPROM write: Could not freeze all devices\n"); 
     2061                goto out_unlock; 
     2062        } 
     2063        res = sprom_write(bus, sprom); 
     2064        err = ssb_devices_thaw(&freeze); 
     2065        if (err) 
     2066-               ssb_printk(KERN_ERR PFX "SPROM write: Could not thaw all devices\n"); 
     2067+               ssb_err("SPROM write: Could not thaw all devices\n"); 
     2068 out_unlock: 
     2069        mutex_unlock(&bus->sprom_mutex); 
     2070 out_kfree: 
    4932071--- a/drivers/ssb/ssb_private.h 
    4942072+++ b/drivers/ssb/ssb_private.h 
    495 @@ -207,4 +207,8 @@ static inline void b43_pci_ssb_bridge_ex 
     2073@@ -3,21 +3,33 @@ 
     2074  
     2075 #include <linux/ssb/ssb.h> 
     2076 #include <linux/types.h> 
     2077+#include <linux/bcm47xx_wdt.h> 
     2078  
     2079  
     2080 #define PFX    "ssb: " 
     2081  
     2082 #ifdef CONFIG_SSB_SILENT 
     2083-# define ssb_printk(fmt, x...) do { /* nothing */ } while (0) 
     2084+# define ssb_printk(fmt, ...)                                  \ 
     2085+       do { if (0) printk(fmt, ##__VA_ARGS__); } while (0) 
     2086 #else 
     2087-# define ssb_printk            printk 
     2088+# define ssb_printk(fmt, ...)                                  \ 
     2089+       printk(fmt, ##__VA_ARGS__) 
     2090 #endif /* CONFIG_SSB_SILENT */ 
     2091  
     2092+#define ssb_emerg(fmt, ...)    ssb_printk(KERN_EMERG PFX fmt, ##__VA_ARGS__) 
     2093+#define ssb_err(fmt, ...)      ssb_printk(KERN_ERR PFX fmt, ##__VA_ARGS__) 
     2094+#define ssb_warn(fmt, ...)     ssb_printk(KERN_WARNING PFX fmt, ##__VA_ARGS__) 
     2095+#define ssb_notice(fmt, ...)   ssb_printk(KERN_NOTICE PFX fmt, ##__VA_ARGS__) 
     2096+#define ssb_info(fmt, ...)     ssb_printk(KERN_INFO PFX fmt, ##__VA_ARGS__) 
     2097+#define ssb_cont(fmt, ...)     ssb_printk(KERN_CONT fmt, ##__VA_ARGS__) 
     2098+ 
     2099 /* dprintk: Debugging printk; vanishes for non-debug compilation */ 
     2100 #ifdef CONFIG_SSB_DEBUG 
     2101-# define ssb_dprintk(fmt, x...)        ssb_printk(fmt , ##x) 
     2102+# define ssb_dbg(fmt, ...)                                     \ 
     2103+       ssb_printk(KERN_DEBUG PFX fmt, ##__VA_ARGS__) 
     2104 #else 
     2105-# define ssb_dprintk(fmt, x...)        do { /* nothing */ } while (0) 
     2106+# define ssb_dbg(fmt, ...)                                     \ 
     2107+       do { if (0) printk(KERN_DEBUG PFX fmt, ##__VA_ARGS__); } while (0) 
     2108 #endif 
     2109  
     2110 #ifdef CONFIG_SSB_DEBUG 
     2111@@ -207,4 +219,60 @@ static inline void b43_pci_ssb_bridge_ex 
    4962112 } 
    4972113 #endif /* CONFIG_SSB_B43_PCI_BRIDGE */ 
     
    5002116+extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc); 
    5012117+extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc); 
     2118+extern u32 ssb_pmu_get_alp_clock(struct ssb_chipcommon *cc); 
     2119+ 
     2120+extern u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, 
     2121+                                            u32 ticks); 
     2122+extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms); 
     2123+ 
     2124+#ifdef CONFIG_SSB_DRIVER_EXTIF 
     2125+extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks); 
     2126+extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms); 
     2127+#else 
     2128+static inline u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, 
     2129+                                                  u32 ticks) 
     2130+{ 
     2131+       return 0; 
     2132+} 
     2133+static inline u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, 
     2134+                                                 u32 ms) 
     2135+{ 
     2136+       return 0; 
     2137+} 
     2138+#endif 
     2139+ 
     2140+#ifdef CONFIG_SSB_EMBEDDED 
     2141+extern int ssb_watchdog_register(struct ssb_bus *bus); 
     2142+#else /* CONFIG_SSB_EMBEDDED */ 
     2143+static inline int ssb_watchdog_register(struct ssb_bus *bus) 
     2144+{ 
     2145+       return 0; 
     2146+} 
     2147+#endif /* CONFIG_SSB_EMBEDDED */ 
     2148+ 
     2149+#ifdef CONFIG_SSB_DRIVER_EXTIF 
     2150+extern void ssb_extif_init(struct ssb_extif *extif); 
     2151+#else 
     2152+static inline void ssb_extif_init(struct ssb_extif *extif) 
     2153+{ 
     2154+} 
     2155+#endif 
     2156+ 
     2157+#ifdef CONFIG_SSB_DRIVER_GPIO 
     2158+extern int ssb_gpio_init(struct ssb_bus *bus); 
     2159+extern int ssb_gpio_unregister(struct ssb_bus *bus); 
     2160+#else /* CONFIG_SSB_DRIVER_GPIO */ 
     2161+static inline int ssb_gpio_init(struct ssb_bus *bus) 
     2162+{ 
     2163+       return -ENOTSUPP; 
     2164+} 
     2165+static inline int ssb_gpio_unregister(struct ssb_bus *bus) 
     2166+{ 
     2167+       return 0; 
     2168+} 
     2169+#endif /* CONFIG_SSB_DRIVER_GPIO */ 
    5022170+ 
    5032171 #endif /* LINUX_SSB_PRIVATE_H_ */ 
    5042172--- a/include/linux/ssb/ssb.h 
    5052173+++ b/include/linux/ssb/ssb.h 
    506 @@ -16,6 +16,12 @@ struct pcmcia_device; 
     2174@@ -6,8 +6,10 @@ 
     2175 #include <linux/types.h> 
     2176 #include <linux/spinlock.h> 
     2177 #include <linux/pci.h> 
     2178+#include <linux/gpio.h> 
     2179 #include <linux/mod_devicetable.h> 
     2180 #include <linux/dma-mapping.h> 
     2181+#include <linux/platform_device.h> 
     2182  
     2183 #include <linux/ssb/ssb_regs.h> 
     2184  
     2185@@ -16,19 +18,28 @@ struct pcmcia_device; 
    5072186 struct ssb_bus; 
    5082187 struct ssb_driver; 
     
    5162195 struct ssb_sprom { 
    5172196        u8 revision; 
    518         u8 il0mac[6];           /* MAC address for 802.11b/g */ 
    519 @@ -26,9 +32,12 @@ struct ssb_sprom { 
     2197-       u8 il0mac[6];           /* MAC address for 802.11b/g */ 
     2198-       u8 et0mac[6];           /* MAC address for Ethernet */ 
     2199-       u8 et1mac[6];           /* MAC address for 802.11a */ 
     2200+       u8 il0mac[6] __aligned(sizeof(u16));    /* MAC address for 802.11b/g */ 
     2201+       u8 et0mac[6] __aligned(sizeof(u16));    /* MAC address for Ethernet */ 
     2202+       u8 et1mac[6] __aligned(sizeof(u16));    /* MAC address for 802.11a */ 
     2203        u8 et0phyaddr;          /* MII address for enet0 */ 
     2204        u8 et1phyaddr;          /* MII address for enet1 */ 
    5202205        u8 et0mdcport;          /* MDIO for enet0 */ 
    5212206        u8 et1mdcport;          /* MDIO for enet1 */ 
     
    5322217        u8 ant_available_bg;    /* 5GHz antenna available bits (up to 4) */ 
    5332218        u16 pa0b0; 
    534 @@ -47,10 +56,10 @@ struct ssb_sprom { 
     2219@@ -47,10 +58,10 @@ struct ssb_sprom { 
    5352220        u8 gpio1;               /* GPIO pin 1 */ 
    5362221        u8 gpio2;               /* GPIO pin 2 */ 
     
    5472232        u8 itssi_bg;            /* Idle TSSI Target for B/G-PHY */ 
    5482233        u8 tri2g;               /* 2.4GHz TX isolation */ 
    549 @@ -61,8 +70,8 @@ struct ssb_sprom { 
     2234@@ -61,8 +72,8 @@ struct ssb_sprom { 
    5502235        u8 txpid5gl[4];         /* 4.9 - 5.1GHz TX power index */ 
    5512236        u8 txpid5g[4];          /* 5.1 - 5.5GHz TX power index */ 
     
    5582243        u8 rssismc2g; 
    5592244        u8 rssismf2g; 
    560 @@ -82,16 +91,13 @@ struct ssb_sprom { 
     2245@@ -82,16 +93,13 @@ struct ssb_sprom { 
    5612246        u16 boardflags2_hi;     /* Board flags (bits 48-63) */ 
    5622247        /* TODO store board flags in a single u64 */ 
     
    5782263  
    5792264        struct { 
    580 @@ -103,14 +109,85 @@ struct ssb_sprom { 
     2265@@ -103,14 +111,85 @@ struct ssb_sprom { 
    5812266                } ghz5; 
    5822267        } fem; 
     
    6662351  
    6672352  
    668 @@ -166,6 +243,7 @@ struct ssb_bus_ops { 
     2353@@ -166,6 +245,7 @@ struct ssb_bus_ops { 
    6692354 #define SSB_DEV_MINI_MACPHY    0x823 
    6702355 #define SSB_DEV_ARM_1176       0x824 
     
    6742359 /* Vendor-ID values */ 
    6752360 #define SSB_VENDOR_BROADCOM    0x4243 
     2361@@ -260,13 +340,61 @@ enum ssb_bustype { 
     2362 #define SSB_BOARDVENDOR_DELL   0x1028  /* Dell */ 
     2363 #define SSB_BOARDVENDOR_HP     0x0E11  /* HP */ 
     2364 /* board_type */ 
     2365+#define SSB_BOARD_BCM94301CB   0x0406 
     2366+#define SSB_BOARD_BCM94301MP   0x0407 
     2367+#define SSB_BOARD_BU4309       0x040A 
     2368+#define SSB_BOARD_BCM94309CB   0x040B 
     2369+#define SSB_BOARD_BCM4309MP    0x040C 
     2370+#define SSB_BOARD_BU4306       0x0416 
     2371 #define SSB_BOARD_BCM94306MP   0x0418 
     2372 #define SSB_BOARD_BCM4309G     0x0421 
     2373 #define SSB_BOARD_BCM4306CB    0x0417 
     2374-#define SSB_BOARD_BCM4309MP    0x040C 
     2375+#define SSB_BOARD_BCM94306PC   0x0425  /* pcmcia 3.3v 4306 card */ 
     2376+#define SSB_BOARD_BCM94306CBSG 0x042B  /* with SiGe PA */ 
     2377+#define SSB_BOARD_PCSG94306    0x042D  /* with SiGe PA */ 
     2378+#define SSB_BOARD_BU4704SD     0x042E  /* with sdram */ 
     2379+#define SSB_BOARD_BCM94704AGR  0x042F  /* dual 11a/11g Router */ 
     2380+#define SSB_BOARD_BCM94308MP   0x0430  /* 11a-only minipci */ 
     2381+#define SSB_BOARD_BU4318       0x0447 
     2382+#define SSB_BOARD_CB4318       0x0448 
     2383+#define SSB_BOARD_MPG4318      0x0449 
     2384 #define SSB_BOARD_MP4318       0x044A 
     2385-#define SSB_BOARD_BU4306       0x0416 
     2386-#define SSB_BOARD_BU4309       0x040A 
     2387+#define SSB_BOARD_SD4318       0x044B 
     2388+#define SSB_BOARD_BCM94306P    0x044C  /* with SiGe */ 
     2389+#define SSB_BOARD_BCM94303MP   0x044E 
     2390+#define SSB_BOARD_BCM94306MPM  0x0450 
     2391+#define SSB_BOARD_BCM94306MPL  0x0453 
     2392+#define SSB_BOARD_PC4303       0x0454  /* pcmcia */ 
     2393+#define SSB_BOARD_BCM94306MPLNA        0x0457 
     2394+#define SSB_BOARD_BCM94306MPH  0x045B 
     2395+#define SSB_BOARD_BCM94306PCIV 0x045C 
     2396+#define SSB_BOARD_BCM94318MPGH 0x0463 
     2397+#define SSB_BOARD_BU4311       0x0464 
     2398+#define SSB_BOARD_BCM94311MC   0x0465 
     2399+#define SSB_BOARD_BCM94311MCAG 0x0466 
     2400+/* 4321 boards */ 
     2401+#define SSB_BOARD_BU4321       0x046B 
     2402+#define SSB_BOARD_BU4321E      0x047C 
     2403+#define SSB_BOARD_MP4321       0x046C 
     2404+#define SSB_BOARD_CB2_4321     0x046D 
     2405+#define SSB_BOARD_CB2_4321_AG  0x0066 
     2406+#define SSB_BOARD_MC4321       0x046E 
     2407+/* 4325 boards */ 
     2408+#define SSB_BOARD_BCM94325DEVBU        0x0490 
     2409+#define SSB_BOARD_BCM94325BGABU        0x0491 
     2410+#define SSB_BOARD_BCM94325SDGWB        0x0492 
     2411+#define SSB_BOARD_BCM94325SDGMDL       0x04AA 
     2412+#define SSB_BOARD_BCM94325SDGMDL2      0x04C6 
     2413+#define SSB_BOARD_BCM94325SDGMDL3      0x04C9 
     2414+#define SSB_BOARD_BCM94325SDABGWBA     0x04E1 
     2415+/* 4322 boards */ 
     2416+#define SSB_BOARD_BCM94322MC   0x04A4 
     2417+#define SSB_BOARD_BCM94322USB  0x04A8  /* dualband */ 
     2418+#define SSB_BOARD_BCM94322HM   0x04B0 
     2419+#define SSB_BOARD_BCM94322USB2D        0x04Bf  /* single band discrete front end */ 
     2420+/* 4312 boards */ 
     2421+#define SSB_BOARD_BU4312       0x048A 
     2422+#define SSB_BOARD_BCM4312MCGSG 0x04B5 
     2423 /* chip_package */ 
     2424 #define SSB_CHIPPACK_BCM4712S  1       /* Small 200pin 4712 */ 
     2425 #define SSB_CHIPPACK_BCM4712M  2       /* Medium 225pin 4712 */ 
     2426@@ -354,7 +482,11 @@ struct ssb_bus { 
     2427 #ifdef CONFIG_SSB_EMBEDDED 
     2428        /* Lock for GPIO register access. */ 
     2429        spinlock_t gpio_lock; 
     2430+       struct platform_device *watchdog; 
     2431 #endif /* EMBEDDED */ 
     2432+#ifdef CONFIG_SSB_DRIVER_GPIO 
     2433+       struct gpio_chip gpio; 
     2434+#endif /* DRIVER_GPIO */ 
     2435  
     2436        /* Internal-only stuff follows. Do not touch. */ 
     2437        struct list_head list; 
     2438--- a/include/linux/ssb/ssb_driver_chipcommon.h 
     2439+++ b/include/linux/ssb/ssb_driver_chipcommon.h 
     2440@@ -219,6 +219,7 @@ 
     2441 #define SSB_CHIPCO_PMU_CTL                     0x0600 /* PMU control */ 
     2442 #define  SSB_CHIPCO_PMU_CTL_ILP_DIV            0xFFFF0000 /* ILP div mask */ 
     2443 #define  SSB_CHIPCO_PMU_CTL_ILP_DIV_SHIFT      16 
     2444+#define  SSB_CHIPCO_PMU_CTL_PLL_UPD            0x00000400 
     2445 #define  SSB_CHIPCO_PMU_CTL_NOILPONW           0x00000200 /* No ILP on wait */ 
     2446 #define  SSB_CHIPCO_PMU_CTL_HTREQEN            0x00000100 /* HT req enable */ 
     2447 #define  SSB_CHIPCO_PMU_CTL_ALPREQEN           0x00000080 /* ALP req enable */ 
     2448@@ -588,7 +589,10 @@ struct ssb_chipcommon { 
     2449        u32 status; 
     2450        /* Fast Powerup Delay constant */ 
     2451        u16 fast_pwrup_delay; 
     2452+       spinlock_t gpio_lock; 
     2453        struct ssb_chipcommon_pmu pmu; 
     2454+       u32 ticks_per_ms; 
     2455+       u32 max_timer_ms; 
     2456 }; 
     2457  
     2458 static inline bool ssb_chipco_available(struct ssb_chipcommon *cc) 
     2459@@ -628,8 +632,7 @@ enum ssb_clkmode { 
     2460 extern void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc, 
     2461                                     enum ssb_clkmode mode); 
     2462  
     2463-extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, 
     2464-                                         u32 ticks); 
     2465+extern u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks); 
     2466  
     2467 void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2468  
     2469@@ -642,6 +645,8 @@ u32 ssb_chipco_gpio_outen(struct ssb_chi 
     2470 u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2471 u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2472 u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2473+u32 ssb_chipco_gpio_pullup(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2474+u32 ssb_chipco_gpio_pulldown(struct ssb_chipcommon *cc, u32 mask, u32 value); 
     2475  
     2476 #ifdef CONFIG_SSB_SERIAL 
     2477 extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc, 
     2478@@ -661,5 +666,6 @@ enum ssb_pmu_ldo_volt_id { 
     2479 void ssb_pmu_set_ldo_voltage(struct ssb_chipcommon *cc, 
     2480                             enum ssb_pmu_ldo_volt_id id, u32 voltage); 
     2481 void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on); 
     2482+void ssb_pmu_spuravoid_pllupdate(struct ssb_chipcommon *cc, int spuravoid); 
     2483  
     2484 #endif /* LINUX_SSB_CHIPCO_H_ */ 
     2485--- a/include/linux/ssb/ssb_driver_extif.h 
     2486+++ b/include/linux/ssb/ssb_driver_extif.h 
     2487@@ -152,12 +152,16 @@ 
     2488 /* watchdog */ 
     2489 #define SSB_EXTIF_WATCHDOG_CLK         48000000        /* Hz */ 
     2490  
     2491+#define SSB_EXTIF_WATCHDOG_MAX_TIMER   ((1 << 28) - 1) 
     2492+#define SSB_EXTIF_WATCHDOG_MAX_TIMER_MS        (SSB_EXTIF_WATCHDOG_MAX_TIMER \ 
     2493+                                        / (SSB_EXTIF_WATCHDOG_CLK / 1000)) 
     2494  
     2495  
     2496 #ifdef CONFIG_SSB_DRIVER_EXTIF 
     2497  
     2498 struct ssb_extif { 
     2499        struct ssb_device *dev; 
     2500+       spinlock_t gpio_lock; 
     2501 }; 
     2502  
     2503 static inline bool ssb_extif_available(struct ssb_extif *extif) 
     2504@@ -171,8 +175,7 @@ extern void ssb_extif_get_clockcontrol(s 
     2505 extern void ssb_extif_timing_init(struct ssb_extif *extif, 
     2506                                  unsigned long ns); 
     2507  
     2508-extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, 
     2509-                                        u32 ticks); 
     2510+extern u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks); 
     2511  
     2512 /* Extif GPIO pin access */ 
     2513 u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask); 
     2514@@ -205,10 +208,52 @@ void ssb_extif_get_clockcontrol(struct s 
     2515 } 
     2516  
     2517 static inline 
     2518-void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, 
     2519-                                 u32 ticks) 
     2520+void ssb_extif_timing_init(struct ssb_extif *extif, unsigned long ns) 
     2521 { 
     2522 } 
     2523  
     2524+static inline 
     2525+u32 ssb_extif_watchdog_timer_set(struct ssb_extif *extif, u32 ticks) 
     2526+{ 
     2527+       return 0; 
     2528+} 
     2529+ 
     2530+static inline u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask) 
     2531+{ 
     2532+       return 0; 
     2533+} 
     2534+ 
     2535+static inline u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, 
     2536+                                    u32 value) 
     2537+{ 
     2538+       return 0; 
     2539+} 
     2540+ 
     2541+static inline u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, 
     2542+                                      u32 value) 
     2543+{ 
     2544+       return 0; 
     2545+} 
     2546+ 
     2547+static inline u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, 
     2548+                                         u32 value) 
     2549+{ 
     2550+       return 0; 
     2551+} 
     2552+ 
     2553+static inline u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, 
     2554+                                        u32 value) 
     2555+{ 
     2556+       return 0; 
     2557+} 
     2558+ 
     2559+#ifdef CONFIG_SSB_SERIAL 
     2560+static inline int ssb_extif_serial_init(struct ssb_extif *extif, 
     2561+                                       struct ssb_serial_port *ports) 
     2562+{ 
     2563+       return 0; 
     2564+} 
     2565+#endif /* CONFIG_SSB_SERIAL */ 
     2566+ 
     2567 #endif /* CONFIG_SSB_DRIVER_EXTIF */ 
     2568 #endif /* LINUX_SSB_EXTIFCORE_H_ */ 
    6762569--- a/include/linux/ssb/ssb_driver_gige.h 
    6772570+++ b/include/linux/ssb/ssb_driver_gige.h 
     
    6842577 #include <linux/spinlock.h> 
    6852578  
     2579@@ -96,21 +97,16 @@ static inline bool ssb_gige_must_flush_p 
     2580        return 0; 
     2581 } 
     2582  
     2583-#ifdef CONFIG_BCM47XX 
     2584-#include <asm/mach-bcm47xx/nvram.h> 
     2585 /* Get the device MAC address */ 
     2586-static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
     2587-{ 
     2588-       char buf[20]; 
     2589-       if (nvram_getenv("et0macaddr", buf, sizeof(buf)) < 0) 
     2590-               return; 
     2591-       nvram_parse_macaddr(buf, macaddr); 
     2592-} 
     2593-#else 
     2594-static inline void ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
     2595+static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
     2596 { 
     2597+       struct ssb_gige *dev = pdev_to_ssb_gige(pdev); 
     2598+       if (!dev) 
     2599+               return -ENODEV; 
     2600+ 
     2601+       memcpy(macaddr, dev->dev->bus->sprom.et0mac, 6); 
     2602+       return 0; 
     2603 } 
     2604-#endif 
     2605  
     2606 extern int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, 
     2607                                          struct pci_dev *pdev); 
     2608@@ -174,6 +170,10 @@ static inline bool ssb_gige_must_flush_p 
     2609 { 
     2610        return 0; 
     2611 } 
     2612+static inline int ssb_gige_get_macaddr(struct pci_dev *pdev, u8 *macaddr) 
     2613+{ 
     2614+       return -ENODEV; 
     2615+} 
     2616  
     2617 #endif /* CONFIG_SSB_DRIVER_GIGE */ 
     2618 #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ 
     2619--- a/include/linux/ssb/ssb_driver_mips.h 
     2620+++ b/include/linux/ssb/ssb_driver_mips.h 
     2621@@ -41,6 +41,11 @@ void ssb_mipscore_init(struct ssb_mipsco 
     2622 { 
     2623 } 
     2624  
     2625+static inline unsigned int ssb_mips_irq(struct ssb_device *dev) 
     2626+{ 
     2627+       return 0; 
     2628+} 
     2629+ 
     2630 #endif /* CONFIG_SSB_DRIVER_MIPS */ 
     2631  
     2632 #endif /* LINUX_SSB_MIPSCORE_H_ */ 
    6862633--- a/include/linux/ssb/ssb_regs.h 
    6872634+++ b/include/linux/ssb/ssb_regs.h 
    688 @@ -228,6 +228,7 @@ 
     2635@@ -172,6 +172,7 @@ 
     2636 #define SSB_SPROMSIZE_WORDS_R4         220 
     2637 #define SSB_SPROMSIZE_BYTES_R123       (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) 
     2638 #define SSB_SPROMSIZE_BYTES_R4         (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) 
     2639+#define SSB_SPROMSIZE_WORDS_R10                230 
     2640 #define SSB_SPROM_BASE1                        0x1000 
     2641 #define SSB_SPROM_BASE31               0x0800 
     2642 #define SSB_SPROM_REVISION             0x007E 
     2643@@ -228,6 +229,7 @@ 
    6892644 #define  SSB_SPROM1_AGAIN_BG_SHIFT     0 
    6902645 #define  SSB_SPROM1_AGAIN_A            0xFF00  /* A-PHY */ 
     
    6942649 /* SPROM Revision 2 (inherits from rev 1) */ 
    6952650 #define SSB_SPROM2_BFLHI               0x0038  /* Boardflags (high 16 bits) */ 
    696 @@ -267,6 +268,7 @@ 
     2651@@ -267,6 +269,7 @@ 
    6972652 #define  SSB_SPROM3_OFDMGPO            0x107A  /* G-PHY OFDM Power Offset (4 bytes, BigEndian) */ 
    6982653  
     
    7022657 #define SSB_SPROM4_BFLHI               0x0046  /* Board Flags Hi */ 
    7032658 #define SSB_SPROM4_BFL2LO              0x0048  /* Board flags 2 (low 16 bits) */ 
    704 @@ -389,6 +391,11 @@ 
     2659@@ -287,11 +290,11 @@ 
     2660 #define  SSB_SPROM4_ETHPHY_ET1A_SHIFT  5 
     2661 #define  SSB_SPROM4_ETHPHY_ET0M                (1<<14) /* MDIO for enet0 */ 
     2662 #define  SSB_SPROM4_ETHPHY_ET1M                (1<<15) /* MDIO for enet1 */ 
     2663-#define SSB_SPROM4_ANTAVAIL            0x005D  /* Antenna available bitfields */ 
     2664-#define  SSB_SPROM4_ANTAVAIL_A         0x00FF  /* A-PHY bitfield */ 
     2665-#define  SSB_SPROM4_ANTAVAIL_A_SHIFT   0 
     2666-#define  SSB_SPROM4_ANTAVAIL_BG                0xFF00  /* B-PHY and G-PHY bitfield */ 
     2667-#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT  8 
     2668+#define SSB_SPROM4_ANTAVAIL            0x005C  /* Antenna available bitfields */ 
     2669+#define  SSB_SPROM4_ANTAVAIL_BG                0x00FF  /* B-PHY and G-PHY bitfield */ 
     2670+#define  SSB_SPROM4_ANTAVAIL_BG_SHIFT  0 
     2671+#define  SSB_SPROM4_ANTAVAIL_A         0xFF00  /* A-PHY bitfield */ 
     2672+#define  SSB_SPROM4_ANTAVAIL_A_SHIFT   8 
     2673 #define SSB_SPROM4_AGAIN01             0x005E  /* Antenna Gain (in dBm Q5.2) */ 
     2674 #define  SSB_SPROM4_AGAIN0             0x00FF  /* Antenna 0 */ 
     2675 #define  SSB_SPROM4_AGAIN0_SHIFT       0 
     2676@@ -389,6 +392,11 @@ 
    7052677 #define  SSB_SPROM8_GPIOB_P2           0x00FF  /* Pin 2 */ 
    7062678 #define  SSB_SPROM8_GPIOB_P3           0xFF00  /* Pin 3 */ 
     
    7142686 #define  SSB_SPROM8_ANTAVAIL_A         0xFF00  /* A-PHY bitfield */ 
    7152687 #define  SSB_SPROM8_ANTAVAIL_A_SHIFT   8 
    716 @@ -404,6 +411,13 @@ 
     2688@@ -404,6 +412,13 @@ 
    7172689 #define  SSB_SPROM8_AGAIN2_SHIFT       0 
    7182690 #define  SSB_SPROM8_AGAIN3             0xFF00  /* Antenna 3 */ 
     
    7282700 #define  SSB_SPROM8_RSSISMF2G          0x000F 
    7292701 #define  SSB_SPROM8_RSSISMC2G          0x00F0 
    730 @@ -430,6 +444,7 @@ 
     2702@@ -430,6 +445,7 @@ 
    7312703 #define  SSB_SPROM8_TRI5GH_SHIFT       8 
    7322704 #define SSB_SPROM8_RXPO                        0x00AC  /* RX power offsets */ 
     
    7362708 #define  SSB_SPROM8_RXPO5G_SHIFT       8 
    7372709 #define SSB_SPROM8_FEM2G               0x00AE 
    738 @@ -445,10 +460,71 @@ 
     2710@@ -445,10 +461,71 @@ 
    7392711 #define  SSB_SROM8_FEM_ANTSWLUT                0xF800 
    7402712 #define  SSB_SROM8_FEM_ANTSWLUT_SHIFT  11 
     
    7692741+#define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL        0x0020 
    7702742+#define  SSB_SPROM8_HWIQ_IQSWP_HW_IQCAL_SHIFT  5 
    771 +#define SSB_SPROM8_TEMPDELTA           0x00BA 
     2743+#define SSB_SPROM8_TEMPDELTA           0x00BC 
    7722744+#define  SSB_SPROM8_TEMPDELTA_PHYCAL   0x00ff 
    7732745+#define  SSB_SPROM8_TEMPDELTA_PHYCAL_SHIFT     0 
     
    8122784 #define  SSB_SPROM8_MAXP_BG_MASK       0x00FF  /* Mask for Max Power 2GHz */ 
    8132785 #define  SSB_SPROM8_ITSSI_BG           0xFF00  /* Mask for path 1 itssi_bg */ 
    814 @@ -473,12 +549,23 @@ 
     2786@@ -473,12 +550,23 @@ 
    8152787 #define SSB_SPROM8_PA1HIB0             0x00D8  /* 5.8GHz power amp settings */ 
    8162788 #define SSB_SPROM8_PA1HIB1             0x00DA 
     
    8362808 #define SSB_BFL_BTCOEXIST              0x0001  /* implements Bluetooth coexistance */ 
    8372809 #define SSB_BFL_PACTRL                 0x0002  /* GPIO 9 controlling the PA */ 
     2810--- /dev/null 
     2811+++ b/include/linux/bcm47xx_wdt.h 
     2812@@ -0,0 +1,19 @@ 
     2813+#ifndef LINUX_BCM47XX_WDT_H_ 
     2814+#define LINUX_BCM47XX_WDT_H_ 
     2815+ 
     2816+#include <linux/types.h> 
     2817+ 
     2818+ 
     2819+struct bcm47xx_wdt { 
     2820+       u32 (*timer_set)(struct bcm47xx_wdt *, u32); 
     2821+       u32 (*timer_set_ms)(struct bcm47xx_wdt *, u32); 
     2822+       u32 max_timer_ms; 
     2823+ 
     2824+       void *driver_data; 
     2825+}; 
     2826+ 
     2827+static inline void *bcm47xx_wdt_get_drvdata(struct bcm47xx_wdt *wdt) 
     2828+{ 
     2829+       return wdt->driver_data; 
     2830+} 
     2831+#endif /* LINUX_BCM47XX_WDT_H_ */ 
     2832--- a/drivers/net/wireless/b43/phy_n.c 
     2833+++ b/drivers/net/wireless/b43/phy_n.c 
     2834@@ -4259,7 +4259,8 @@ static void b43_nphy_pmu_spur_avoid(stru 
     2835 #endif 
     2836 #ifdef CONFIG_B43_SSB 
     2837        case B43_BUS_SSB: 
     2838-               /* FIXME */ 
     2839+               ssb_pmu_spuravoid_pllupdate(&dev->dev->sdev->bus->chipco, 
     2840+                                           avoid); 
     2841                break; 
     2842 #endif 
     2843        } 
  • branches/attitude_adjustment/target/linux/generic/patches-3.3/025-bcma_backport.patch

    r32880 r37261  
     1--- a/arch/mips/bcm47xx/serial.c 
     2+++ b/arch/mips/bcm47xx/serial.c 
     3@@ -62,7 +62,7 @@ static int __init uart8250_init_bcma(voi 
     4  
     5                p->mapbase = (unsigned int) bcma_port->regs; 
     6                p->membase = (void *) bcma_port->regs; 
     7-               p->irq = bcma_port->irq + 2; 
     8+               p->irq = bcma_port->irq; 
     9                p->uartclk = bcma_port->baud_base; 
     10                p->regshift = bcma_port->reg_shift; 
     11                p->iotype = UPIO_MEM; 
     12--- a/arch/mips/bcm47xx/gpio.c 
     13+++ b/arch/mips/bcm47xx/gpio.c 
     14@@ -94,7 +94,7 @@ int gpio_to_irq(unsigned gpio) 
     15 #endif 
     16 #ifdef CONFIG_BCM47XX_BCMA 
     17        case BCM47XX_BUS_TYPE_BCMA: 
     18-               return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2; 
     19+               return bcma_core_irq(bcm47xx_bus.bcma.bus.drv_cc.core); 
     20 #endif 
     21        } 
     22        return -EINVAL; 
    123--- a/drivers/bcma/Kconfig 
    224+++ b/drivers/bcma/Kconfig 
    3 @@ -29,7 +29,7 @@ config BCMA_HOST_PCI 
     25@@ -26,10 +26,11 @@ config BCMA_HOST_PCI_POSSIBLE 
     26 config BCMA_HOST_PCI 
     27        bool "Support for BCMA on PCI-host bus" 
     28        depends on BCMA_HOST_PCI_POSSIBLE 
     29+       default y 
    430  
    531 config BCMA_DRIVER_PCI_HOSTMODE 
     
    1036          PCI core hostmode operation (external PCI bus). 
    1137  
    12 @@ -46,6 +46,15 @@ config BCMA_DRIVER_MIPS 
     38@@ -46,6 +47,23 @@ config BCMA_DRIVER_MIPS 
    1339  
    1440          If unsure, say N 
     
    2349+         If unsure, say N 
    2450+ 
     51+config BCMA_DRIVER_GPIO 
     52+       bool "BCMA GPIO driver" 
     53+       depends on BCMA && GPIOLIB 
     54+       help 
     55+         Driver to provide access to the GPIO pins of the bcma bus. 
     56+ 
     57+         If unsure, say N 
     58+ 
    2559 config BCMA_DEBUG 
    2660        bool "BCMA debugging" 
     
    2862--- a/drivers/bcma/Makefile 
    2963+++ b/drivers/bcma/Makefile 
    30 @@ -3,6 +3,7 @@ bcma-y                                  += driver_chipcommon.o driver 
     64@@ -3,6 +3,8 @@ bcma-y                                  += driver_chipcommon.o driver 
    3165 bcma-y                                 += driver_pci.o 
    3266 bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
    3367 bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
    3468+bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)    += driver_gmac_cmn.o 
     69+bcma-$(CONFIG_BCMA_DRIVER_GPIO)                += driver_gpio.o 
    3570 bcma-$(CONFIG_BCMA_HOST_PCI)           += host_pci.o 
    3671 bcma-$(CONFIG_BCMA_HOST_SOC)           += host_soc.o 
     
    3873--- a/drivers/bcma/bcma_private.h 
    3974+++ b/drivers/bcma/bcma_private.h 
    40 @@ -10,10 +10,19 @@ 
     75@@ -10,10 +10,21 @@ 
    4176  
    4277 #define BCMA_CORE_SIZE         0x1000 
     
    5590 /* main.c */ 
    5691-int bcma_bus_register(struct bcma_bus *bus); 
     92+bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value, 
     93+                    int timeout); 
    5794+int __devinit bcma_bus_register(struct bcma_bus *bus); 
    5895 void bcma_bus_unregister(struct bcma_bus *bus); 
    5996 int __init bcma_bus_early_register(struct bcma_bus *bus, 
    6097                                   struct bcma_device *core_cc, 
    61 @@ -48,8 +57,12 @@ extern int __init bcma_host_pci_init(voi 
     98@@ -22,6 +33,8 @@ int __init bcma_bus_early_register(struc 
     99 int bcma_bus_suspend(struct bcma_bus *bus); 
     100 int bcma_bus_resume(struct bcma_bus *bus); 
     101 #endif 
     102+struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid, 
     103+                                       u8 unit); 
     104  
     105 /* scan.c */ 
     106 int bcma_bus_scan(struct bcma_bus *bus); 
     107@@ -39,8 +52,8 @@ void bcma_chipco_serial_init(struct bcma 
     108 #endif /* CONFIG_BCMA_DRIVER_MIPS */ 
     109  
     110 /* driver_chipcommon_pmu.c */ 
     111-u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc); 
     112-u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc); 
     113+u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc); 
     114+u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc); 
     115  
     116 #ifdef CONFIG_BCMA_HOST_PCI 
     117 /* host_pci.c */ 
     118@@ -48,8 +61,29 @@ extern int __init bcma_host_pci_init(voi 
    62119 extern void __exit bcma_host_pci_exit(void); 
    63120 #endif /* CONFIG_BCMA_HOST_PCI */ 
     
    65122+/* driver_pci.c */ 
    66123+u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address); 
     124+ 
     125+extern int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc); 
    67126+ 
    68127 #ifdef CONFIG_BCMA_DRIVER_PCI_HOSTMODE 
     
    72131 #endif /* CONFIG_BCMA_DRIVER_PCI_HOSTMODE */ 
    73132  
     133+#ifdef CONFIG_BCMA_DRIVER_GPIO 
     134+/* driver_gpio.c */ 
     135+int bcma_gpio_init(struct bcma_drv_cc *cc); 
     136+int bcma_gpio_unregister(struct bcma_drv_cc *cc); 
     137+#else 
     138+static inline int bcma_gpio_init(struct bcma_drv_cc *cc) 
     139+{ 
     140+       return -ENOTSUPP; 
     141+} 
     142+static inline int bcma_gpio_unregister(struct bcma_drv_cc *cc) 
     143+{ 
     144+       return 0; 
     145+} 
     146+#endif /* CONFIG_BCMA_DRIVER_GPIO */ 
     147+ 
    74148 #endif 
    75149--- a/drivers/bcma/core.c 
    76150+++ b/drivers/bcma/core.c 
    77 @@ -30,6 +30,7 @@ void bcma_core_disable(struct bcma_devic 
    78         udelay(10); 
     151@@ -9,6 +9,25 @@ 
     152 #include <linux/export.h> 
     153 #include <linux/bcma/bcma.h> 
     154  
     155+static bool bcma_core_wait_value(struct bcma_device *core, u16 reg, u32 mask, 
     156+                                u32 value, int timeout) 
     157+{ 
     158+       unsigned long deadline = jiffies + timeout; 
     159+       u32 val; 
     160+ 
     161+       do { 
     162+               val = bcma_aread32(core, reg); 
     163+               if ((val & mask) == value) 
     164+                       return true; 
     165+               cpu_relax(); 
     166+               udelay(10); 
     167+       } while (!time_after_eq(jiffies, deadline)); 
     168+ 
     169+       bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg); 
     170+ 
     171+       return false; 
     172+} 
     173+ 
     174 bool bcma_core_is_enabled(struct bcma_device *core) 
     175 { 
     176        if ((bcma_aread32(core, BCMA_IOCTL) & (BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) 
     177@@ -25,12 +44,15 @@ void bcma_core_disable(struct bcma_devic 
     178        if (bcma_aread32(core, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET) 
     179                return; 
     180  
     181-       bcma_awrite32(core, BCMA_IOCTL, flags); 
     182-       bcma_aread32(core, BCMA_IOCTL); 
     183-       udelay(10); 
     184+       bcma_core_wait_value(core, BCMA_RESET_ST, ~0, 0, 300); 
    79185  
    80186        bcma_awrite32(core, BCMA_RESET_CTL, BCMA_RESET_CTL_RESET); 
    81187+       bcma_aread32(core, BCMA_RESET_CTL); 
    82188        udelay(1); 
     189+ 
     190+       bcma_awrite32(core, BCMA_IOCTL, flags); 
     191+       bcma_aread32(core, BCMA_IOCTL); 
     192+       udelay(10); 
    83193 } 
    84194 EXPORT_SYMBOL_GPL(bcma_core_disable); 
    85 @@ -74,10 +75,10 @@ void bcma_core_set_clockmode(struct bcma 
     195  
     196@@ -42,6 +64,7 @@ int bcma_core_enable(struct bcma_device 
     197        bcma_aread32(core, BCMA_IOCTL); 
     198  
     199        bcma_awrite32(core, BCMA_RESET_CTL, 0); 
     200+       bcma_aread32(core, BCMA_RESET_CTL); 
     201        udelay(1); 
     202  
     203        bcma_awrite32(core, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags)); 
     204@@ -64,7 +87,7 @@ void bcma_core_set_clockmode(struct bcma 
     205        switch (clkmode) { 
     206        case BCMA_CLKMODE_FAST: 
     207                bcma_set32(core, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); 
     208-               udelay(64); 
     209+               usleep_range(64, 300); 
     210                for (i = 0; i < 1500; i++) { 
     211                        if (bcma_read32(core, BCMA_CLKCTLST) & 
     212                            BCMA_CLKCTLST_HAVEHT) { 
     213@@ -74,10 +97,10 @@ void bcma_core_set_clockmode(struct bcma 
    86214                        udelay(10); 
    87215                } 
     
    96224        } 
    97225 } 
    98 @@ -101,9 +102,9 @@ void bcma_core_pll_ctl(struct bcma_devic 
     226@@ -101,9 +124,15 @@ void bcma_core_pll_ctl(struct bcma_devic 
    99227                        udelay(10); 
    100228                } 
     
    104232        } else { 
    105233-               pr_warn("Disabling PLL not supported yet!\n"); 
    106 +               bcma_warn(core->bus, "Disabling PLL not supported yet!\n"); 
     234+               /* 
     235+                * Mask the PLL but don't wait for it to be disabled. PLL may be 
     236+                * shared between cores and will be still up if there is another 
     237+                * core using it. 
     238+                */ 
     239+               bcma_mask32(core, BCMA_CLKCTLST, ~req); 
     240+               bcma_read32(core, BCMA_CLKCTLST); 
    107241        } 
    108242 } 
    109243 EXPORT_SYMBOL_GPL(bcma_core_pll_ctl); 
    110 @@ -119,8 +120,8 @@ u32 bcma_core_dma_translation(struct bcm 
     244@@ -119,8 +148,8 @@ u32 bcma_core_dma_translation(struct bcm 
    111245                else 
    112246                        return BCMA_DMA_TRANSLATION_DMA32_CMT; 
     
    121255--- a/drivers/bcma/driver_chipcommon.c 
    122256+++ b/drivers/bcma/driver_chipcommon.c 
    123 @@ -44,7 +44,7 @@ void bcma_core_chipcommon_init(struct bc 
     257@@ -4,12 +4,15 @@ 
     258  * 
     259  * Copyright 2005, Broadcom Corporation 
     260  * Copyright 2006, 2007, Michael Buesch <m@bues.ch> 
     261+ * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
     262  * 
     263  * Licensed under the GNU/GPL. See COPYING for details. 
     264  */ 
     265  
     266 #include "bcma_private.h" 
     267+#include <linux/bcm47xx_wdt.h> 
     268 #include <linux/export.h> 
     269+#include <linux/platform_device.h> 
     270 #include <linux/bcma/bcma.h> 
     271  
     272 static inline u32 bcma_cc_write32_masked(struct bcma_drv_cc *cc, u16 offset, 
     273@@ -22,29 +25,136 @@ static inline u32 bcma_cc_write32_masked 
     274        return value; 
     275 } 
     276  
     277-void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) 
     278+u32 bcma_chipco_get_alp_clock(struct bcma_drv_cc *cc) 
     279 { 
     280-       u32 leddc_on = 10; 
     281-       u32 leddc_off = 90; 
     282+       if (cc->capabilities & BCMA_CC_CAP_PMU) 
     283+               return bcma_pmu_get_alp_clock(cc); 
     284  
     285-       if (cc->setup_done) 
     286+       return 20000000; 
     287+} 
     288+EXPORT_SYMBOL_GPL(bcma_chipco_get_alp_clock); 
     289+ 
     290+static u32 bcma_chipco_watchdog_get_max_timer(struct bcma_drv_cc *cc) 
     291+{ 
     292+       struct bcma_bus *bus = cc->core->bus; 
     293+       u32 nb; 
     294+ 
     295+       if (cc->capabilities & BCMA_CC_CAP_PMU) { 
     296+               if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) 
     297+                       nb = 32; 
     298+               else if (cc->core->id.rev < 26) 
     299+                       nb = 16; 
     300+               else 
     301+                       nb = (cc->core->id.rev >= 37) ? 32 : 24; 
     302+       } else { 
     303+               nb = 28; 
     304+       } 
     305+       if (nb == 32) 
     306+               return 0xffffffff; 
     307+       else 
     308+               return (1 << nb) - 1; 
     309+} 
     310+ 
     311+static u32 bcma_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, 
     312+                                             u32 ticks) 
     313+{ 
     314+       struct bcma_drv_cc *cc = bcm47xx_wdt_get_drvdata(wdt); 
     315+ 
     316+       return bcma_chipco_watchdog_timer_set(cc, ticks); 
     317+} 
     318+ 
     319+static u32 bcma_chipco_watchdog_timer_set_ms_wdt(struct bcm47xx_wdt *wdt, 
     320+                                                u32 ms) 
     321+{ 
     322+       struct bcma_drv_cc *cc = bcm47xx_wdt_get_drvdata(wdt); 
     323+       u32 ticks; 
     324+ 
     325+       ticks = bcma_chipco_watchdog_timer_set(cc, cc->ticks_per_ms * ms); 
     326+       return ticks / cc->ticks_per_ms; 
     327+} 
     328+ 
     329+static int bcma_chipco_watchdog_ticks_per_ms(struct bcma_drv_cc *cc) 
     330+{ 
     331+       struct bcma_bus *bus = cc->core->bus; 
     332+ 
     333+       if (cc->capabilities & BCMA_CC_CAP_PMU) { 
     334+               if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4706) 
     335+                       /* 4706 CC and PMU watchdogs are clocked at 1/4 of ALP clock */ 
     336+                       return bcma_chipco_get_alp_clock(cc) / 4000; 
     337+               else 
     338+                       /* based on 32KHz ILP clock */ 
     339+                       return 32; 
     340+       } else { 
     341+               return bcma_chipco_get_alp_clock(cc) / 1000; 
     342+       } 
     343+} 
     344+ 
     345+int bcma_chipco_watchdog_register(struct bcma_drv_cc *cc) 
     346+{ 
     347+       struct bcm47xx_wdt wdt = {}; 
     348+       struct platform_device *pdev; 
     349+ 
     350+       wdt.driver_data = cc; 
     351+       wdt.timer_set = bcma_chipco_watchdog_timer_set_wdt; 
     352+       wdt.timer_set_ms = bcma_chipco_watchdog_timer_set_ms_wdt; 
     353+       wdt.max_timer_ms = bcma_chipco_watchdog_get_max_timer(cc) / cc->ticks_per_ms; 
     354+ 
     355+       pdev = platform_device_register_data(NULL, "bcm47xx-wdt", 
     356+                                            cc->core->bus->num, &wdt, 
     357+                                            sizeof(wdt)); 
     358+       if (IS_ERR(pdev)) 
     359+               return PTR_ERR(pdev); 
     360+ 
     361+       cc->watchdog = pdev; 
     362+ 
     363+       return 0; 
     364+} 
     365+ 
     366+void bcma_core_chipcommon_early_init(struct bcma_drv_cc *cc) 
     367+{ 
     368+       if (cc->early_setup_done) 
     369                return; 
     370  
     371+       spin_lock_init(&cc->gpio_lock); 
     372+ 
     373        if (cc->core->id.rev >= 11) 
     374                cc->status = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT); 
     375        cc->capabilities = bcma_cc_read32(cc, BCMA_CC_CAP); 
     376        if (cc->core->id.rev >= 35) 
     377                cc->capabilities_ext = bcma_cc_read32(cc, BCMA_CC_CAP_EXT); 
     378  
     379+       if (cc->capabilities & BCMA_CC_CAP_PMU) 
     380+               bcma_pmu_early_init(cc); 
     381+ 
     382+       cc->early_setup_done = true; 
     383+} 
     384+ 
     385+void bcma_core_chipcommon_init(struct bcma_drv_cc *cc) 
     386+{ 
     387+       u32 leddc_on = 10; 
     388+       u32 leddc_off = 90; 
     389+ 
     390+       if (cc->setup_done) 
     391+               return; 
     392+ 
     393+       bcma_core_chipcommon_early_init(cc); 
     394+ 
     395        if (cc->core->id.rev >= 20) { 
     396-               bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, 0); 
     397-               bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, 0); 
     398+               u32 pullup = 0, pulldown = 0; 
     399+ 
     400+               if (cc->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM43142) { 
     401+                       pullup = 0x402e0; 
     402+                       pulldown = 0x20500; 
     403+               } 
     404+ 
     405+               bcma_cc_write32(cc, BCMA_CC_GPIOPULLUP, pullup); 
     406+               bcma_cc_write32(cc, BCMA_CC_GPIOPULLDOWN, pulldown); 
     407        } 
     408  
    124409        if (cc->capabilities & BCMA_CC_CAP_PMU) 
    125410                bcma_pmu_init(cc); 
     
    130415        if (cc->core->id.rev >= 16) { 
    131416                if (cc->core->bus->sprom.leddc_on_time && 
    132 @@ -137,8 +137,7 @@ void bcma_chipco_serial_init(struct bcma 
     417@@ -56,15 +166,33 @@ void bcma_core_chipcommon_init(struct bc 
     418                        ((leddc_on << BCMA_CC_GPIOTIMER_ONTIME_SHIFT) | 
     419                         (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); 
     420        } 
     421+       cc->ticks_per_ms = bcma_chipco_watchdog_ticks_per_ms(cc); 
     422  
     423        cc->setup_done = true; 
     424 } 
     425  
     426 /* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */ 
     427-void bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks) 
     428+u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, u32 ticks) 
     429 { 
     430-       /* instant NMI */ 
     431-       bcma_cc_write32(cc, BCMA_CC_WATCHDOG, ticks); 
     432+       u32 maxt; 
     433+       enum bcma_clkmode clkmode; 
     434+ 
     435+       maxt = bcma_chipco_watchdog_get_max_timer(cc); 
     436+       if (cc->capabilities & BCMA_CC_CAP_PMU) { 
     437+               if (ticks == 1) 
     438+                       ticks = 2; 
     439+               else if (ticks > maxt) 
     440+                       ticks = maxt; 
     441+               bcma_cc_write32(cc, BCMA_CC_PMU_WATCHDOG, ticks); 
     442+       } else { 
     443+               clkmode = ticks ? BCMA_CLKMODE_FAST : BCMA_CLKMODE_DYNAMIC; 
     444+               bcma_core_set_clockmode(cc->core, clkmode); 
     445+               if (ticks > maxt) 
     446+                       ticks = maxt; 
     447+               /* instant NMI */ 
     448+               bcma_cc_write32(cc, BCMA_CC_WATCHDOG, ticks); 
     449+       } 
     450+       return ticks; 
     451 } 
     452  
     453 void bcma_chipco_irq_mask(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     454@@ -84,28 +212,99 @@ u32 bcma_chipco_gpio_in(struct bcma_drv_ 
     455  
     456 u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     457 { 
     458-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
     459+       unsigned long flags; 
     460+       u32 res; 
     461+ 
     462+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     463+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
     464+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     465+ 
     466+       return res; 
     467 } 
     468+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out); 
     469  
     470 u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     471 { 
     472-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
     473+       unsigned long flags; 
     474+       u32 res; 
     475+ 
     476+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     477+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
     478+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     479+ 
     480+       return res; 
     481 } 
     482+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen); 
     483  
     484+/* 
     485+ * If the bit is set to 0, chipcommon controlls this GPIO, 
     486+ * if the bit is set to 1, it is used by some part of the chip and not our code. 
     487+ */ 
     488 u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     489 { 
     490-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
     491+       unsigned long flags; 
     492+       u32 res; 
     493+ 
     494+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     495+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
     496+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     497+ 
     498+       return res; 
     499 } 
     500 EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control); 
     501  
     502 u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     503 { 
     504-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
     505+       unsigned long flags; 
     506+       u32 res; 
     507+ 
     508+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     509+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
     510+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     511+ 
     512+       return res; 
     513 } 
     514  
     515 u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     516 { 
     517-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
     518+       unsigned long flags; 
     519+       u32 res; 
     520+ 
     521+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     522+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
     523+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     524+ 
     525+       return res; 
     526+} 
     527+ 
     528+u32 bcma_chipco_gpio_pullup(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     529+{ 
     530+       unsigned long flags; 
     531+       u32 res; 
     532+ 
     533+       if (cc->core->id.rev < 20) 
     534+               return 0; 
     535+ 
     536+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     537+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPULLUP, mask, value); 
     538+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     539+ 
     540+       return res; 
     541+} 
     542+ 
     543+u32 bcma_chipco_gpio_pulldown(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     544+{ 
     545+       unsigned long flags; 
     546+       u32 res; 
     547+ 
     548+       if (cc->core->id.rev < 20) 
     549+               return 0; 
     550+ 
     551+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     552+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPULLDOWN, mask, value); 
     553+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
     554+ 
     555+       return res; 
     556 } 
     557  
     558 #ifdef CONFIG_BCMA_DRIVER_MIPS 
     559@@ -118,8 +317,7 @@ void bcma_chipco_serial_init(struct bcma 
     560        struct bcma_serial_port *ports = cc->serial_ports; 
     561  
     562        if (ccrev >= 11 && ccrev != 15) { 
     563-               /* Fixed ALP clock */ 
     564-               baud_base = bcma_pmu_alp_clock(cc); 
     565+               baud_base = bcma_chipco_get_alp_clock(cc); 
     566                if (ccrev >= 21) { 
     567                        /* Turn off UART clock before switching clocksource. */ 
     568                        bcma_cc_write32(cc, BCMA_CC_CORECTL, 
     569@@ -137,12 +335,11 @@ void bcma_chipco_serial_init(struct bcma 
    133570                                       | BCMA_CC_CORECTL_UARTCLKEN); 
    134571                } 
     
    140577        } 
    141578  
     579-       irq = bcma_core_mips_irq(cc->core); 
     580+       irq = bcma_core_irq(cc->core); 
     581  
     582        /* Determine the registers of the UARTs */ 
     583        cc->nr_serial_ports = (cc->capabilities & BCMA_CC_CAP_NRUART); 
    142584--- a/drivers/bcma/driver_chipcommon_pmu.c 
    143585+++ b/drivers/bcma/driver_chipcommon_pmu.c 
     
    152594  * Licensed under the GNU/GPL. See COPYING for details. 
    153595  */ 
    154 @@ -54,38 +55,19 @@ void bcma_chipco_regctl_maskset(struct b 
     596@@ -12,12 +13,13 @@ 
     597 #include <linux/export.h> 
     598 #include <linux/bcma/bcma.h> 
     599  
     600-static u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset) 
     601+u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset) 
     602 { 
     603        bcma_cc_write32(cc, BCMA_CC_PLLCTL_ADDR, offset); 
     604        bcma_cc_read32(cc, BCMA_CC_PLLCTL_ADDR); 
     605        return bcma_cc_read32(cc, BCMA_CC_PLLCTL_DATA); 
     606 } 
     607+EXPORT_SYMBOL_GPL(bcma_chipco_pll_read); 
     608  
     609 void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value) 
     610 { 
     611@@ -54,19 +56,106 @@ void bcma_chipco_regctl_maskset(struct b 
    155612 } 
    156613 EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset); 
    157614  
    158 -static void bcma_pmu_pll_init(struct bcma_drv_cc *cc) 
     615+static u32 bcma_pmu_xtalfreq(struct bcma_drv_cc *cc) 
     616+{ 
     617+       u32 ilp_ctl, alp_hz; 
     618+ 
     619+       if (!(bcma_cc_read32(cc, BCMA_CC_PMU_STAT) & 
     620+             BCMA_CC_PMU_STAT_EXT_LPO_AVAIL)) 
     621+               return 0; 
     622+ 
     623+       bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 
     624+                       BIT(BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT)); 
     625+       usleep_range(1000, 2000); 
     626+ 
     627+       ilp_ctl = bcma_cc_read32(cc, BCMA_CC_PMU_XTAL_FREQ); 
     628+       ilp_ctl &= BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK; 
     629+ 
     630+       bcma_cc_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 0); 
     631+ 
     632+       alp_hz = ilp_ctl * 32768 / 4; 
     633+       return (alp_hz + 50000) / 100000 * 100; 
     634+} 
     635+ 
     636+static void bcma_pmu2_pll_init0(struct bcma_drv_cc *cc, u32 xtalfreq) 
     637+{ 
     638+       struct bcma_bus *bus = cc->core->bus; 
     639+       u32 freq_tgt_target = 0, freq_tgt_current; 
     640+       u32 pll0, mask; 
     641+ 
     642+       switch (bus->chipinfo.id) { 
     643+       case BCMA_CHIP_ID_BCM43142: 
     644+               /* pmu2_xtaltab0_adfll_485 */ 
     645+               switch (xtalfreq) { 
     646+               case 12000: 
     647+                       freq_tgt_target = 0x50D52; 
     648+                       break; 
     649+               case 20000: 
     650+                       freq_tgt_target = 0x307FE; 
     651+                       break; 
     652+               case 26000: 
     653+                       freq_tgt_target = 0x254EA; 
     654+                       break; 
     655+               case 37400: 
     656+                       freq_tgt_target = 0x19EF8; 
     657+                       break; 
     658+               case 52000: 
     659+                       freq_tgt_target = 0x12A75; 
     660+                       break; 
     661+               } 
     662+               break; 
     663+       } 
     664+ 
     665+       if (!freq_tgt_target) { 
     666+               bcma_err(bus, "Unknown TGT frequency for xtalfreq %d\n", 
     667+                        xtalfreq); 
     668+               return; 
     669+       } 
     670+ 
     671+       pll0 = bcma_chipco_pll_read(cc, BCMA_CC_PMU15_PLL_PLLCTL0); 
     672+       freq_tgt_current = (pll0 & BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK) >> 
     673+               BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT; 
     674+ 
     675+       if (freq_tgt_current == freq_tgt_target) { 
     676+               bcma_debug(bus, "Target TGT frequency already set\n"); 
     677+               return; 
     678+       } 
     679+ 
     680+       /* Turn off PLL */ 
     681+       switch (bus->chipinfo.id) { 
     682+       case BCMA_CHIP_ID_BCM43142: 
     683+               mask = (u32)~(BCMA_RES_4314_HT_AVAIL | 
     684+                             BCMA_RES_4314_MACPHY_CLK_AVAIL); 
     685+ 
     686+               bcma_cc_mask32(cc, BCMA_CC_PMU_MINRES_MSK, mask); 
     687+               bcma_cc_mask32(cc, BCMA_CC_PMU_MAXRES_MSK, mask); 
     688+               bcma_wait_value(cc->core, BCMA_CLKCTLST, 
     689+                               BCMA_CLKCTLST_HAVEHT, 0, 20000); 
     690+               break; 
     691+       } 
     692+ 
     693+       pll0 &= ~BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK; 
     694+       pll0 |= freq_tgt_target << BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT; 
     695+       bcma_chipco_pll_write(cc, BCMA_CC_PMU15_PLL_PLLCTL0, pll0); 
     696+ 
     697+       /* Flush */ 
     698+       if (cc->pmu.rev >= 2) 
     699+               bcma_cc_set32(cc, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD); 
     700+ 
     701+       /* TODO: Do we need to update OTP? */ 
     702+} 
     703+ 
     704 static void bcma_pmu_pll_init(struct bcma_drv_cc *cc) 
     705 { 
     706        struct bcma_bus *bus = cc->core->bus; 
     707+       u32 xtalfreq = bcma_pmu_xtalfreq(cc); 
     708  
     709        switch (bus->chipinfo.id) { 
     710-       case 0x4313: 
     711-       case 0x4331: 
     712-       case 43224: 
     713-       case 43225: 
     714+       case BCMA_CHIP_ID_BCM43142: 
     715+               if (xtalfreq == 0) 
     716+                       xtalfreq = 20000; 
     717+               bcma_pmu2_pll_init0(cc, xtalfreq); 
     718                break; 
     719-       default: 
     720-               pr_err("PLL init unknown for device 0x%04X\n", 
     721-                       bus->chipinfo.id); 
     722        } 
     723 } 
     724  
     725@@ -76,16 +165,32 @@ static void bcma_pmu_resources_init(stru 
     726        u32 min_msk = 0, max_msk = 0; 
     727  
     728        switch (bus->chipinfo.id) { 
     729-       case 0x4313: 
     730+       case BCMA_CHIP_ID_BCM4313: 
     731                min_msk = 0x200D; 
     732                max_msk = 0xFFFF; 
     733                break; 
     734-       case 43224: 
     735-       case 43225: 
     736+       case BCMA_CHIP_ID_BCM43142: 
     737+               min_msk = BCMA_RES_4314_LPLDO_PU | 
     738+                         BCMA_RES_4314_PMU_SLEEP_DIS | 
     739+                         BCMA_RES_4314_PMU_BG_PU | 
     740+                         BCMA_RES_4314_CBUCK_LPOM_PU | 
     741+                         BCMA_RES_4314_CBUCK_PFM_PU | 
     742+                         BCMA_RES_4314_CLDO_PU | 
     743+                         BCMA_RES_4314_LPLDO2_LVM | 
     744+                         BCMA_RES_4314_WL_PMU_PU | 
     745+                         BCMA_RES_4314_LDO3P3_PU | 
     746+                         BCMA_RES_4314_OTP_PU | 
     747+                         BCMA_RES_4314_WL_PWRSW_PU | 
     748+                         BCMA_RES_4314_LQ_AVAIL | 
     749+                         BCMA_RES_4314_LOGIC_RET | 
     750+                         BCMA_RES_4314_MEM_SLEEP | 
     751+                         BCMA_RES_4314_MACPHY_RET | 
     752+                         BCMA_RES_4314_WL_CORE_READY; 
     753+               max_msk = 0x3FFFFFFF; 
     754                break; 
     755        default: 
     756-               pr_err("PMU resource config unknown for device 0x%04X\n", 
     757-                       bus->chipinfo.id); 
     758+               bcma_debug(bus, "PMU resource config unknown or not needed for device 0x%04X\n", 
     759+                          bus->chipinfo.id); 
     760        } 
     761  
     762        /* Set the resource masks. */ 
     763@@ -93,22 +198,12 @@ static void bcma_pmu_resources_init(stru 
     764                bcma_cc_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk); 
     765        if (max_msk) 
     766                bcma_cc_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk); 
     767-} 
     768  
     769-void bcma_pmu_swreg_init(struct bcma_drv_cc *cc) 
    159770-{ 
    160771-       struct bcma_bus *bus = cc->core->bus; 
     
    167778-               break; 
    168779-       default: 
    169 -               pr_err("PLL init unknown for device 0x%04X\n", 
    170 -                       bus->chipinfo.id); 
    171 -       } 
    172 -} 
    173 - 
    174  static void bcma_pmu_resources_init(struct bcma_drv_cc *cc) 
    175  { 
    176         struct bcma_bus *bus = cc->core->bus; 
    177         u32 min_msk = 0, max_msk = 0; 
    178   
    179         switch (bus->chipinfo.id) { 
    180 -       case 0x4313: 
    181 +       case BCMA_CHIP_ID_BCM4313: 
    182                 min_msk = 0x200D; 
    183                 max_msk = 0xFFFF; 
    184                 break; 
    185 -       case 43224: 
    186 -       case 43225: 
    187 -               break; 
    188         default: 
    189 -               pr_err("PMU resource config unknown for device 0x%04X\n", 
    190 -                       bus->chipinfo.id); 
    191 +               bcma_debug(bus, "PMU resource config unknown or not needed for device 0x%04X\n", 
    192 +                          bus->chipinfo.id); 
    193         } 
    194   
    195         /* Set the resource masks. */ 
    196 @@ -93,22 +75,9 @@ static void bcma_pmu_resources_init(stru 
    197                 bcma_cc_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk); 
    198         if (max_msk) 
    199                 bcma_cc_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk); 
    200 -} 
    201 - 
    202 -void bcma_pmu_swreg_init(struct bcma_drv_cc *cc) 
    203 -{ 
    204 -       struct bcma_bus *bus = cc->core->bus; 
    205   
    206 -       switch (bus->chipinfo.id) { 
    207 -       case 0x4313: 
    208 -       case 0x4331: 
    209 -       case 43224: 
    210 -       case 43225: 
    211 -               break; 
    212 -       default: 
    213780-               pr_err("PMU switch/regulators init unknown for device " 
    214781-                       "0x%04X\n", bus->chipinfo.id); 
    215782-       } 
    216 +       /* Add some delay; allow resources to come up and settle. */ 
     783+       /* 
     784+        * Add some delay; allow resources to come up and settle. 
     785+        * Delay is required for SoC (early init). 
     786+        */ 
    217787+       mdelay(2); 
    218788 } 
    219789  
    220790 /* Disable to allow reading SPROM. Don't know the adventages of enabling it. */ 
    221 @@ -122,8 +91,11 @@ void bcma_chipco_bcm4331_ext_pa_lines_ct 
     791@@ -122,51 +217,69 @@ void bcma_chipco_bcm4331_ext_pa_lines_ct 
    222792                val |= BCMA_CHIPCTL_4331_EXTPA_EN; 
    223793                if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11) 
     
    231801        } 
    232802        bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val); 
    233 @@ -134,26 +106,38 @@ void bcma_pmu_workarounds(struct bcma_dr 
     803 } 
     804  
     805-void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
     806+static void bcma_pmu_workarounds(struct bcma_drv_cc *cc) 
     807 { 
    234808        struct bcma_bus *bus = cc->core->bus; 
    235809  
     
    241815+                  register bit 1 */ 
    242816+               bcma_chipco_chipctl_maskset(cc, 0, 
    243 +                                           BCMA_CCTRL_4313_12MA_LED_DRIVE, 
     817+                                           ~BCMA_CCTRL_4313_12MA_LED_DRIVE, 
    244818+                                           BCMA_CCTRL_4313_12MA_LED_DRIVE); 
    245819                break; 
     
    261835-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x00F000F0); 
    262836+                       bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL, 
    263 +                                         BCMA_CCTRL_43224_GPIO_TOGGLE, 
     837+                                         ~BCMA_CCTRL_43224_GPIO_TOGGLE, 
    264838+                                         BCMA_CCTRL_43224_GPIO_TOGGLE); 
    265839+                       bcma_chipco_chipctl_maskset(cc, 0, 
    266 +                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 
     840+                                                   ~BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 
    267841+                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE); 
    268842                } else { 
    269843-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0xF0); 
    270844+                       bcma_chipco_chipctl_maskset(cc, 0, 
    271 +                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 
     845+                                                   ~BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 
    272846+                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE); 
    273847                } 
     
    283857 } 
    284858  
    285 @@ -164,8 +148,8 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
     859-void bcma_pmu_init(struct bcma_drv_cc *cc) 
     860+void bcma_pmu_early_init(struct bcma_drv_cc *cc) 
     861 { 
     862        u32 pmucap; 
     863  
    286864        pmucap = bcma_cc_read32(cc, BCMA_CC_PMU_CAP); 
    287865        cc->pmu.rev = (pmucap & BCMA_CC_PMU_CAP_REVISION); 
     
    291869+       bcma_debug(cc->core->bus, "Found rev %u PMU (capabilities 0x%08X)\n", 
    292870+                  cc->pmu.rev, pmucap); 
    293   
     871+} 
     872  
     873+void bcma_pmu_init(struct bcma_drv_cc *cc) 
     874+{ 
    294875        if (cc->pmu.rev == 1) 
    295876                bcma_cc_mask32(cc, BCMA_CC_PMU_CTL, 
    296 @@ -174,12 +158,7 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
     877                              ~BCMA_CC_PMU_CTL_NOILPONW); 
     878@@ -174,37 +287,48 @@ void bcma_pmu_init(struct bcma_drv_cc *c 
    297879                bcma_cc_set32(cc, BCMA_CC_PMU_CTL, 
    298880                             BCMA_CC_PMU_CTL_NOILPONW); 
     
    301883-               pr_err("Fix for 4329b0 bad LPOM state not implemented!\n"); 
    302884- 
    303 -       bcma_pmu_pll_init(cc); 
     885        bcma_pmu_pll_init(cc); 
    304886        bcma_pmu_resources_init(cc); 
    305887-       bcma_pmu_swreg_init(cc); 
     
    307889 } 
    308890  
    309 @@ -188,23 +167,22 @@ u32 bcma_pmu_alp_clock(struct bcma_drv_c 
     891-u32 bcma_pmu_alp_clock(struct bcma_drv_cc *cc) 
     892+u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc) 
     893 { 
    310894        struct bcma_bus *bus = cc->core->bus; 
    311895  
     
    318902-       case 0x4749: 
    319903-       case 53572: 
     904+       case BCMA_CHIP_ID_BCM4313: 
     905+       case BCMA_CHIP_ID_BCM43224: 
     906+       case BCMA_CHIP_ID_BCM43225: 
     907+       case BCMA_CHIP_ID_BCM43227: 
     908+       case BCMA_CHIP_ID_BCM43228: 
     909+       case BCMA_CHIP_ID_BCM4331: 
     910+       case BCMA_CHIP_ID_BCM43421: 
     911+       case BCMA_CHIP_ID_BCM43428: 
     912+       case BCMA_CHIP_ID_BCM43431: 
    320913+       case BCMA_CHIP_ID_BCM4716: 
     914+       case BCMA_CHIP_ID_BCM47162: 
    321915+       case BCMA_CHIP_ID_BCM4748: 
    322 +       case BCMA_CHIP_ID_BCM47162: 
    323 +       case BCMA_CHIP_ID_BCM4313: 
     916+       case BCMA_CHIP_ID_BCM4749: 
    324917+       case BCMA_CHIP_ID_BCM5357: 
    325 +       case BCMA_CHIP_ID_BCM4749: 
    326918+       case BCMA_CHIP_ID_BCM53572: 
     919+       case BCMA_CHIP_ID_BCM6362: 
    327920                /* always 20Mhz */ 
    328921                return 20000 * 1000; 
    329922-       case 0x5356: 
    330923-       case 0x5300: 
     924+       case BCMA_CHIP_ID_BCM4706: 
    331925+       case BCMA_CHIP_ID_BCM5356: 
    332 +       case BCMA_CHIP_ID_BCM4706: 
    333926                /* always 25Mhz */ 
    334927                return 25000 * 1000; 
     928+       case BCMA_CHIP_ID_BCM43460: 
     929+       case BCMA_CHIP_ID_BCM4352: 
     930+       case BCMA_CHIP_ID_BCM4360: 
     931+               if (cc->status & BCMA_CC_CHIPST_4360_XTAL_40MZ) 
     932+                       return 40000 * 1000; 
     933+               else 
     934+                       return 20000 * 1000; 
    335935        default: 
    336936-               pr_warn("No ALP clock specified for %04X device, " 
     
    342942        return BCMA_CC_PMU_ALP_CLOCK; 
    343943 } 
    344 @@ -221,7 +199,8 @@ static u32 bcma_pmu_clock(struct bcma_dr 
     944@@ -212,7 +336,7 @@ u32 bcma_pmu_alp_clock(struct bcma_drv_c 
     945 /* Find the output of the "m" pll divider given pll controls that start with 
     946  * pllreg "pll0" i.e. 12 for main 6 for phy, 0 for misc. 
     947  */ 
     948-static u32 bcma_pmu_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
     949+static u32 bcma_pmu_pll_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
     950 { 
     951        u32 tmp, div, ndiv, p1, p2, fc; 
     952        struct bcma_bus *bus = cc->core->bus; 
     953@@ -221,7 +345,8 @@ static u32 bcma_pmu_clock(struct bcma_dr 
    345954  
    346955        BUG_ON(!m || m > 4); 
     
    352961                tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT); 
    353962                if (tmp & 0x40000) 
    354 @@ -247,33 +226,62 @@ static u32 bcma_pmu_clock(struct bcma_dr 
     963@@ -240,60 +365,96 @@ static u32 bcma_pmu_clock(struct bcma_dr 
     964        ndiv = (tmp & BCMA_CC_PPL_NDIV_MASK) >> BCMA_CC_PPL_NDIV_SHIFT; 
     965  
     966        /* Do calculation in Mhz */ 
     967-       fc = bcma_pmu_alp_clock(cc) / 1000000; 
     968+       fc = bcma_pmu_get_alp_clock(cc) / 1000000; 
     969        fc = (p1 * ndiv * fc) / p2; 
     970  
     971        /* Return clock in Hertz */ 
    355972        return (fc / div) * 1000000; 
    356973 } 
    357974  
    358 +static u32 bcma_pmu_clock_bcm4706(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
     975+static u32 bcma_pmu_pll_clock_bcm4706(struct bcma_drv_cc *cc, u32 pll0, u32 m) 
    359976+{ 
    360977+       u32 tmp, ndiv, p1div, p2div; 
     
    3871004+ 
    3881005 /* query bus clock frequency for PMU-enabled chipcommon */ 
    389  u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     1006-u32 bcma_pmu_get_clockcontrol(struct bcma_drv_cc *cc) 
     1007+u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc) 
    3901008 { 
    3911009        struct bcma_bus *bus = cc->core->bus; 
     
    3951013-       case 0x4748: 
    3961014-       case 47162: 
    397 +       case BCMA_CHIP_ID_BCM4716: 
    398 +       case BCMA_CHIP_ID_BCM4748: 
    399 +       case BCMA_CHIP_ID_BCM47162: 
    400                 return bcma_pmu_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0, 
    401                                       BCMA_CC_PMU5_MAINPLL_SSB); 
     1015-               return bcma_pmu_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0, 
     1016-                                     BCMA_CC_PMU5_MAINPLL_SSB); 
    4021017-       case 0x5356: 
    403 +       case BCMA_CHIP_ID_BCM5356: 
    404                 return bcma_pmu_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0, 
    405                                       BCMA_CC_PMU5_MAINPLL_SSB); 
     1018-               return bcma_pmu_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0, 
     1019-                                     BCMA_CC_PMU5_MAINPLL_SSB); 
    4061020-       case 0x5357: 
    4071021-       case 0x4749: 
    408 +       case BCMA_CHIP_ID_BCM5357: 
    409 +       case BCMA_CHIP_ID_BCM4749: 
    410                 return bcma_pmu_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0, 
    411                                       BCMA_CC_PMU5_MAINPLL_SSB); 
     1022-               return bcma_pmu_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0, 
     1023-                                     BCMA_CC_PMU5_MAINPLL_SSB); 
    4121024-       case 0x5300: 
    4131025-               return bcma_pmu_clock(cc, BCMA_CC_PMU4706_MAINPLL_PLL0, 
    4141026-                                     BCMA_CC_PMU5_MAINPLL_SSB); 
    4151027-       case 53572: 
     1028+       case BCMA_CHIP_ID_BCM4716: 
     1029+       case BCMA_CHIP_ID_BCM4748: 
     1030+       case BCMA_CHIP_ID_BCM47162: 
     1031+               return bcma_pmu_pll_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0, 
     1032+                                         BCMA_CC_PMU5_MAINPLL_SSB); 
     1033+       case BCMA_CHIP_ID_BCM5356: 
     1034+               return bcma_pmu_pll_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0, 
     1035+                                         BCMA_CC_PMU5_MAINPLL_SSB); 
     1036+       case BCMA_CHIP_ID_BCM5357: 
     1037+       case BCMA_CHIP_ID_BCM4749: 
     1038+               return bcma_pmu_pll_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0, 
     1039+                                         BCMA_CC_PMU5_MAINPLL_SSB); 
    4161040+       case BCMA_CHIP_ID_BCM4706: 
    417 +               return bcma_pmu_clock_bcm4706(cc, BCMA_CC_PMU4706_MAINPLL_PLL0, 
    418 +                                             BCMA_CC_PMU5_MAINPLL_SSB); 
     1041+               return bcma_pmu_pll_clock_bcm4706(cc, 
     1042+                                                 BCMA_CC_PMU4706_MAINPLL_PLL0, 
     1043+                                                 BCMA_CC_PMU5_MAINPLL_SSB); 
    4191044+       case BCMA_CHIP_ID_BCM53572: 
    4201045                return 75000000; 
     
    4231048-                       "pmu rev. %d, using default %d Hz\n", 
    4241049-                       bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK); 
    425 +               bcma_warn(bus, "No backplane clock specified for %04X device, pmu rev. %d, using default %d Hz\n", 
     1050+               bcma_warn(bus, "No bus clock specified for %04X device, pmu rev. %d, using default %d Hz\n", 
    4261051+                         bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK); 
    4271052        } 
    4281053        return BCMA_CC_PMU_HT_CLOCK; 
    4291054 } 
    430 @@ -283,17 +291,21 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
     1055+EXPORT_SYMBOL_GPL(bcma_pmu_get_bus_clock); 
     1056  
     1057 /* query cpu clock frequency for PMU-enabled chipcommon */ 
     1058-u32 bcma_pmu_get_clockcpu(struct bcma_drv_cc *cc) 
     1059+u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc) 
    4311060 { 
    4321061        struct bcma_bus *bus = cc->core->bus; 
     
    4361065                return 300000000; 
    4371066  
     1067+       /* New PMUs can have different clock for bus and CPU */ 
    4381068        if (cc->pmu.rev >= 5) { 
    4391069                u32 pll; 
     
    4411071-               case 0x5356: 
    4421072+               case BCMA_CHIP_ID_BCM4706: 
    443 +                       return bcma_pmu_clock_bcm4706(cc, 
     1073+                       return bcma_pmu_pll_clock_bcm4706(cc, 
    4441074+                                               BCMA_CC_PMU4706_MAINPLL_PLL0, 
    4451075+                                               BCMA_CC_PMU5_MAINPLL_CPU); 
     
    4541084                        break; 
    4551085                default: 
    456 @@ -301,10 +313,188 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
     1086@@ -301,10 +462,189 @@ u32 bcma_pmu_get_clockcpu(struct bcma_dr 
    4571087                        break; 
    4581088                } 
     
    4601090-               /* TODO: if (bus->chipinfo.id == 0x5300) 
    4611091-                 return si_4706_pmu_clock(sih, osh, cc, PMU4706_MAINPLL_PLL0, PMU5_MAINPLL_CPU); */ 
    462                 return bcma_pmu_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU); 
    463         } 
    464   
    465         return bcma_pmu_get_clockcontrol(cc); 
    466  } 
     1092-               return bcma_pmu_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU); 
     1093+               return bcma_pmu_pll_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU); 
     1094+       } 
     1095+ 
     1096+       /* On old PMUs CPU has the same clock as the bus */ 
     1097+       return bcma_pmu_get_bus_clock(cc); 
     1098+} 
    4671099+ 
    4681100+static void bcma_pmu_spuravoid_pll_write(struct bcma_drv_cc *cc, u32 offset, 
     
    5091141+               bcma_cc_write32(cc, BCMA_CC_PLLCTL_DATA, tmp); 
    5101142+ 
    511 +               tmp = 1 << 10; 
     1143+               tmp = BCMA_CC_PMU_CTL_PLL_UPD; 
    5121144+               break; 
    5131145+ 
     
    5301162+                                                    0x03000a08); 
    5311163+               } 
    532 +               tmp = 1 << 10; 
     1164+               tmp = BCMA_CC_PMU_CTL_PLL_UPD; 
    5331165+               break; 
    5341166+ 
     
    5631195+                                                    0x88888815); 
    5641196+               } 
    565 +               tmp = 1 << 10; 
     1197+               tmp = BCMA_CC_PMU_CTL_PLL_UPD; 
    5661198+               break; 
    5671199+ 
     
    5971229+               } 
    5981230+ 
    599 +               tmp = 3 << 9; 
     1231+               tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW; 
    6001232+               break; 
    6011233+ 
     
    6331265+                                                    0x88888815); 
    6341266+               } 
    635 +               tmp = 1 << 10; 
     1267+               tmp = BCMA_CC_PMU_CTL_PLL_UPD; 
    6361268+               break; 
    6371269+       default: 
     
    6391271+                        bus->chipinfo.id); 
    6401272+               break; 
    641 +       } 
    642 + 
     1273        } 
     1274  
     1275-       return bcma_pmu_get_clockcontrol(cc); 
    6431276+       tmp |= bcma_cc_read32(cc, BCMA_CC_PMU_CTL); 
    6441277+       bcma_cc_write32(cc, BCMA_CC_PMU_CTL, tmp); 
    645 +} 
     1278 } 
    6461279+EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate); 
    6471280--- /dev/null 
     
    6621295+       mutex_init(&gc->phy_mutex); 
    6631296+} 
     1297--- /dev/null 
     1298+++ b/drivers/bcma/driver_gpio.c 
     1299@@ -0,0 +1,114 @@ 
     1300+/* 
     1301+ * Broadcom specific AMBA 
     1302+ * GPIO driver 
     1303+ * 
     1304+ * Copyright 2011, Broadcom Corporation 
     1305+ * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
     1306+ * 
     1307+ * Licensed under the GNU/GPL. See COPYING for details. 
     1308+ */ 
     1309+ 
     1310+#include <linux/gpio.h> 
     1311+#include <linux/export.h> 
     1312+#include <linux/bcma/bcma.h> 
     1313+ 
     1314+#include "bcma_private.h" 
     1315+ 
     1316+static inline struct bcma_drv_cc *bcma_gpio_get_cc(struct gpio_chip *chip) 
     1317+{ 
     1318+       return container_of(chip, struct bcma_drv_cc, gpio); 
     1319+} 
     1320+ 
     1321+static int bcma_gpio_get_value(struct gpio_chip *chip, unsigned gpio) 
     1322+{ 
     1323+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1324+ 
     1325+       return !!bcma_chipco_gpio_in(cc, 1 << gpio); 
     1326+} 
     1327+ 
     1328+static void bcma_gpio_set_value(struct gpio_chip *chip, unsigned gpio, 
     1329+                               int value) 
     1330+{ 
     1331+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1332+ 
     1333+       bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); 
     1334+} 
     1335+ 
     1336+static int bcma_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) 
     1337+{ 
     1338+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1339+ 
     1340+       bcma_chipco_gpio_outen(cc, 1 << gpio, 0); 
     1341+       return 0; 
     1342+} 
     1343+ 
     1344+static int bcma_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, 
     1345+                                     int value) 
     1346+{ 
     1347+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1348+ 
     1349+       bcma_chipco_gpio_outen(cc, 1 << gpio, 1 << gpio); 
     1350+       bcma_chipco_gpio_out(cc, 1 << gpio, value ? 1 << gpio : 0); 
     1351+       return 0; 
     1352+} 
     1353+ 
     1354+static int bcma_gpio_request(struct gpio_chip *chip, unsigned gpio) 
     1355+{ 
     1356+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1357+ 
     1358+       bcma_chipco_gpio_control(cc, 1 << gpio, 0); 
     1359+       /* clear pulldown */ 
     1360+       bcma_chipco_gpio_pulldown(cc, 1 << gpio, 0); 
     1361+       /* Set pullup */ 
     1362+       bcma_chipco_gpio_pullup(cc, 1 << gpio, 1 << gpio); 
     1363+ 
     1364+       return 0; 
     1365+} 
     1366+ 
     1367+static void bcma_gpio_free(struct gpio_chip *chip, unsigned gpio) 
     1368+{ 
     1369+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1370+ 
     1371+       /* clear pullup */ 
     1372+       bcma_chipco_gpio_pullup(cc, 1 << gpio, 0); 
     1373+} 
     1374+ 
     1375+static int bcma_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) 
     1376+{ 
     1377+       struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 
     1378+ 
     1379+       if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC) 
     1380+               return bcma_core_irq(cc->core); 
     1381+       else 
     1382+               return -EINVAL; 
     1383+} 
     1384+ 
     1385+int bcma_gpio_init(struct bcma_drv_cc *cc) 
     1386+{ 
     1387+       struct gpio_chip *chip = &cc->gpio; 
     1388+ 
     1389+       chip->label             = "bcma_gpio"; 
     1390+       chip->owner             = THIS_MODULE; 
     1391+       chip->request           = bcma_gpio_request; 
     1392+       chip->free              = bcma_gpio_free; 
     1393+       chip->get               = bcma_gpio_get_value; 
     1394+       chip->set               = bcma_gpio_set_value; 
     1395+       chip->direction_input   = bcma_gpio_direction_input; 
     1396+       chip->direction_output  = bcma_gpio_direction_output; 
     1397+       chip->to_irq            = bcma_gpio_to_irq; 
     1398+       chip->ngpio             = 16; 
     1399+       /* There is just one SoC in one device and its GPIO addresses should be 
     1400+        * deterministic to address them more easily. The other buses could get 
     1401+        * a random base number. */ 
     1402+       if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC) 
     1403+               chip->base              = 0; 
     1404+       else 
     1405+               chip->base              = -1; 
     1406+ 
     1407+       return gpiochip_add(chip); 
     1408+} 
     1409+ 
     1410+int bcma_gpio_unregister(struct bcma_drv_cc *cc) 
     1411+{ 
     1412+       return gpiochip_remove(&cc->gpio); 
     1413+} 
    6641414--- a/drivers/bcma/driver_mips.c 
    6651415+++ b/drivers/bcma/driver_mips.c 
     
    6841434               dev->id.id == BCMA_CORE_USB20_HOST; 
    6851435 } 
    686 @@ -143,8 +143,8 @@ static void bcma_core_mips_set_irq(struc 
     1436@@ -74,28 +74,41 @@ static u32 bcma_core_mips_irqflag(struct 
     1437                return dev->core_index; 
     1438        flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30); 
     1439  
     1440-       return flag & 0x1F; 
     1441+       if (flag) 
     1442+               return flag & 0x1F; 
     1443+       else 
     1444+               return 0x3f; 
     1445 } 
     1446  
     1447 /* Get the MIPS IRQ assignment for a specified device. 
     1448  * If unassigned, 0 is returned. 
     1449+ * If disabled, 5 is returned. 
     1450+ * If not supported, 6 is returned. 
     1451  */ 
     1452-unsigned int bcma_core_mips_irq(struct bcma_device *dev) 
     1453+static unsigned int bcma_core_mips_irq(struct bcma_device *dev) 
     1454 { 
     1455        struct bcma_device *mdev = dev->bus->drv_mips.core; 
     1456        u32 irqflag; 
     1457        unsigned int irq; 
     1458  
     1459        irqflag = bcma_core_mips_irqflag(dev); 
     1460+       if (irqflag == 0x3f) 
     1461+               return 6; 
     1462  
     1463-       for (irq = 1; irq <= 4; irq++) 
     1464+       for (irq = 0; irq <= 4; irq++) 
     1465                if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) & 
     1466                    (1 << irqflag)) 
     1467                        return irq; 
     1468  
     1469-       return 0; 
     1470+       return 5; 
     1471+} 
     1472+ 
     1473+unsigned int bcma_core_irq(struct bcma_device *dev) 
     1474+{ 
     1475+       unsigned int mips_irq = bcma_core_mips_irq(dev); 
     1476+       return mips_irq <= 4 ? mips_irq + 2 : 0; 
     1477 } 
     1478-EXPORT_SYMBOL(bcma_core_mips_irq); 
     1479+EXPORT_SYMBOL(bcma_core_irq); 
     1480  
     1481 static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) 
     1482 { 
     1483@@ -114,8 +127,8 @@ static void bcma_core_mips_set_irq(struc 
     1484                bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0), 
     1485                            bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) & 
     1486                            ~(1 << irqflag)); 
     1487-       else 
     1488-               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0); 
     1489+       else if (oldirq != 5) 
     1490+               bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0); 
     1491  
     1492        /* assign the new one */ 
     1493        if (irq == 0) { 
     1494@@ -123,17 +136,17 @@ static void bcma_core_mips_set_irq(struc 
     1495                            bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) | 
     1496                            (1 << irqflag)); 
     1497        } else { 
     1498-               u32 oldirqflag = bcma_read32(mdev, 
     1499-                                            BCMA_MIPS_MIPS74K_INTMASK(irq)); 
     1500-               if (oldirqflag) { 
     1501+               u32 irqinitmask = bcma_read32(mdev, 
     1502+                                             BCMA_MIPS_MIPS74K_INTMASK(irq)); 
     1503+               if (irqinitmask) { 
     1504                        struct bcma_device *core; 
     1505  
     1506                        /* backplane irq line is in use, find out who uses 
     1507                         * it and set user to irq 0 
     1508                         */ 
     1509-                       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1510+                       list_for_each_entry(core, &bus->cores, list) { 
     1511                                if ((1 << bcma_core_mips_irqflag(core)) == 
     1512-                                   oldirqflag) { 
     1513+                                   irqinitmask) { 
     1514                                        bcma_core_mips_set_irq(core, 0); 
     1515                                        break; 
     1516                                } 
     1517@@ -143,15 +156,31 @@ static void bcma_core_mips_set_irq(struc 
    6871518                             1 << irqflag); 
    6881519        } 
     
    6901521-       pr_info("set_irq: core 0x%04x, irq %d => %d\n", 
    6911522-               dev->id.id, oldirq + 2, irq + 2); 
    692 +       bcma_info(bus, "set_irq: core 0x%04x, irq %d => %d\n", 
    693 +                 dev->id.id, oldirq + 2, irq + 2); 
     1523+       bcma_debug(bus, "set_irq: core 0x%04x, irq %d => %d\n", 
     1524+                  dev->id.id, oldirq <= 4 ? oldirq + 2 : 0, irq + 2); 
     1525+} 
     1526+ 
     1527+static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq, 
     1528+                                       u16 coreid, u8 unit) 
     1529+{ 
     1530+       struct bcma_device *core; 
     1531+ 
     1532+       core = bcma_find_core_unit(bus, coreid, unit); 
     1533+       if (!core) { 
     1534+               bcma_warn(bus, 
     1535+                         "Can not find core (id: 0x%x, unit %i) for IRQ configuration.\n", 
     1536+                         coreid, unit); 
     1537+               return; 
     1538+       } 
     1539+ 
     1540+       bcma_core_mips_set_irq(core, irq); 
    6941541 } 
    6951542  
    6961543 static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) 
    697 @@ -173,7 +173,7 @@ u32 bcma_cpu_clock(struct bcma_drv_mips 
     1544 { 
     1545        int i; 
     1546        static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"}; 
     1547-       printk(KERN_INFO KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id); 
     1548+       printk(KERN_DEBUG KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id); 
     1549        for (i = 0; i <= 6; i++) 
     1550                printk(" %s%s", irq_name[i], i == irq ? "*" : " "); 
     1551        printk("\n"); 
     1552@@ -161,7 +190,7 @@ static void bcma_core_mips_dump_irq(stru 
     1553 { 
     1554        struct bcma_device *core; 
     1555  
     1556-       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1557+       list_for_each_entry(core, &bus->cores, list) { 
     1558                bcma_core_mips_print_irq(core, bcma_core_mips_irq(core)); 
     1559        } 
     1560 } 
     1561@@ -171,9 +200,9 @@ u32 bcma_cpu_clock(struct bcma_drv_mips 
     1562        struct bcma_bus *bus = mcore->core->bus; 
     1563  
    6981564        if (bus->drv_cc.capabilities & BCMA_CC_CAP_PMU) 
    699                 return bcma_pmu_get_clockcpu(&bus->drv_cc); 
     1565-               return bcma_pmu_get_clockcpu(&bus->drv_cc); 
     1566+               return bcma_pmu_get_cpu_clock(&bus->drv_cc); 
    7001567  
    7011568-       pr_err("No PMU available, need this to get the cpu clock\n"); 
     
    7041571 } 
    7051572 EXPORT_SYMBOL(bcma_cpu_clock); 
    706 @@ -185,10 +185,10 @@ static void bcma_core_mips_flash_detect( 
     1573@@ -185,10 +214,10 @@ static void bcma_core_mips_flash_detect( 
    7071574        switch (bus->drv_cc.capabilities & BCMA_CC_CAP_FLASHT) { 
    7081575        case BCMA_CC_FLASHT_STSER: 
     
    7171584                bus->drv_cc.pflash.window_size = 0x02000000; 
    7181585  
    719 @@ -199,7 +199,7 @@ static void bcma_core_mips_flash_detect( 
     1586@@ -199,7 +228,46 @@ static void bcma_core_mips_flash_detect( 
    7201587                        bus->drv_cc.pflash.buswidth = 2; 
    7211588                break; 
     
    7231590-               pr_err("flash not supported.\n"); 
    7241591+               bcma_err(bus, "flash not supported.\n"); 
     1592+       } 
     1593+} 
     1594+ 
     1595+void bcma_core_mips_early_init(struct bcma_drv_mips *mcore) 
     1596+{ 
     1597+       struct bcma_bus *bus = mcore->core->bus; 
     1598+ 
     1599+       if (mcore->early_setup_done) 
     1600+               return; 
     1601+ 
     1602+       bcma_chipco_serial_init(&bus->drv_cc); 
     1603+       bcma_core_mips_flash_detect(mcore); 
     1604+ 
     1605+       mcore->early_setup_done = true; 
     1606+} 
     1607+ 
     1608+static void bcma_fix_i2s_irqflag(struct bcma_bus *bus) 
     1609+{ 
     1610+       struct bcma_device *cpu, *pcie, *i2s; 
     1611+ 
     1612+       /* Fixup the interrupts in 4716/4748 for i2s core (2010 Broadcom SDK) 
     1613+        * (IRQ flags > 7 are ignored when setting the interrupt masks) 
     1614+        */ 
     1615+       if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4716 && 
     1616+           bus->chipinfo.id != BCMA_CHIP_ID_BCM4748) 
     1617+               return; 
     1618+ 
     1619+       cpu = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     1620+       pcie = bcma_find_core(bus, BCMA_CORE_PCIE); 
     1621+       i2s = bcma_find_core(bus, BCMA_CORE_I2S); 
     1622+       if (cpu && pcie && i2s && 
     1623+           bcma_aread32(cpu, BCMA_MIPS_OOBSELINA74) == 0x08060504 && 
     1624+           bcma_aread32(pcie, BCMA_MIPS_OOBSELINA74) == 0x08060504 && 
     1625+           bcma_aread32(i2s, BCMA_MIPS_OOBSELOUTA30) == 0x88) { 
     1626+               bcma_awrite32(cpu, BCMA_MIPS_OOBSELINA74, 0x07060504); 
     1627+               bcma_awrite32(pcie, BCMA_MIPS_OOBSELINA74, 0x07060504); 
     1628+               bcma_awrite32(i2s, BCMA_MIPS_OOBSELOUTA30, 0x87); 
     1629+               bcma_debug(bus, 
     1630+                          "Moved i2s interrupt to oob line 7 instead of 8\n"); 
    7251631        } 
    7261632 } 
    7271633  
    728 @@ -209,7 +209,7 @@ void bcma_core_mips_init(struct bcma_drv 
     1634@@ -209,48 +277,59 @@ void bcma_core_mips_init(struct bcma_drv 
    7291635        struct bcma_device *core; 
    7301636        bus = mcore->core->bus; 
    7311637  
    7321638-       pr_info("Initializing MIPS core...\n"); 
    733 +       bcma_info(bus, "Initializing MIPS core...\n"); 
    734   
    735         if (!mcore->setup_done) 
    736                 mcore->assigned_irqs = 1; 
    737 @@ -244,7 +244,7 @@ void bcma_core_mips_init(struct bcma_drv 
    738                         break; 
     1639+       if (mcore->setup_done) 
     1640+               return; 
     1641+ 
     1642+       bcma_debug(bus, "Initializing MIPS core...\n"); 
     1643  
     1644-       if (!mcore->setup_done) 
     1645-               mcore->assigned_irqs = 1; 
     1646+       bcma_core_mips_early_init(mcore); 
     1647  
     1648-       /* Assign IRQs to all cores on the bus */ 
     1649-       list_for_each_entry_reverse(core, &bus->cores, list) { 
     1650-               int mips_irq; 
     1651-               if (core->irq) 
     1652-                       continue; 
     1653- 
     1654-               mips_irq = bcma_core_mips_irq(core); 
     1655-               if (mips_irq > 4) 
     1656-                       core->irq = 0; 
     1657-               else 
     1658-                       core->irq = mips_irq + 2; 
     1659-               if (core->irq > 5) 
     1660-                       continue; 
     1661-               switch (core->id.id) { 
     1662-               case BCMA_CORE_PCI: 
     1663-               case BCMA_CORE_PCIE: 
     1664-               case BCMA_CORE_ETHERNET: 
     1665-               case BCMA_CORE_ETHERNET_GBIT: 
     1666-               case BCMA_CORE_MAC_GBIT: 
     1667-               case BCMA_CORE_80211: 
     1668-               case BCMA_CORE_USB20_HOST: 
     1669-                       /* These devices get their own IRQ line if available, 
     1670-                        * the rest goes on IRQ0 
     1671-                        */ 
     1672-                       if (mcore->assigned_irqs <= 4) 
     1673-                               bcma_core_mips_set_irq(core, 
     1674-                                                      mcore->assigned_irqs++); 
     1675-                       break; 
     1676+       bcma_fix_i2s_irqflag(bus); 
     1677+ 
     1678+       switch (bus->chipinfo.id) { 
     1679+       case BCMA_CHIP_ID_BCM4716: 
     1680+       case BCMA_CHIP_ID_BCM4748: 
     1681+               bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); 
     1682+               bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); 
     1683+               bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0); 
     1684+               bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_PCIE, 0); 
     1685+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); 
     1686+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0); 
     1687+               break; 
     1688+       case BCMA_CHIP_ID_BCM5356: 
     1689+       case BCMA_CHIP_ID_BCM47162: 
     1690+       case BCMA_CHIP_ID_BCM53572: 
     1691+               bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); 
     1692+               bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); 
     1693+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); 
     1694+               break; 
     1695+       case BCMA_CHIP_ID_BCM5357: 
     1696+       case BCMA_CHIP_ID_BCM4749: 
     1697+               bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); 
     1698+               bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); 
     1699+               bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0); 
     1700+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); 
     1701+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0); 
     1702+               break; 
     1703+       case BCMA_CHIP_ID_BCM4706: 
     1704+               bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_PCIE, 0); 
     1705+               bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_4706_MAC_GBIT, 
     1706+                                           0); 
     1707+               bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_PCIE, 1); 
     1708+               bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_USB20_HOST, 0); 
     1709+               bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_4706_CHIPCOMMON, 
     1710+                                           0); 
     1711+               break; 
     1712+       default: 
     1713+               list_for_each_entry(core, &bus->cores, list) { 
     1714+                       core->irq = bcma_core_irq(core); 
    7391715                } 
     1716+               bcma_err(bus, 
     1717+                        "Unknown device (0x%x) found, can not configure IRQs\n", 
     1718+                        bus->chipinfo.id); 
    7401719        } 
    7411720-       pr_info("IRQ reconfiguration done\n"); 
    742 +       bcma_info(bus, "IRQ reconfiguration done\n"); 
     1721+       bcma_debug(bus, "IRQ reconfiguration done\n"); 
    7431722        bcma_core_mips_dump_irq(bus); 
    7441723  
    745         if (mcore->setup_done) 
     1724-       if (mcore->setup_done) 
     1725-               return; 
     1726- 
     1727-       bcma_chipco_serial_init(&bus->drv_cc); 
     1728-       bcma_core_mips_flash_detect(mcore); 
     1729        mcore->setup_done = true; 
     1730 } 
    7461731--- a/drivers/bcma/driver_pci.c 
    7471732+++ b/drivers/bcma/driver_pci.c 
     
    7571742  * Licensed under the GNU/GPL. See COPYING for details. 
    7581743  */ 
    759 @@ -16,40 +17,39 @@ 
     1744@@ -16,120 +17,124 @@ 
    7601745  * R/W ops. 
    7611746  **************************************************/ 
     
    8131798+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) 
    8141799                        break; 
    815                 msleep(1); 
     1800-               msleep(1); 
     1801+               usleep_range(1000, 2000); 
    8161802        } 
    817 @@ -57,79 +57,84 @@ static void bcma_pcie_mdio_set_phy(struc 
     1803 } 
    8181804  
    8191805 static u16 bcma_pcie_mdio_read(struct bcma_drv_pci *pc, u8 device, u8 address) 
     
    8691855                        break; 
    8701856                } 
    871                 msleep(1); 
     1857-               msleep(1); 
     1858+               usleep_range(1000, 2000); 
    8721859        } 
    8731860-       pcicore_write32(pc, mdio_control, 0); 
     
    9241911+               if (v & BCMA_CORE_PCI_MDIOCTL_ACCESS_DONE) 
    9251912                        break; 
    926                 msleep(1); 
     1913-               msleep(1); 
     1914+               usleep_range(1000, 2000); 
    9271915        } 
    9281916-       pcicore_write32(pc, mdio_control, 0); 
     
    11042092--- a/drivers/bcma/driver_pci_host.c 
    11052093+++ b/drivers/bcma/driver_pci_host.c 
    1106 @@ -2,13 +2,592 @@ 
     2094@@ -2,13 +2,616 @@ 
    11072095  * Broadcom specific AMBA 
    11082096  * PCI Core in hostmode 
     
    11412129+               return false; 
    11422130+ 
    1143 +       if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) { 
    1144 +               bcma_info(bus, "This PCI core is disabled and not working\n"); 
    1145 +               return false; 
    1146 +       } 
    1147 + 
    11482131+       bcma_core_enable(pc->core, 0); 
    11492132+ 
     
    11902173+       return addr; 
    11912174+} 
    1192   
    1193 -void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc) 
     2175+ 
    11942176+static int bcma_extpci_read_config(struct bcma_drv_pci *pc, unsigned int dev, 
    11952177+                                 unsigned int func, unsigned int off, 
    11962178+                                 void *buf, int len) 
    1197  { 
    1198 -       pr_err("No support for PCI core in hostmode yet\n"); 
     2179+{ 
    11992180+       int err = -EINVAL; 
    12002181+       u32 addr, val; 
     
    12072188+               /* we support only two functions on device 0 */ 
    12082189+               if (func > 1) 
    1209 +                       return -EINVAL; 
     2190+                       goto out; 
    12102191+ 
    12112192+               /* accesses to config registers with offsets >= 256 
     
    12142195+               if (off >= PCI_CONFIG_SPACE_SIZE) { 
    12152196+                       addr = (func << 12); 
    1216 +                       addr |= (off & 0x0FFF); 
     2197+                       addr |= (off & 0x0FFC); 
    12172198+                       val = bcma_pcie_read_config(pc, addr); 
    12182199+               } else { 
    12192200+                       addr = BCMA_CORE_PCI_PCICFG0; 
    12202201+                       addr |= (func << 8); 
    1221 +                       addr |= (off & 0xfc); 
     2202+                       addr |= (off & 0xFC); 
    12222203+                       val = pcicore_read32(pc, addr); 
    12232204+               } 
     
    12322213+ 
    12332214+               if (mips_busprobe32(val, mmio)) { 
    1234 +                       val = 0xffffffff; 
     2215+                       val = 0xFFFFFFFF; 
    12352216+                       goto unmap; 
    12362217+               } 
    1237 + 
    1238 +               val = readl(mmio); 
    12392218+       } 
    12402219+       val >>= (8 * (off & 3)); 
     
    12582237+       return err; 
    12592238+} 
    1260 + 
     2239  
     2240-void bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc) 
    12612241+static int bcma_extpci_write_config(struct bcma_drv_pci *pc, unsigned int dev, 
    12622242+                                  unsigned int func, unsigned int off, 
    12632243+                                  const void *buf, int len) 
    1264 +{ 
     2244 { 
     2245-       pr_err("No support for PCI core in hostmode yet\n"); 
    12652246+       int err = -EINVAL; 
    1266 +       u32 addr = 0, val = 0; 
     2247+       u32 addr, val; 
    12672248+       void __iomem *mmio = 0; 
    12682249+       u16 chipid = pc->core->bus->chipinfo.id; 
     
    12722253+               goto out; 
    12732254+       if (dev == 0) { 
     2255+               /* we support only two functions on device 0 */ 
     2256+               if (func > 1) 
     2257+                       goto out; 
     2258+ 
    12742259+               /* accesses to config registers with offsets >= 256 
    12752260+                * requires indirect access. 
    12762261+                */ 
    1277 +               if (off < PCI_CONFIG_SPACE_SIZE) { 
    1278 +                       addr = pc->core->addr + BCMA_CORE_PCI_PCICFG0; 
     2262+               if (off >= PCI_CONFIG_SPACE_SIZE) { 
     2263+                       addr = (func << 12); 
     2264+                       addr |= (off & 0x0FFC); 
     2265+                       val = bcma_pcie_read_config(pc, addr); 
     2266+               } else { 
     2267+                       addr = BCMA_CORE_PCI_PCICFG0; 
    12792268+                       addr |= (func << 8); 
    1280 +                       addr |= (off & 0xfc); 
    1281 +                       mmio = ioremap_nocache(addr, sizeof(val)); 
    1282 +                       if (!mmio) 
    1283 +                               goto out; 
     2269+                       addr |= (off & 0xFC); 
     2270+                       val = pcicore_read32(pc, addr); 
    12842271+               } 
    12852272+       } else { 
     
    12932280+ 
    12942281+               if (mips_busprobe32(val, mmio)) { 
    1295 +                       val = 0xffffffff; 
     2282+                       val = 0xFFFFFFFF; 
    12962283+                       goto unmap; 
    12972284+               } 
     
    13002287+       switch (len) { 
    13012288+       case 1: 
    1302 +               val = readl(mmio); 
    13032289+               val &= ~(0xFF << (8 * (off & 3))); 
    13042290+               val |= *((const u8 *)buf) << (8 * (off & 3)); 
    13052291+               break; 
    13062292+       case 2: 
    1307 +               val = readl(mmio); 
    13082293+               val &= ~(0xFFFF << (8 * (off & 3))); 
    13092294+               val |= *((const u16 *)buf) << (8 * (off & 3)); 
     
    13132298+               break; 
    13142299+       } 
    1315 +       if (dev == 0 && !addr) { 
     2300+       if (dev == 0) { 
    13162301+               /* accesses to config registers with offsets >= 256 
    13172302+                * requires indirect access. 
    13182303+                */ 
    1319 +               addr = (func << 12); 
    1320 +               addr |= (off & 0x0FFF); 
    1321 +               bcma_pcie_write_config(pc, addr, val); 
     2304+               if (off >= PCI_CONFIG_SPACE_SIZE) 
     2305+                       bcma_pcie_write_config(pc, addr, val); 
     2306+               else 
     2307+                       pcicore_write32(pc, addr, val); 
    13222308+       } else { 
    13232309+               writel(val, mmio); 
     
    13902376+       bcma_extpci_read_config(pc, dev, func, PCI_HEADER_TYPE, &byte_val, 
    13912377+                               sizeof(u8)); 
    1392 +       if ((byte_val & 0x7f) != PCI_HEADER_TYPE_NORMAL) 
     2378+       if ((byte_val & 0x7F) != PCI_HEADER_TYPE_NORMAL) 
    13932379+               return cap_ptr; 
    13942380+ 
     
    15042490+       bcma_info(bus, "PCIEcore in host mode found\n"); 
    15052491+ 
     2492+       if (bus->sprom.boardflags_lo & BCMA_CORE_PCI_BFL_NOPCI) { 
     2493+               bcma_info(bus, "This PCIE core is disabled and not working\n"); 
     2494+               return; 
     2495+       } 
     2496+ 
    15062497+       pc_host = kzalloc(sizeof(*pc_host), GFP_KERNEL); 
    15072498+       if (!pc_host)  { 
     
    15102501+       } 
    15112502+ 
     2503+       spin_lock_init(&pc_host->cfgspace_lock); 
     2504+ 
    15122505+       pc->host_controller = pc_host; 
    15132506+       pc_host->pci_controller.io_resource = &pc_host->io_resource; 
     
    15332526+ 
    15342527+       /* Reset RC */ 
    1535 +       udelay(3000); 
     2528+       usleep_range(3000, 5000); 
    15362529+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST_OE); 
    1537 +       udelay(1000); 
     2530+       msleep(50); 
    15382531+       pcicore_write32(pc, BCMA_CORE_PCI_CTL, BCMA_CORE_PCI_CTL_RST | 
    15392532+                       BCMA_CORE_PCI_CTL_RST_OE); 
     
    15602553+                       pc_host->mem_resource.end = BCMA_SOC_PCI_MEM + 
    15612554+                                                   BCMA_SOC_PCI_MEM_SZ - 1; 
     2555+                       pc_host->io_resource.start = 0x100; 
     2556+                       pc_host->io_resource.end = 0x47F; 
    15622557+                       pci_membase_1G = BCMA_SOC_PCIE_DMA_H32; 
    15632558+                       pcicore_write32(pc, BCMA_CORE_PCI_SBTOPCI0, 
     
    15672562+                       pc_host->mem_resource.end = BCMA_SOC_PCI1_MEM + 
    15682563+                                                   BCMA_SOC_PCI_MEM_SZ - 1; 
     2564+                       pc_host->io_resource.start = 0x480; 
     2565+                       pc_host->io_resource.end = 0x7FF; 
    15692566+                       pci_membase_1G = BCMA_SOC_PCIE1_DMA_H32; 
    15702567+                       pc_host->host_cfg_addr = BCMA_SOC_PCI1_CFG; 
     
    15892586+        * devices. 
    15902587+        */ 
    1591 +       udelay(100000); 
     2588+       msleep(100); 
    15922589+ 
    15932590+       bcma_core_pci_enable_crs(pc); 
     2591+ 
     2592+       if (bus->chipinfo.id == BCMA_CHIP_ID_BCM4706 || 
     2593+           bus->chipinfo.id == BCMA_CHIP_ID_BCM4716) { 
     2594+               u16 val16; 
     2595+               bcma_extpci_read_config(pc, 0, 0, BCMA_CORE_PCI_CFG_DEVCTRL, 
     2596+                                       &val16, sizeof(val16)); 
     2597+               val16 |= (2 << 5);      /* Max payload size of 512 */ 
     2598+               val16 |= (2 << 12);     /* MRRS 512 */ 
     2599+               bcma_extpci_write_config(pc, 0, 0, BCMA_CORE_PCI_CFG_DEVCTRL, 
     2600+                                        &val16, sizeof(val16)); 
     2601+       } 
    15942602+ 
    15952603+       /* Enable PCI bridge BAR0 memory & master access */ 
     
    16092617+       /* Give some time to the PCI controller to configure itself with the new 
    16102618+        * values. Not waiting at this point causes crashes of the machine. */ 
    1611 +       mdelay(10); 
     2619+       usleep_range(10000, 15000); 
    16122620+       register_pci_controller(&pc_host->pci_controller); 
    16132621+       return; 
     
    16422650+{ 
    16432651+       struct resource *res; 
    1644 +       int pos; 
     2652+       int pos, err; 
    16452653+ 
    16462654+       if (dev->bus->ops->read != bcma_core_pci_hostmode_read_config) { 
     
    16552663+       for (pos = 0; pos < 6; pos++) { 
    16562664+               res = &dev->resource[pos]; 
    1657 +               if (res->flags & (IORESOURCE_IO | IORESOURCE_MEM)) 
    1658 +                       pci_assign_resource(dev, pos); 
     2665+               if (res->flags & (IORESOURCE_IO | IORESOURCE_MEM)) { 
     2666+                       err = pci_assign_resource(dev, pos); 
     2667+                       if (err) 
     2668+                               pr_err("PCI: Problem fixing up the addresses on %s\n", 
     2669+                                      pci_name(dev)); 
     2670+               } 
    16592671+       } 
    16602672+} 
     
    16772689+ 
    16782690+       /* Fix up interrupt lines */ 
    1679 +       dev->irq = bcma_core_mips_irq(pc_host->pdev->core) + 2; 
     2691+       dev->irq = bcma_core_irq(pc_host->pdev->core); 
    16802692+       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); 
    16812693+ 
     
    16962708+       pc_host = container_of(dev->bus->ops, struct bcma_drv_pci_host, 
    16972709+                              pci_ops); 
    1698 +       return bcma_core_mips_irq(pc_host->pdev->core) + 2; 
     2710+       return bcma_core_irq(pc_host->pdev->core); 
    16992711 } 
    17002712+EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq); 
     
    17102722  
    17112723 /* Provides access to the requested core. Returns base offset that has to be 
    1712 @@ -154,8 +154,8 @@ const struct bcma_host_ops bcma_host_pci 
     2724@@ -77,8 +77,8 @@ static void bcma_host_pci_write32(struct 
     2725 } 
     2726  
     2727 #ifdef CONFIG_BCMA_BLOCKIO 
     2728-void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, 
     2729-                             size_t count, u16 offset, u8 reg_width) 
     2730+static void bcma_host_pci_block_read(struct bcma_device *core, void *buffer, 
     2731+                                    size_t count, u16 offset, u8 reg_width) 
     2732 { 
     2733        void __iomem *addr = core->bus->mmio + offset; 
     2734        if (core->bus->mapped_core != core) 
     2735@@ -100,8 +100,9 @@ void bcma_host_pci_block_read(struct bcm 
     2736        } 
     2737 } 
     2738  
     2739-void bcma_host_pci_block_write(struct bcma_device *core, const void *buffer, 
     2740-                              size_t count, u16 offset, u8 reg_width) 
     2741+static void bcma_host_pci_block_write(struct bcma_device *core, 
     2742+                                     const void *buffer, size_t count, 
     2743+                                     u16 offset, u8 reg_width) 
     2744 { 
     2745        void __iomem *addr = core->bus->mmio + offset; 
     2746        if (core->bus->mapped_core != core) 
     2747@@ -139,7 +140,7 @@ static void bcma_host_pci_awrite32(struc 
     2748        iowrite32(value, core->bus->mmio + (1 * BCMA_CORE_SIZE) + offset); 
     2749 } 
     2750  
     2751-const struct bcma_host_ops bcma_host_pci_ops = { 
     2752+static const struct bcma_host_ops bcma_host_pci_ops = { 
     2753        .read8          = bcma_host_pci_read8, 
     2754        .read16         = bcma_host_pci_read16, 
     2755        .read32         = bcma_host_pci_read32, 
     2756@@ -154,8 +155,8 @@ const struct bcma_host_ops bcma_host_pci 
    17132757        .awrite32       = bcma_host_pci_awrite32, 
    17142758 }; 
     
    17212765        struct bcma_bus *bus; 
    17222766        int err = -ENOMEM; 
    1723 @@ -188,7 +188,7 @@ static int bcma_host_pci_probe(struct pc 
     2767@@ -188,7 +189,7 @@ static int bcma_host_pci_probe(struct pc 
    17242768  
    17252769        /* SSB needed additional powering up, do we have any AMBA PCI cards? */ 
     
    17302774        /* Map MMIO */ 
    17312775        err = -ENOMEM; 
    1732 @@ -201,6 +201,9 @@ static int bcma_host_pci_probe(struct pc 
     2776@@ -201,6 +202,9 @@ static int bcma_host_pci_probe(struct pc 
    17332777        bus->hosttype = BCMA_HOSTTYPE_PCI; 
    17342778        bus->ops = &bcma_host_pci_ops; 
     
    17402784        err = bcma_bus_register(bus); 
    17412785        if (err) 
    1742 @@ -222,7 +225,7 @@ err_kfree_bus: 
     2786@@ -222,7 +226,7 @@ err_kfree_bus: 
    17432787        return err; 
    17442788 } 
     
    17492793        struct bcma_bus *bus = pci_get_drvdata(dev); 
    17502794  
    1751 @@ -265,6 +268,7 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
     2795@@ -234,7 +238,7 @@ static void bcma_host_pci_remove(struct 
     2796        pci_set_drvdata(dev, NULL); 
     2797 } 
     2798  
     2799-#ifdef CONFIG_PM 
     2800+#ifdef CONFIG_PM_SLEEP 
     2801 static int bcma_host_pci_suspend(struct device *dev) 
     2802 { 
     2803        struct pci_dev *pdev = to_pci_dev(dev); 
     2804@@ -257,17 +261,21 @@ static SIMPLE_DEV_PM_OPS(bcma_pm_ops, bc 
     2805                         bcma_host_pci_resume); 
     2806 #define BCMA_PM_OPS    (&bcma_pm_ops) 
     2807  
     2808-#else /* CONFIG_PM */ 
     2809+#else /* CONFIG_PM_SLEEP */ 
     2810  
     2811 #define BCMA_PM_OPS     NULL 
     2812  
     2813-#endif /* CONFIG_PM */ 
     2814+#endif /* CONFIG_PM_SLEEP */ 
    17522815  
    17532816 static DEFINE_PCI_DEVICE_TABLE(bcma_pci_bridge_tbl) = { 
     
    17572820        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4353) }, 
    17582821        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4357) }, 
    1759 @@ -277,7 +281,7 @@ static struct pci_driver bcma_pci_bridge 
     2822+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) }, 
     2823+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) }, 
     2824+       { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) }, 
     2825        { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4727) }, 
     2826        { 0, }, 
     2827 }; 
     2828@@ -277,7 +285,7 @@ static struct pci_driver bcma_pci_bridge 
    17602829        .name = "bcma-pci-bridge", 
    17612830        .id_table = bcma_pci_bridge_tbl, 
     
    17662835 }; 
    17672836  
     2837--- a/drivers/bcma/host_soc.c 
     2838+++ b/drivers/bcma/host_soc.c 
     2839@@ -143,7 +143,7 @@ static void bcma_host_soc_awrite32(struc 
     2840        writel(value, core->io_wrap + offset); 
     2841 } 
     2842  
     2843-const struct bcma_host_ops bcma_host_soc_ops = { 
     2844+static const struct bcma_host_ops bcma_host_soc_ops = { 
     2845        .read8          = bcma_host_soc_read8, 
     2846        .read16         = bcma_host_soc_read16, 
     2847        .read32         = bcma_host_soc_read32, 
    17682848--- a/drivers/bcma/main.c 
    17692849+++ b/drivers/bcma/main.c 
     
    17972877        struct bcma_device *core; 
    17982878  
    1799 @@ -65,6 +78,7 @@ static struct bcma_device *bcma_find_cor 
     2879@@ -65,6 +78,38 @@ static struct bcma_device *bcma_find_cor 
    18002880        } 
    18012881        return NULL; 
    18022882 } 
    18032883+EXPORT_SYMBOL_GPL(bcma_find_core); 
     2884+ 
     2885+struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid, 
     2886+                                       u8 unit) 
     2887+{ 
     2888+       struct bcma_device *core; 
     2889+ 
     2890+       list_for_each_entry(core, &bus->cores, list) { 
     2891+               if (core->id.id == coreid && core->core_unit == unit) 
     2892+                       return core; 
     2893+       } 
     2894+       return NULL; 
     2895+} 
     2896+ 
     2897+bool bcma_wait_value(struct bcma_device *core, u16 reg, u32 mask, u32 value, 
     2898+                    int timeout) 
     2899+{ 
     2900+       unsigned long deadline = jiffies + timeout; 
     2901+       u32 val; 
     2902+ 
     2903+       do { 
     2904+               val = bcma_read32(core, reg); 
     2905+               if ((val & mask) == value) 
     2906+                       return true; 
     2907+               cpu_relax(); 
     2908+               udelay(10); 
     2909+       } while (!time_after_eq(jiffies, deadline)); 
     2910+ 
     2911+       bcma_warn(core->bus, "Timeout waiting for register 0x%04X!\n", reg); 
     2912+ 
     2913+       return false; 
     2914+} 
    18042915  
    18052916 static void bcma_release_core_dev(struct device *dev) 
    18062917 { 
    1807 @@ -84,16 +98,18 @@ static int bcma_register_cores(struct bc 
     2918@@ -84,16 +129,23 @@ static int bcma_register_cores(struct bc 
    18082919        list_for_each_entry(core, &bus->cores, list) { 
    18092920                /* We support that cores ourself */ 
     
    18182929                } 
    18192930  
     2931+               /* Only first GMAC core on BCM4706 is connected and working */ 
     2932+               if (core->id.id == BCMA_CORE_4706_MAC_GBIT && 
     2933+                   core->core_unit > 0) 
     2934+                       continue; 
     2935+ 
    18202936                core->dev.release = bcma_release_core_dev; 
    18212937                core->dev.bus = &bcma_bus_type; 
     
    18252941                switch (bus->hosttype) { 
    18262942                case BCMA_HOSTTYPE_PCI: 
    1827 @@ -111,8 +127,9 @@ static int bcma_register_cores(struct bc 
     2943@@ -111,41 +163,75 @@ static int bcma_register_cores(struct bc 
    18282944  
    18292945                err = device_register(&core->dev); 
     
    18372953                } 
    18382954                core->dev_registered = true; 
    1839 @@ -132,20 +149,24 @@ static void bcma_unregister_cores(struct 
     2955                dev_id++; 
    18402956        } 
     2957  
     2958+       err = bcma_gpio_init(&bus->drv_cc); 
     2959+       if (err == -ENOTSUPP) 
     2960+               bcma_debug(bus, "GPIO driver not activated\n"); 
     2961+       else if (err) 
     2962+               bcma_err(bus, "Error registering GPIO driver: %i\n", err); 
     2963+ 
     2964+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) { 
     2965+               err = bcma_chipco_watchdog_register(&bus->drv_cc); 
     2966+               if (err) 
     2967+                       bcma_err(bus, "Error registering watchdog driver\n"); 
     2968+       } 
     2969+ 
     2970        return 0; 
     2971 } 
     2972  
     2973 static void bcma_unregister_cores(struct bcma_bus *bus) 
     2974 { 
     2975-       struct bcma_device *core; 
     2976+       struct bcma_device *core, *tmp; 
     2977  
     2978-       list_for_each_entry(core, &bus->cores, list) { 
     2979+       list_for_each_entry_safe(core, tmp, &bus->cores, list) { 
     2980+               list_del(&core->list); 
     2981                if (core->dev_registered) 
     2982                        device_unregister(&core->dev); 
     2983        } 
     2984+       if (bus->hosttype == BCMA_HOSTTYPE_SOC) 
     2985+               platform_device_unregister(bus->drv_cc.watchdog); 
    18412986 } 
    18422987  
     
    18593004        } 
    18603005  
     3006+       /* Early init CC core */ 
     3007+       core = bcma_find_core(bus, bcma_cc_core_id(bus)); 
     3008+       if (core) { 
     3009+               bus->drv_cc.core = core; 
     3010+               bcma_core_chipcommon_early_init(&bus->drv_cc); 
     3011+       } 
     3012+ 
     3013+       /* Try to get SPROM */ 
     3014+       err = bcma_sprom_get(bus); 
     3015+       if (err == -ENOENT) { 
     3016+               bcma_err(bus, "No SPROM available\n"); 
     3017+       } else if (err) 
     3018+               bcma_err(bus, "Failed to get SPROM: %d\n", err); 
     3019+ 
    18613020        /* Init CC core */ 
    18623021-       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     
    18653024                bus->drv_cc.core = core; 
    18663025                bcma_core_chipcommon_init(&bus->drv_cc); 
    1867 @@ -165,17 +186,24 @@ int bcma_bus_register(struct bcma_bus *b 
    1868                 bcma_core_pci_init(&bus->drv_pci); 
     3026@@ -159,30 +245,54 @@ int bcma_bus_register(struct bcma_bus *b 
    18693027        } 
    18703028  
     3029        /* Init PCIE core */ 
     3030-       core = bcma_find_core(bus, BCMA_CORE_PCIE); 
     3031+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 0); 
     3032        if (core) { 
     3033-               bus->drv_pci.core = core; 
     3034-               bcma_core_pci_init(&bus->drv_pci); 
     3035+               bus->drv_pci[0].core = core; 
     3036+               bcma_core_pci_init(&bus->drv_pci[0]); 
     3037        } 
     3038  
     3039-       /* Try to get SPROM */ 
     3040-       err = bcma_sprom_get(bus); 
     3041-       if (err == -ENOENT) { 
     3042-               pr_err("No SPROM available\n"); 
     3043-       } else if (err) 
     3044-               pr_err("Failed to get SPROM: %d\n", err); 
     3045+       /* Init PCIE core */ 
     3046+       core = bcma_find_core_unit(bus, BCMA_CORE_PCIE, 1); 
     3047+       if (core) { 
     3048+               bus->drv_pci[1].core = core; 
     3049+               bcma_core_pci_init(&bus->drv_pci[1]); 
     3050+       } 
     3051+ 
    18713052+       /* Init GBIT MAC COMMON core */ 
    18723053+       core = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     
    18753056+               bcma_core_gmac_cmn_init(&bus->drv_gmac_cmn); 
    18763057+       } 
    1877 + 
    1878         /* Try to get SPROM */ 
    1879         err = bcma_sprom_get(bus); 
    1880         if (err == -ENOENT) { 
    1881 -               pr_err("No SPROM available\n"); 
    1882 +               bcma_err(bus, "No SPROM available\n"); 
    1883         } else if (err) 
    1884 -               pr_err("Failed to get SPROM: %d\n", err); 
    1885 +               bcma_err(bus, "Failed to get SPROM: %d\n", err); 
    18863058  
    18873059        /* Register found cores */ 
     
    18933065        return 0; 
    18943066 } 
    1895 @@ -196,14 +224,14 @@ int __init bcma_bus_early_register(struc 
     3067  
     3068 void bcma_bus_unregister(struct bcma_bus *bus) 
     3069 { 
     3070+       struct bcma_device *cores[3]; 
     3071+       int err; 
     3072+ 
     3073+       err = bcma_gpio_unregister(&bus->drv_cc); 
     3074+       if (err == -EBUSY) 
     3075+               bcma_err(bus, "Some GPIOs are still in use.\n"); 
     3076+       else if (err) 
     3077+               bcma_err(bus, "Can not unregister GPIO driver: %i\n", err); 
     3078+ 
     3079+       cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     3080+       cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE); 
     3081+       cores[2] = bcma_find_core(bus, BCMA_CORE_4706_MAC_GBIT_COMMON); 
     3082+ 
     3083        bcma_unregister_cores(bus); 
     3084+ 
     3085+       kfree(cores[2]); 
     3086+       kfree(cores[1]); 
     3087+       kfree(cores[0]); 
     3088 } 
     3089  
     3090 int __init bcma_bus_early_register(struct bcma_bus *bus, 
     3091@@ -196,14 +306,14 @@ int __init bcma_bus_early_register(struc 
    18963092        bcma_init_bus(bus); 
    18973093  
     
    19103106        } 
    19113107  
    1912 @@ -215,12 +243,12 @@ int __init bcma_bus_early_register(struc 
     3108@@ -215,25 +325,25 @@ int __init bcma_bus_early_register(struc 
    19133109        /* Scan for mips core */ 
    19143110        err = bcma_bus_scan_early(bus, &match, core_mips); 
     
    19193115        } 
    19203116  
    1921         /* Init CC core */ 
     3117-       /* Init CC core */ 
    19223118-       core = bcma_find_core(bus, BCMA_CORE_CHIPCOMMON); 
     3119+       /* Early init CC core */ 
    19233120+       core = bcma_find_core(bus, bcma_cc_core_id(bus)); 
    19243121        if (core) { 
    19253122                bus->drv_cc.core = core; 
    1926                 bcma_core_chipcommon_init(&bus->drv_cc); 
    1927 @@ -233,7 +261,7 @@ int __init bcma_bus_early_register(struc 
    1928                 bcma_core_mips_init(&bus->drv_mips); 
     3123-               bcma_core_chipcommon_init(&bus->drv_cc); 
     3124+               bcma_core_chipcommon_early_init(&bus->drv_cc); 
     3125        } 
     3126  
     3127-       /* Init MIPS core */ 
     3128+       /* Early init MIPS core */ 
     3129        core = bcma_find_core(bus, BCMA_CORE_MIPS_74K); 
     3130        if (core) { 
     3131                bus->drv_mips.core = core; 
     3132-               bcma_core_mips_init(&bus->drv_mips); 
     3133+               bcma_core_mips_early_init(&bus->drv_mips); 
    19293134        } 
    19303135  
     
    19343139        return 0; 
    19353140 } 
    1936 @@ -259,8 +287,7 @@ int bcma_bus_resume(struct bcma_bus *bus 
     3141@@ -259,8 +369,7 @@ int bcma_bus_resume(struct bcma_bus *bus 
    19373142        struct bcma_device *core; 
    19383143  
     
    20003205        { BCMA_CORE_DDR12_MEM_CTL, "DDR1/DDR2 Memory Controller" }, 
    20013206        { BCMA_CORE_PCIE_RC, "PCIe Root Complex" }, 
    2002 @@ -79,16 +86,41 @@ struct bcma_device_id_name bcma_device_n 
     3207@@ -77,18 +84,45 @@ struct bcma_device_id_name bcma_device_n 
     3208        { BCMA_CORE_I2S, "I2S" }, 
     3209        { BCMA_CORE_SDR_DDR1_MEM_CTL, "SDR/DDR1 Memory Controller" }, 
    20033210        { BCMA_CORE_SHIM, "SHIM" }, 
     3211+       { BCMA_CORE_PCIE2, "PCIe Gen2" }, 
     3212+       { BCMA_CORE_ARM_CR4, "ARM CR4" }, 
    20043213        { BCMA_CORE_DEFAULT, "Default" }, 
    20053214 }; 
     
    20393248+       default: 
    20403249+               return "UNKNOWN"; 
    2041 +       } 
     3250        } 
    20423251+ 
    20433252+       for (i = 0; i < size; i++) { 
    20443253+               if (names[i].id == id->id) 
    20453254+                       return names[i].name; 
    2046         } 
     3255+       } 
    20473256+ 
    20483257        return "UNKNOWN"; 
    20493258 } 
    20503259  
    2051 @@ -212,6 +244,17 @@ static struct bcma_device *bcma_find_cor 
     3260@@ -105,19 +139,19 @@ static void bcma_scan_switch_core(struct 
     3261                                       addr); 
     3262 } 
     3263  
     3264-static u32 bcma_erom_get_ent(struct bcma_bus *bus, u32 **eromptr) 
     3265+static u32 bcma_erom_get_ent(struct bcma_bus *bus, u32 __iomem **eromptr) 
     3266 { 
     3267        u32 ent = readl(*eromptr); 
     3268        (*eromptr)++; 
     3269        return ent; 
     3270 } 
     3271  
     3272-static void bcma_erom_push_ent(u32 **eromptr) 
     3273+static void bcma_erom_push_ent(u32 __iomem **eromptr) 
     3274 { 
     3275        (*eromptr)--; 
     3276 } 
     3277  
     3278-static s32 bcma_erom_get_ci(struct bcma_bus *bus, u32 **eromptr) 
     3279+static s32 bcma_erom_get_ci(struct bcma_bus *bus, u32 __iomem **eromptr) 
     3280 { 
     3281        u32 ent = bcma_erom_get_ent(bus, eromptr); 
     3282        if (!(ent & SCAN_ER_VALID)) 
     3283@@ -127,14 +161,14 @@ static s32 bcma_erom_get_ci(struct bcma_ 
     3284        return ent; 
     3285 } 
     3286  
     3287