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 <abhishekpan...@chromium.org>
Reviewed-by: Douglas Anderson <diand...@chromium.org>
---

 drivers/bluetooth/btmrvl_sdio.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 4c7978cb1786fc..cfb9f9db44a0d9 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -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)
-- 
2.27.0.278.ge193c7cf3a9-goog

Reply via email to