diff options
| -rw-r--r-- | drivers/mmc/core/core.c | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index e541efbf3256..ba821fe70bca 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c | |||
| @@ -2238,6 +2238,7 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable) | |||
| 2238 | mmc_card_is_removable(host)) | 2238 | mmc_card_is_removable(host)) |
| 2239 | return err; | 2239 | return err; |
| 2240 | 2240 | ||
| 2241 | mmc_claim_host(host); | ||
| 2241 | if (card && mmc_card_mmc(card) && | 2242 | if (card && mmc_card_mmc(card) && |
| 2242 | (card->ext_csd.cache_size > 0)) { | 2243 | (card->ext_csd.cache_size > 0)) { |
| 2243 | enable = !!enable; | 2244 | enable = !!enable; |
| @@ -2255,6 +2256,7 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable) | |||
| 2255 | card->ext_csd.cache_ctrl = enable; | 2256 | card->ext_csd.cache_ctrl = enable; |
| 2256 | } | 2257 | } |
| 2257 | } | 2258 | } |
| 2259 | mmc_release_host(host); | ||
| 2258 | 2260 | ||
| 2259 | return err; | 2261 | return err; |
| 2260 | } | 2262 | } |
| @@ -2272,49 +2274,32 @@ int mmc_suspend_host(struct mmc_host *host) | |||
| 2272 | 2274 | ||
| 2273 | cancel_delayed_work(&host->detect); | 2275 | cancel_delayed_work(&host->detect); |
| 2274 | mmc_flush_scheduled_work(); | 2276 | mmc_flush_scheduled_work(); |
| 2275 | if (mmc_try_claim_host(host)) { | ||
| 2276 | err = mmc_cache_ctrl(host, 0); | ||
| 2277 | mmc_release_host(host); | ||
| 2278 | } else { | ||
| 2279 | err = -EBUSY; | ||
| 2280 | } | ||
| 2281 | 2277 | ||
| 2278 | err = mmc_cache_ctrl(host, 0); | ||
| 2282 | if (err) | 2279 | if (err) |
| 2283 | goto out; | 2280 | goto out; |
| 2284 | 2281 | ||
| 2285 | mmc_bus_get(host); | 2282 | mmc_bus_get(host); |
| 2286 | if (host->bus_ops && !host->bus_dead) { | 2283 | if (host->bus_ops && !host->bus_dead) { |
| 2287 | 2284 | ||
| 2288 | /* | 2285 | if (host->bus_ops->suspend) |
| 2289 | * A long response time is not acceptable for device drivers | 2286 | err = host->bus_ops->suspend(host); |
| 2290 | * when doing suspend. Prevent mmc_claim_host in the suspend | ||
| 2291 | * sequence, to potentially wait "forever" by trying to | ||
| 2292 | * pre-claim the host. | ||
| 2293 | */ | ||
| 2294 | if (mmc_try_claim_host(host)) { | ||
| 2295 | if (host->bus_ops->suspend) { | ||
| 2296 | err = host->bus_ops->suspend(host); | ||
| 2297 | } | ||
| 2298 | mmc_release_host(host); | ||
| 2299 | 2287 | ||
| 2300 | if (err == -ENOSYS || !host->bus_ops->resume) { | 2288 | if (err == -ENOSYS || !host->bus_ops->resume) { |
| 2301 | /* | 2289 | /* |
| 2302 | * We simply "remove" the card in this case. | 2290 | * We simply "remove" the card in this case. |
| 2303 | * It will be redetected on resume. (Calling | 2291 | * It will be redetected on resume. (Calling |
| 2304 | * bus_ops->remove() with a claimed host can | 2292 | * bus_ops->remove() with a claimed host can |
| 2305 | * deadlock.) | 2293 | * deadlock.) |
| 2306 | */ | 2294 | */ |
| 2307 | if (host->bus_ops->remove) | 2295 | if (host->bus_ops->remove) |
| 2308 | host->bus_ops->remove(host); | 2296 | host->bus_ops->remove(host); |
| 2309 | mmc_claim_host(host); | 2297 | mmc_claim_host(host); |
| 2310 | mmc_detach_bus(host); | 2298 | mmc_detach_bus(host); |
| 2311 | mmc_power_off(host); | 2299 | mmc_power_off(host); |
| 2312 | mmc_release_host(host); | 2300 | mmc_release_host(host); |
| 2313 | host->pm_flags = 0; | 2301 | host->pm_flags = 0; |
| 2314 | err = 0; | 2302 | err = 0; |
| 2315 | } | ||
| 2316 | } else { | ||
| 2317 | err = -EBUSY; | ||
| 2318 | } | 2303 | } |
| 2319 | } | 2304 | } |
| 2320 | mmc_bus_put(host); | 2305 | mmc_bus_put(host); |
