#include <linux/firmware.h>
 #include <linux/slab.h>
+#include <linux/suspend.h>
 
 #include <linux/mmc/sdio_ids.h>
 #include <linux/mmc/sdio_func.h>
 
 static irqreturn_t btmrvl_wake_irq_bt(int irq, void *priv)
 {
-       struct btmrvl_plt_wake_cfg *cfg = priv;
+       struct btmrvl_sdio_card *card = priv;
+       struct btmrvl_plt_wake_cfg *cfg = card->plt_wake_cfg;
 
        if (cfg->irq_bt >= 0) {
                pr_info("%s: wake by bt", __func__);
                disable_irq_nosync(irq);
        }
 
+       pm_wakeup_event(&card->func->dev, 0);
+       pm_system_wakeup();
+
        return IRQ_HANDLED;
 }
 
                } else {
                        ret = devm_request_irq(dev, cfg->irq_bt,
                                               btmrvl_wake_irq_bt,
-                                              0, "bt_wake", cfg);
+                                              0, "bt_wake", card);
                        if (ret) {
                                dev_err(dev,
                                        "Failed to request irq_bt %d (%d)\n",