diff options
author | Rakesh Kumar <krakesh@nvidia.com> | 2012-03-02 16:16:24 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-02 23:19:09 -0800 |
commit | 3b49c5b5cffdfc52ab480c4d79cb6aab4309cae1 (patch) | |
tree | 7b15724a2861ee0afe765a76bc8e37d93afcdad0 /drivers/net/wireless | |
parent | 34822909bd95327a6903fd4a466a30ea38683fb0 (diff) |
drvers: wireless: bcmdhd: set MMC_PM_KEEP_POWER on suspend
MMC_PM_KEEP_POWER should be set before each suspend/resume cyble as
mmc drivers clears MMC_PM_KEEP_POWER from pm_flags on resume.
Bug 942826
Change-Id: Ifc647b500d744a37206a4879f1e3df495bc4123a
Signed-off-by: Rakesh Goyal <rgoyal@nvidia.com>
Reviewed-on: http://git-master/r/87208
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c index 726b6391353d..6ec4a7532e4a 100644 --- a/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcmdhd/bcmsdh_sdmmc_linux.c @@ -163,6 +163,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 = 0; if (func->num != 2) return 0; @@ -171,10 +173,28 @@ static int bcmsdh_sdmmc_suspend(struct device *pdev) #if defined(OOB_INTR_ONLY) bcmsdh_oob_intr_set(0); #endif - dhd_mmc_suspend = TRUE; smp_mb(); - return 0; + sdio_flags = sdio_get_host_pm_caps(func); + + if (!(sdio_flags & MMC_PM_KEEP_POWER)) { + sd_err(("can't keep power while host " + "is suspended\n", __FUNCTION__)); + ret = -EINVAL; + goto out; + } + + /* keep power while host suspended */ + ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); + if (ret) { + sd_err(("error while trying to keep power\n", __FUNCTION__)); + goto out; + } + + dhd_mmc_suspend = TRUE; + +out: + return ret; } static int bcmsdh_sdmmc_resume(struct device *pdev) |