diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index f077fc8219d0..cc43687ca241 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -1103,6 +1103,12 @@ int mmc_attach_sdio(struct mmc_host *host) * Enable runtime PM only if supported by host+card+board */ if (host->caps & MMC_CAP_POWER_OFF_CARD) { + /* + * Do not allow runtime suspend until after SDIO function + * devices are added. + */ + pm_runtime_get_noresume(&card->dev); + /* * Let runtime PM core know our card is active */ @@ -1155,6 +1161,9 @@ int mmc_attach_sdio(struct mmc_host *host) goto remove_added; } + if (host->caps & MMC_CAP_POWER_OFF_CARD) + pm_runtime_put(&card->dev); + mmc_claim_host(host); return 0; @@ -1164,7 +1173,9 @@ int mmc_attach_sdio(struct mmc_host *host) remove_added: /* * The devices are being deleted so it is not necessary to disable - * runtime PM. + * runtime PM. Similarly we also don't pm_runtime_put() the SDIO card + * because it needs to be active to remove any function devices that + * were probed, and after that it gets deleted. */ mmc_sdio_remove(host); mmc_claim_host(host);