|
@@ -63,6 +63,8 @@
|
|
|
* deassert = Bluetooth device may sleep when sleep criteria are met
|
|
|
* @shutdown: BT_REG_ON pin,
|
|
|
* power up or power down Bluetooth device internal regulators
|
|
|
+ * @set_device_wakeup: callback to toggle BT_WAKE pin
|
|
|
+ * @set_shutdown: callback to toggle BT_REG_ON pin
|
|
|
* @clk: clock used by Bluetooth device
|
|
|
* @clk_enabled: whether @clk is prepared and enabled
|
|
|
* @init_speed: default baudrate of Bluetooth device;
|
|
@@ -86,6 +88,8 @@ struct bcm_device {
|
|
|
const char *name;
|
|
|
struct gpio_desc *device_wakeup;
|
|
|
struct gpio_desc *shutdown;
|
|
|
+ int (*set_device_wakeup)(struct bcm_device *, bool);
|
|
|
+ int (*set_shutdown)(struct bcm_device *, bool);
|
|
|
|
|
|
struct clk *clk;
|
|
|
bool clk_enabled;
|
|
@@ -196,8 +200,8 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered)
|
|
|
if (powered && !IS_ERR(dev->clk) && !dev->clk_enabled)
|
|
|
clk_prepare_enable(dev->clk);
|
|
|
|
|
|
- gpiod_set_value(dev->shutdown, powered);
|
|
|
- gpiod_set_value(dev->device_wakeup, powered);
|
|
|
+ dev->set_shutdown(dev, powered);
|
|
|
+ dev->set_device_wakeup(dev, powered);
|
|
|
|
|
|
if (!powered && !IS_ERR(dev->clk) && dev->clk_enabled)
|
|
|
clk_disable_unprepare(dev->clk);
|
|
@@ -595,7 +599,7 @@ static int bcm_suspend_device(struct device *dev)
|
|
|
}
|
|
|
|
|
|
/* Suspend the device */
|
|
|
- gpiod_set_value(bdev->device_wakeup, false);
|
|
|
+ bdev->set_device_wakeup(bdev, false);
|
|
|
bt_dev_dbg(bdev, "suspend, delaying 15 ms");
|
|
|
mdelay(15);
|
|
|
|
|
@@ -608,7 +612,7 @@ static int bcm_resume_device(struct device *dev)
|
|
|
|
|
|
bt_dev_dbg(bdev, "");
|
|
|
|
|
|
- gpiod_set_value(bdev->device_wakeup, true);
|
|
|
+ bdev->set_device_wakeup(bdev, true);
|
|
|
bt_dev_dbg(bdev, "resume, delaying 15 ms");
|
|
|
mdelay(15);
|
|
|
|
|
@@ -787,6 +791,18 @@ static int bcm_resource(struct acpi_resource *ares, void *data)
|
|
|
}
|
|
|
#endif /* CONFIG_ACPI */
|
|
|
|
|
|
+static int bcm_gpio_set_device_wakeup(struct bcm_device *dev, bool awake)
|
|
|
+{
|
|
|
+ gpiod_set_value(dev->device_wakeup, awake);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int bcm_gpio_set_shutdown(struct bcm_device *dev, bool powered)
|
|
|
+{
|
|
|
+ gpiod_set_value(dev->shutdown, powered);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int bcm_get_resources(struct bcm_device *dev)
|
|
|
{
|
|
|
dev->name = dev_name(dev->dev);
|
|
@@ -802,6 +818,9 @@ static int bcm_get_resources(struct bcm_device *dev)
|
|
|
if (IS_ERR(dev->shutdown))
|
|
|
return PTR_ERR(dev->shutdown);
|
|
|
|
|
|
+ dev->set_device_wakeup = bcm_gpio_set_device_wakeup;
|
|
|
+ dev->set_shutdown = bcm_gpio_set_shutdown;
|
|
|
+
|
|
|
/* IRQ can be declared in ACPI table as Interrupt or GpioInt */
|
|
|
if (dev->irq <= 0) {
|
|
|
struct gpio_desc *gpio;
|