|
@@ -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 @@ remove:
|
|
|
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);
|