summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAsutosh Das <asutoshd@codeaurora.org>2016-04-12 11:52:33 +0530
committerKyle Yan <kyan@codeaurora.org>2016-06-15 16:11:20 -0700
commit21de67ad102db720eea314f15cabaed4bbe13e09 (patch)
tree75db7045446834329453ebbbb50036964ba4545c
parentf88fc3eaa627b9f8f39752c8c6a8f49655afccb6 (diff)
mmc: core: Add deferred resume support to CQ
Defer the resume of the device until a request actually arrives, thus mandating the use of the device. CRs-fixed: 987918 Change-Id: I41cf8908dd0f129c54b941c318e938ad7e9d36c9 Signed-off-by: Asutosh Das <asutoshd@codeaurora.org>
-rw-r--r--drivers/mmc/card/block.c4
-rw-r--r--drivers/mmc/core/core.c9
2 files changed, 13 insertions, 0 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 71caa588a019..dafdbd99ce71 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -3570,6 +3570,10 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req)
mmc_get_card(card);
+#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME
+ if (mmc_bus_needs_resume(card->host))
+ mmc_resume_bus(card->host);
+#endif
if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) {
ret = mmc_cmdq_halt(card->host, true);
if (ret)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index bf369af5511d..b76bb7a74049 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -3051,6 +3051,7 @@ static inline void mmc_bus_put(struct mmc_host *host)
int mmc_resume_bus(struct mmc_host *host)
{
unsigned long flags;
+ int err = 0;
if (!mmc_bus_needs_resume(host))
return -EINVAL;
@@ -3066,6 +3067,14 @@ int mmc_resume_bus(struct mmc_host *host)
mmc_power_up(host, host->card->ocr);
BUG_ON(!host->bus_ops->resume);
host->bus_ops->resume(host);
+ if (mmc_card_cmdq(host->card)) {
+ err = mmc_cmdq_halt(host, false);
+ if (err)
+ pr_err("%s: %s: unhalt failed: %d\n",
+ mmc_hostname(host), __func__, err);
+ else
+ mmc_card_clr_suspended(host->card);
+ }
}
if (host->bus_ops->detect && !host->bus_dead)