Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[linux-2.6-block.git] / drivers / bluetooth / btmrvl_sdio.c
index e65ca19970eaf3875f2a47128536e434710755ee..eb794f08b2385bfcb2162531cee4fbaa62c818fd 100644 (file)
@@ -64,11 +64,9 @@ static irqreturn_t btmrvl_wake_irq_bt(int irq, void *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__);
-               cfg->wake_by_bt = true;
-               disable_irq_nosync(irq);
-       }
+       pr_info("%s: wake by bt", __func__);
+       cfg->wake_by_bt = true;
+       disable_irq_nosync(irq);
 
        pm_wakeup_event(&card->func->dev, 0);
        pm_system_wakeup();
@@ -1630,6 +1628,13 @@ static int btmrvl_sdio_suspend(struct device *dev)
        if (priv->adapter->hs_state != HS_ACTIVATED) {
                if (btmrvl_enable_hs(priv)) {
                        BT_ERR("HS not activated, suspend failed!");
+                       /* Disable platform specific wakeup interrupt */
+                       if (card->plt_wake_cfg &&
+                           card->plt_wake_cfg->irq_bt >= 0) {
+                               disable_irq_wake(card->plt_wake_cfg->irq_bt);
+                               disable_irq(card->plt_wake_cfg->irq_bt);
+                       }
+
                        priv->adapter->is_suspending = false;
                        return -EBUSY;
                }
@@ -1642,10 +1647,10 @@ static int btmrvl_sdio_suspend(struct device *dev)
        if (priv->adapter->hs_state == HS_ACTIVATED) {
                BT_DBG("suspend with MMC_PM_KEEP_POWER");
                return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
-       } else {
-               BT_DBG("suspend without MMC_PM_KEEP_POWER");
-               return 0;
        }
+
+       BT_DBG("suspend without MMC_PM_KEEP_POWER");
+       return 0;
 }
 
 static int btmrvl_sdio_resume(struct device *dev)