diff options
author | Rakesh Kumar <krakesh@nvidia.com> | 2012-03-05 14:48:07 +0530 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-03-06 18:03:43 -0800 |
commit | 00cd4042de02f2f10f5e0e59ef7df2c6826f9401 (patch) | |
tree | f6f2bd037884737659fbc52b2071f5818d9961b3 /drivers/net/wireless | |
parent | 080f0ec0b61087f61249aaa15b0a873bac86d287 (diff) |
drivers: wireless: bcm4329: set MMC_PM_KEEP_POWER on suspend
MMC_PM_KEEP_POWER should be set before each suspend/resume cycle as
mmc drivers clears MMC_PM_KEEP_POWER from pm_flags on resume.
Bug 942826
Change-Id: Ie11c661bdc3450cc4e75fa7700b96aedc69d628a
Signed-off-by: Rakesh Kumar <krakesh@nvidia.com>
Reviewed-on: http://git-master/r/87703
Reviewed-by: Rakesh Goyal <rgoyal@nvidia.com>
Tested-by: Rakesh Goyal <rgoyal@nvidia.com>
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/bcm4329/bcmsdh_sdmmc_linux.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/wireless/bcm4329/bcmsdh_sdmmc_linux.c b/drivers/net/wireless/bcm4329/bcmsdh_sdmmc_linux.c index 5a1a46c93571..b1fc35b77836 100644 --- a/drivers/net/wireless/bcm4329/bcmsdh_sdmmc_linux.c +++ b/drivers/net/wireless/bcm4329/bcmsdh_sdmmc_linux.c @@ -141,11 +141,58 @@ static const struct sdio_device_id bcmsdh_sdmmc_ids[] = { MODULE_DEVICE_TABLE(sdio, bcmsdh_sdmmc_ids); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) +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; + + 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; + } + +out: + return ret; +} + +static int bcmsdh_sdmmc_resume(struct device *pdev) +{ + /* nothing to do since MMC_PM_KEEP_POWER is cleared by MMC stack */ + return 0; +} + +static const struct dev_pm_ops bcmsdh_sdmmc_pm_ops = { + .suspend = bcmsdh_sdmmc_suspend, + .resume = bcmsdh_sdmmc_resume, +}; +#endif + static struct sdio_driver bcmsdh_sdmmc_driver = { .probe = bcmsdh_sdmmc_probe, .remove = bcmsdh_sdmmc_remove, .name = "bcmsdh_sdmmc", .id_table = bcmsdh_sdmmc_ids, +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 39)) && defined(CONFIG_PM) + .drv = { + .pm = &bcmsdh_sdmmc_pm_ops, + }, +#endif }; struct sdos_info { |