bcma: complete workaround for BCMA43224 and BCM4313
authorHauke Mehrtens <hauke@hauke-m.de>
Fri, 29 Jun 2012 23:44:41 +0000 (01:44 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 9 Jul 2012 20:36:04 +0000 (16:36 -0400)
This code is based on the Broadcom SDK and brcmsmac.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/driver_chipcommon_pmu.c
include/linux/bcma/bcma_driver_chipcommon.h

index 2d9ac3e325ae95c16b9dc55bc2c7b63568bb05c3..a8fcdf0222eb0d7eb21670267ce0bd98f5a92829 100644 (file)
@@ -139,7 +139,11 @@ void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
 
        switch (bus->chipinfo.id) {
        case BCMA_CHIP_ID_BCM4313:
-               bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7);
+               /* enable 12 mA drive strenth for 4313 and set chipControl
+                  register bit 1 */
+               bcma_chipco_chipctl_maskset(cc, 0,
+                                           BCMA_CCTRL_4313_12MA_LED_DRIVE,
+                                           BCMA_CCTRL_4313_12MA_LED_DRIVE);
                break;
        case BCMA_CHIP_ID_BCM4331:
        case BCMA_CHIP_ID_BCM43431:
@@ -147,12 +151,20 @@ void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
                bcma_chipco_bcm4331_ext_pa_lines_ctl(cc, true);
                break;
        case BCMA_CHIP_ID_BCM43224:
+       case BCMA_CHIP_ID_BCM43421:
+               /* enable 12 mA drive strenth for 43224 and set chipControl
+                  register bit 15 */
                if (bus->chipinfo.rev == 0) {
-                       pr_err("Workarounds for 43224 rev 0 not fully "
-                               "implemented\n");
-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x00F000F0);
+                       bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL,
+                                         BCMA_CCTRL_43224_GPIO_TOGGLE,
+                                         BCMA_CCTRL_43224_GPIO_TOGGLE);
+                       bcma_chipco_chipctl_maskset(cc, 0,
+                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE,
+                                                   BCMA_CCTRL_43224A0_12MA_LED_DRIVE);
                } else {
-                       bcma_chipco_chipctl_maskset(cc, 0, ~0, 0xF0);
+                       bcma_chipco_chipctl_maskset(cc, 0,
+                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE,
+                                                   BCMA_CCTRL_43224B0_12MA_LED_DRIVE);
                }
                break;
        case BCMA_CHIP_ID_BCM43225:
index 1e523cc618606f64d4a5c3d6848b3277c28d175c..09f31ade141049b708e375eac3d95c0d7e76c28b 100644 (file)
 #define BCMA_CHIPCTL_4331_BT_SHD0_ON_GPIO4     BIT(16) /* enable bt_shd0 at gpio4 */
 #define BCMA_CHIPCTL_4331_BT_SHD1_ON_GPIO5     BIT(17) /* enable bt_shd1 at gpio5 */
 
+/* 43224 chip-specific ChipControl register bits */
+#define BCMA_CCTRL_43224_GPIO_TOGGLE           0x8000          /* gpio[3:0] pins as btcoex or s/w gpio */
+#define BCMA_CCTRL_43224A0_12MA_LED_DRIVE      0x00F000F0      /* 12 mA drive strength */
+#define BCMA_CCTRL_43224B0_12MA_LED_DRIVE      0xF0            /* 12 mA drive strength for later 43224s */
+
+/* 4313 Chip specific ChipControl register bits */
+#define BCMA_CCTRL_4313_12MA_LED_DRIVE         0x00000007      /* 12 mA drive strengh for later 4313 */
+
 /* Data for the PMU, if available.
  * Check availability with ((struct bcma_chipcommon)->capabilities & BCMA_CC_CAP_PMU)
  */