aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/core/core.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 1da45e051328..bec0bf21c879 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2175,6 +2175,7 @@ void mmc_stop_host(struct mmc_host *host)
2175 2175
2176 mmc_bus_get(host); 2176 mmc_bus_get(host);
2177 if (host->bus_ops && !host->bus_dead) { 2177 if (host->bus_ops && !host->bus_dead) {
2178 /* Calling bus_ops->remove() with a claimed host can deadlock */
2178 if (host->bus_ops->remove) 2179 if (host->bus_ops->remove)
2179 host->bus_ops->remove(host); 2180 host->bus_ops->remove(host);
2180 2181
@@ -2398,7 +2399,9 @@ int mmc_suspend_host(struct mmc_host *host)
2398 if (err == -ENOSYS || !host->bus_ops->resume) { 2399 if (err == -ENOSYS || !host->bus_ops->resume) {
2399 /* 2400 /*
2400 * We simply "remove" the card in this case. 2401 * We simply "remove" the card in this case.
2401 * It will be redetected on resume. 2402 * It will be redetected on resume. (Calling
2403 * bus_ops->remove() with a claimed host can
2404 * deadlock.)
2402 */ 2405 */
2403 if (host->bus_ops->remove) 2406 if (host->bus_ops->remove)
2404 host->bus_ops->remove(host); 2407 host->bus_ops->remove(host);
@@ -2491,11 +2494,11 @@ int mmc_pm_notify(struct notifier_block *notify_block,
2491 if (!host->bus_ops || host->bus_ops->suspend) 2494 if (!host->bus_ops || host->bus_ops->suspend)
2492 break; 2495 break;
2493 2496
2494 mmc_claim_host(host); 2497 /* Calling bus_ops->remove() with a claimed host can deadlock */
2495
2496 if (host->bus_ops->remove) 2498 if (host->bus_ops->remove)
2497 host->bus_ops->remove(host); 2499 host->bus_ops->remove(host);
2498 2500
2501 mmc_claim_host(host);
2499 mmc_detach_bus(host); 2502 mmc_detach_bus(host);
2500 mmc_power_off(host); 2503 mmc_power_off(host);
2501 mmc_release_host(host); 2504 mmc_release_host(host);