|
|
@@ -934,6 +934,10 @@ static int mmc_sdio_pre_suspend(struct mmc_host *host)
|
|
|
*/
|
|
|
static int mmc_sdio_suspend(struct mmc_host *host)
|
|
|
{
|
|
|
+ /* Prevent processing of SDIO IRQs in suspended state. */
|
|
|
+ mmc_card_set_suspended(host->card);
|
|
|
+ cancel_delayed_work_sync(&host->sdio_irq_work);
|
|
|
+
|
|
|
mmc_claim_host(host);
|
|
|
|
|
|
if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host))
|
|
|
@@ -982,13 +986,20 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
|
|
err = sdio_enable_4bit_bus(host->card);
|
|
|
}
|
|
|
|
|
|
- if (!err && host->sdio_irqs) {
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Allow SDIO IRQs to be processed again. */
|
|
|
+ mmc_card_clr_suspended(host->card);
|
|
|
+
|
|
|
+ if (host->sdio_irqs) {
|
|
|
if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD))
|
|
|
wake_up_process(host->sdio_irq_thread);
|
|
|
else if (host->caps & MMC_CAP_SDIO_IRQ)
|
|
|
host->ops->enable_sdio_irq(host, 1);
|
|
|
}
|
|
|
|
|
|
+out:
|
|
|
mmc_release_host(host);
|
|
|
|
|
|
host->pm_flags &= ~MMC_PM_KEEP_POWER;
|