summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth
diff options
context:
space:
mode:
authorChen-Yu Tsai <wens@csie.org>2019-03-31 23:43:12 -0400
committerMarcel Holtmann <marcel@holtmann.org>2019-04-23 13:28:20 -0400
commit62611abc8f37d00e3b0cff0eb2d72fa92b05fd27 (patch)
tree239136f6fa2334582545073688aeffe2d7d62666 /drivers/bluetooth
parentcd9151b618da4723877bd94eae952f2e50acbc0e (diff)
Bluetooth: hci_bcm: Fix empty regulator supplies for Intel Macs
The code path for Macs goes through bcm_apple_get_resources(), which skips over the code that sets up the regulator supplies. As a result, the call to regulator_bulk_enable() / regulator_bulk_disable() results in a NULL pointer dereference. This was reported on the kernel.org Bugzilla, bug 202963. Unbreak Broadcom Bluetooth support on Intel Macs by checking if the supplies were set up before enabling or disabling them. The same does not need to be done for the clocks, as the common clock framework API checks for NULL pointers. Fixes: 75d11676dccb ("Bluetooth: hci_bcm: Add support for regulator supplies") Cc: <stable@vger.kernel.org> # 5.0.x Signed-off-by: Chen-Yu Tsai <wens@csie.org> Tested-by: Imre Kaloz <kaloz@openwrt.org> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'drivers/bluetooth')
-rw-r--r--drivers/bluetooth/hci_bcm.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c
index ddbe518c3e5b..b5d31d583d60 100644
--- a/drivers/bluetooth/hci_bcm.c
+++ b/drivers/bluetooth/hci_bcm.c
@@ -228,9 +228,15 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
228 int err; 228 int err;
229 229
230 if (powered && !dev->res_enabled) { 230 if (powered && !dev->res_enabled) {
231 err = regulator_bulk_enable(BCM_NUM_SUPPLIES, dev->supplies); 231 /* Intel Macs use bcm_apple_get_resources() and don't
232 if (err) 232 * have regulator supplies configured.
233 return err; 233 */
234 if (dev->supplies[0].supply) {
235 err = regulator_bulk_enable(BCM_NUM_SUPPLIES,
236 dev->supplies);
237 if (err)
238 return err;
239 }
234 240
235 /* LPO clock needs to be 32.768 kHz */ 241 /* LPO clock needs to be 32.768 kHz */
236 err = clk_set_rate(dev->lpo_clk, 32768); 242 err = clk_set_rate(dev->lpo_clk, 32768);
@@ -259,7 +265,13 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
259 if (!powered && dev->res_enabled) { 265 if (!powered && dev->res_enabled) {
260 clk_disable_unprepare(dev->txco_clk); 266 clk_disable_unprepare(dev->txco_clk);
261 clk_disable_unprepare(dev->lpo_clk); 267 clk_disable_unprepare(dev->lpo_clk);
262 regulator_bulk_disable(BCM_NUM_SUPPLIES, dev->supplies); 268
269 /* Intel Macs use bcm_apple_get_resources() and don't
270 * have regulator supplies configured.
271 */
272 if (dev->supplies[0].supply)
273 regulator_bulk_disable(BCM_NUM_SUPPLIES,
274 dev->supplies);
263 } 275 }
264 276
265 /* wait for device to power on and come out of reset */ 277 /* wait for device to power on and come out of reset */