diff options
author | Ulf Hansson <ulf.hansson@stericsson.com> | 2011-10-13 15:10:46 +0200 |
---|---|---|
committer | Ulf HANSSON <ulf.hansson@stericsson.com> | 2011-10-21 12:55:52 +0200 |
commit | 50678911ed7033309212302b718f3bda28c5ec25 (patch) | |
tree | 362d6d34ecbec12e891deae9ff5edef25c93bcbd /drivers/mmc/core/core.c | |
parent | 4055a31f78bb0fcfcf0323386fc7c59466fa144f (diff) |
mmc: core: Prevent too long response times for suspend
While trying to suspend the mmc host there could still be
ongoing requests that we need to wait for. At the same time
a device driver must respond to a suspend request rather quickly.
Instead of potentially wait "forever" by claiming the host we now
"try" to claim the host instead. If it fails, -EBUSY is returned.
Change-Id: Id7276cba93eb2a3462d4a87295ac499dc5f359fd
Signed-off-by: Ulf Hansson <ulf.hansson@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33962
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Reviewed-by: Stefan NILSSON9 <stefan.xk.nilsson@stericsson.com>
Reviewed-by: Per FORLIN <per.forlin@stericsson.com>
Diffstat (limited to 'drivers/mmc/core/core.c')
-rw-r--r-- | drivers/mmc/core/core.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 02d534cfe1d..11907e15e5f 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2153,21 +2153,33 @@ int mmc_suspend_host(struct mmc_host *host) mmc_bus_get(host); if (host->bus_ops && !host->bus_dead) { - if (host->bus_ops->suspend) - err = host->bus_ops->suspend(host); - if (err == -ENOSYS || !host->bus_ops->resume) { - /* - * We simply "remove" the card in this case. - * It will be redetected on resume. - */ - if (host->bus_ops->remove) - host->bus_ops->remove(host); - mmc_claim_host(host); - mmc_detach_bus(host); - mmc_power_off(host); - mmc_release_host(host); - host->pm_flags = 0; - err = 0; + + /* + * A long response time is not acceptable for device drivers + * when doing suspend. Prevent mmc_claim_host in the suspend + * sequence, to potentially wait "forever" by trying to + * pre-claim the host. + */ + if (mmc_try_claim_host(host)) { + if (host->bus_ops->suspend) + err = host->bus_ops->suspend(host); + if (err == -ENOSYS || !host->bus_ops->resume) { + /* + * We simply "remove" the card in this case. + * It will be redetected on resume. + */ + if (host->bus_ops->remove) + host->bus_ops->remove(host); + mmc_claim_host(host); + mmc_detach_bus(host); + mmc_power_off(host); + mmc_release_host(host); + host->pm_flags = 0; + err = 0; + } + mmc_do_release_host(host); + } else { + err = -EBUSY; } } mmc_bus_put(host); |