Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcma: fix invalid PMU chip control masks

Commit b9562545ef0b ("bcma: complete workaround for BCMA43224 and
BCM4313") introduced the wrong masks for setting the chip control
registers - the "mask" parameter is inverse.

It should be the mask of bits *not* changed, which is admittedly a bit
non-intuitive.

The incorrect mask not only causes the driver to not work correctly on
the chips affected (eg the BCM43224 on the Macbook Air 4,2) but the
state persists over a soft reset, causing the next boot to not
necessarily see the device correctly.

Reported-and-tested-by: Linus Torvalds <torvalds@linux-foundation.org>
Tested-by: Seth Forshee <seth.forshee@canonical.com>
Cc: Hauke Mehrtens <hauke@hauke-m.de>
Cc: Arend Van Spriel <arend@broadcom.com>
Cc: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Cc: Brett Rudley <brudley@broadcom.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Hauke Mehrtens and committed by
Linus Torvalds
1f03bf06 b84382f5

+4 -4
+4 -4
drivers/bcma/driver_chipcommon_pmu.c
··· 110 110 /* enable 12 mA drive strenth for 4313 and set chipControl 111 111 register bit 1 */ 112 112 bcma_chipco_chipctl_maskset(cc, 0, 113 - BCMA_CCTRL_4313_12MA_LED_DRIVE, 113 + ~BCMA_CCTRL_4313_12MA_LED_DRIVE, 114 114 BCMA_CCTRL_4313_12MA_LED_DRIVE); 115 115 break; 116 116 case BCMA_CHIP_ID_BCM4331: ··· 124 124 register bit 15 */ 125 125 if (bus->chipinfo.rev == 0) { 126 126 bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL, 127 - BCMA_CCTRL_43224_GPIO_TOGGLE, 127 + ~BCMA_CCTRL_43224_GPIO_TOGGLE, 128 128 BCMA_CCTRL_43224_GPIO_TOGGLE); 129 129 bcma_chipco_chipctl_maskset(cc, 0, 130 - BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 130 + ~BCMA_CCTRL_43224A0_12MA_LED_DRIVE, 131 131 BCMA_CCTRL_43224A0_12MA_LED_DRIVE); 132 132 } else { 133 133 bcma_chipco_chipctl_maskset(cc, 0, 134 - BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 134 + ~BCMA_CCTRL_43224B0_12MA_LED_DRIVE, 135 135 BCMA_CCTRL_43224B0_12MA_LED_DRIVE); 136 136 } 137 137 break;