net: wireless: bcmdhd: Set MMC_PM_KEEP_POWER flag on suspend
authorDmitry Shmidt <dimitrysh@google.com>
Wed, 2 May 2012 21:25:59 +0000 (14:25 -0700)
committerDmitry Shmidt <dimitrysh@google.com>
Wed, 2 May 2012 21:30:35 +0000 (14:30 -0700)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c

index 602523df72c92ec8f1f7539b5e0a05d538ebcd83..a78faebe2e7ac7e7fbea1dd4ecf00d6a71e99863 100644 (file)
@@ -178,6 +178,8 @@ MODULE_DEVICE_TABLE(sdio, bcmsdh_sdmmc_ids);
 static int bcmsdh_sdmmc_suspend(struct device *pdev)
 {
        struct sdio_func *func = dev_to_sdio_func(pdev);
+       mmc_pm_flag_t sdio_flags;
+       int ret;
 
        if (func->num != 2)
                return 0;
@@ -186,6 +188,21 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev)
 
        if (dhd_os_check_wakelock(bcmsdh_get_drvdata()))
                return -EBUSY;
+
+       sdio_flags = sdio_get_host_pm_caps(func);
+
+       if (!(sdio_flags & MMC_PM_KEEP_POWER)) {
+               sd_err(("%s: can't keep power while host is suspended\n", __FUNCTION__));
+               return  -EINVAL;
+       }
+
+       /* keep power while host suspended */
+       ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
+       if (ret) {
+               sd_err(("%s: error while trying to keep power\n", __FUNCTION__));
+               return ret;
+       }
+
 #if defined(OOB_INTR_ONLY)
        bcmsdh_oob_intr_set(0);
 #endif /* defined(OOB_INTR_ONLY) */