In sdio bus level runtime callback function, after call the driver's runtime suspend callback, we will check if the device supports a platform level power management, and if so, a proper power state is chosen by the corresponding platform callback and then set. Platform level runtime wakeup is also set, if device is enabled for runtime wakeup by its driver, it will be armed the ability to generate a wakeup event by the platform. Signed-off-by: Aaron Lu <aaron.lu@xxxxxxxxx> --- drivers/mmc/core/sdio_bus.c | 49 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index aaec9e2..d83dea8 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c @@ -23,6 +23,7 @@ #include "sdio_cis.h" #include "sdio_bus.h" +#include "sdio.h" #include "sdio_acpi.h" /* show configuration fields */ @@ -194,10 +195,54 @@ static int sdio_bus_remove(struct device *dev) } #ifdef CONFIG_PM + +static int sdio_bus_runtime_suspend(struct device *dev) +{ + int ret; + sdio_power_t state; + + ret = pm_generic_runtime_suspend(dev); + if (ret) + goto out; + + if (!platform_sdio_power_manageable(dev)) + goto out; + + platform_sdio_run_wake(dev, true); + + state = platform_sdio_choose_power_state(dev); + if (state == SDIO_POWER_ERROR) { + ret = -EIO; + goto out; + } + + ret = platform_sdio_set_power_state(dev, state); + +out: + return ret; +} + +static int sdio_bus_runtime_resume(struct device *dev) +{ + int ret; + + if (platform_sdio_power_manageable(dev)) { + platform_sdio_run_wake(dev, false); + ret = platform_sdio_set_power_state(dev, SDIO_D0); + if (ret) + goto out; + } + + ret = pm_generic_runtime_resume(dev); + +out: + return ret; +} + static const struct dev_pm_ops sdio_bus_pm_ops = { SET_RUNTIME_PM_OPS( - pm_generic_runtime_suspend, - pm_generic_runtime_resume, + sdio_bus_runtime_suspend, + sdio_bus_runtime_resume, pm_generic_runtime_idle ) }; -- 1.7.12.21.g871e293 -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html