• Lukas Wunner's avatar
    Bluetooth: hci_bcm: Mandate presence of shutdown and device wake GPIO · 3e81a4ca
    Lukas Wunner authored
    Commit 0395ffc1 ("Bluetooth: hci_bcm: Add PM for BCM devices")
    amended this driver to request a shutdown and device wake GPIO on probe,
    but mandated that only one of them need to be present:
    
    	/* Make sure at-least one of the GPIO is defined and that
    	 * a name is specified for this instance
    	 */
    	if ((!dev->device_wakeup && !dev->shutdown) || !dev->name) {
    		dev_err(&pdev->dev, "invalid platform data\n");
    		return -EINVAL;
    	}
    
    However the same commit added a call to bcm_gpio_set_power() to the
    ->probe hook, which unconditionally accesses *both* GPIOs.  Luckily,
    the resulting NULL pointer deref was never reported, suggesting there's
    no machine where either GPIO is missing.
    
    Commit 8a920568 ("Bluetooth: hci_bcm: Add (runtime)pm support to the
    serdev driver") removed the check whether at least one of the GPIOs is
    present without specifying a reason.
    
    Because commit 62aaefa7 ("Bluetooth: hci_bcm: improve use of gpios
    API") refactored the driver to use devm_gpiod_get_optional() instead of
    devm_gpiod_get(), one is now tempted to believe that the driver doesn't
    require *any* of the two GPIOs.
    
    Which is wrong, the driver still requires both GPIOs to avoid a NULL
    pointer deref.  To this end, establish the status quo ante and request
    the GPIOs with devm_gpiod_get() again.  Bail out of ->probe if either
    of them is missing.
    
    Oddly enough, whereas bcm_gpio_set_power() accesses the device wake pin
    unconditionally, bcm_suspend_device() and bcm_resume_device() do check
    for its presence before accessing it.  Those checks are superfluous,
    so remove them.
    
    Cc: Frédéric Danis <frederic.danis.oss@gmail.com>
    Cc: Loic Poulain <loic.poulain@linaro.org>
    Cc: Hans de Goede <hdegoede@redhat.com>
    Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    3e81a4ca
hci_bcm.c 24 KB