Skip to content

Commit 8353b4a

Browse files
l1kholtmann
authored andcommitted
Bluetooth: hci_bcm: Add callbacks to toggle GPIOs
MacBooks provides custom ACPI methods to toggle the GPIOs for device wake and shutdown instead of accessing the pins directly. Prepare for their support by adding callbacks to toggle the GPIOs, which on non-Macs do nothing more but call gpiod_set_value(). No functional change intended. Suggested-and-reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Lukas Wunner <lukas@wunner.de> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
1 parent b7c2aba commit 8353b4a

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

drivers/bluetooth/hci_bcm.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
* deassert = Bluetooth device may sleep when sleep criteria are met
6464
* @shutdown: BT_REG_ON pin,
6565
* power up or power down Bluetooth device internal regulators
66+
* @set_device_wakeup: callback to toggle BT_WAKE pin
67+
* @set_shutdown: callback to toggle BT_REG_ON pin
6668
* @clk: clock used by Bluetooth device
6769
* @clk_enabled: whether @clk is prepared and enabled
6870
* @init_speed: default baudrate of Bluetooth device;
@@ -86,6 +88,8 @@ struct bcm_device {
8688
const char *name;
8789
struct gpio_desc *device_wakeup;
8890
struct gpio_desc *shutdown;
91+
int (*set_device_wakeup)(struct bcm_device *, bool);
92+
int (*set_shutdown)(struct bcm_device *, bool);
8993

9094
struct clk *clk;
9195
bool clk_enabled;
@@ -196,8 +200,8 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
196200
if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled)
197201
clk_prepare_enable(dev->clk);
198202

199-
gpiod_set_value(dev->shutdown, powered);
200-
gpiod_set_value(dev->device_wakeup, powered);
203+
dev->set_shutdown(dev, powered);
204+
dev->set_device_wakeup(dev, powered);
201205

202206
if (!powered && !IS_ERR(dev->clk) && dev->clk_enabled)
203207
clk_disable_unprepare(dev->clk);
@@ -595,7 +599,7 @@ static int bcm_suspend_device(struct device *dev)
595599
}
596600

597601
/* Suspend the device */
598-
gpiod_set_value(bdev->device_wakeup, false);
602+
bdev->set_device_wakeup(bdev, false);
599603
bt_dev_dbg(bdev, "suspend, delaying 15 ms");
600604
mdelay(15);
601605

@@ -608,7 +612,7 @@ static int bcm_resume_device(struct device *dev)
608612

609613
bt_dev_dbg(bdev, "");
610614

611-
gpiod_set_value(bdev->device_wakeup, true);
615+
bdev->set_device_wakeup(bdev, true);
612616
bt_dev_dbg(bdev, "resume, delaying 15 ms");
613617
mdelay(15);
614618

@@ -787,6 +791,18 @@ static int bcm_resource(struct acpi_resource *ares, void *data)
787791
}
788792
#endif /* CONFIG_ACPI */
789793

794+
static int bcm_gpio_set_device_wakeup(struct bcm_device *dev, bool awake)
795+
{
796+
gpiod_set_value(dev->device_wakeup, awake);
797+
return 0;
798+
}
799+
800+
static int bcm_gpio_set_shutdown(struct bcm_device *dev, bool powered)
801+
{
802+
gpiod_set_value(dev->shutdown, powered);
803+
return 0;
804+
}
805+
790806
static int bcm_get_resources(struct bcm_device *dev)
791807
{
792808
dev->name = dev_name(dev->dev);
@@ -802,6 +818,9 @@ static int bcm_get_resources(struct bcm_device *dev)
802818
if (IS_ERR(dev->shutdown))
803819
return PTR_ERR(dev->shutdown);
804820

821+
dev->set_device_wakeup = bcm_gpio_set_device_wakeup;
822+
dev->set_shutdown = bcm_gpio_set_shutdown;
823+
805824
/* IRQ can be declared in ACPI table as Interrupt or GpioInt */
806825
if (dev->irq <= 0) {
807826
struct gpio_desc *gpio;

0 commit comments

Comments
 (0)