Bluetooth: btmrvl_sdio: Refactor irq wakeup
authorAbhishek Pandit-Subedi <abhishekpandit@chromium.org>
Thu, 11 Jun 2020 01:53:55 +0000 (18:53 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 12 Jun 2020 06:38:52 +0000 (08:38 +0200)
Use device_init_wakeup to allow the Bluetooth dev to wake the system
from suspend. Currently, the device can wake the system but no
power/wakeup entry is created in sysfs to allow userspace to disable
wakeup.

Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btmrvl_sdio.c

index 4c7978c..cfb9f9d 100644 (file)
@@ -111,6 +111,9 @@ static int btmrvl_sdio_probe_of(struct device *dev,
                                        "Failed to request irq_bt %d (%d)\n",
                                        cfg->irq_bt, ret);
                        }
+
+                       /* Configure wakeup (enabled by default) */
+                       device_init_wakeup(dev, true);
                        disable_irq(cfg->irq_bt);
                }
        }
@@ -1654,6 +1657,7 @@ static void btmrvl_sdio_remove(struct sdio_func *func)
                                                        MODULE_SHUTDOWN_REQ);
                                btmrvl_sdio_disable_host_int(card);
                        }
+
                        BT_DBG("unregister dev");
                        card->priv->surprise_removed = true;
                        btmrvl_sdio_unregister_dev(card);
@@ -1690,7 +1694,8 @@ static int btmrvl_sdio_suspend(struct device *dev)
        }
 
        /* Enable platform specific wakeup interrupt */
-       if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
+       if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0 &&
+           device_may_wakeup(dev)) {
                card->plt_wake_cfg->wake_by_bt = false;
                enable_irq(card->plt_wake_cfg->irq_bt);
                enable_irq_wake(card->plt_wake_cfg->irq_bt);
@@ -1707,7 +1712,8 @@ static int btmrvl_sdio_suspend(struct device *dev)
                        BT_ERR("HS not activated, suspend failed!");
                        /* Disable platform specific wakeup interrupt */
                        if (card->plt_wake_cfg &&
-                           card->plt_wake_cfg->irq_bt >= 0) {
+                           card->plt_wake_cfg->irq_bt >= 0 &&
+                           device_may_wakeup(dev)) {
                                disable_irq_wake(card->plt_wake_cfg->irq_bt);
                                disable_irq(card->plt_wake_cfg->irq_bt);
                        }
@@ -1767,7 +1773,8 @@ static int btmrvl_sdio_resume(struct device *dev)
        hci_resume_dev(hcidev);
 
        /* Disable platform specific wakeup interrupt */
-       if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0) {
+       if (card->plt_wake_cfg && card->plt_wake_cfg->irq_bt >= 0 &&
+           device_may_wakeup(dev)) {
                disable_irq_wake(card->plt_wake_cfg->irq_bt);
                disable_irq(card->plt_wake_cfg->irq_bt);
                if (card->plt_wake_cfg->wake_by_bt)