summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRitesh Harjani <riteshh@codeaurora.org>2015-09-15 19:21:32 +0530
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:27:41 -0700
commit24bd8b95d9063ad4be0d484fb4e2a1956ea9977e (patch)
tree6f8c74c357606765a9d9486c6688b7b6385f2461 /drivers
parent9a4df9847e68932453e45e0a962352d9d14113fc (diff)
mmc: cmdq_hci: Add retry mechanism for cmdq_halt
Currently all functions which calls cmdq_halt relies upon HALT to pass other wise considers it as a FATAL error (like clk scaling). So add retry mechanism in halt - retry if halt completion timesout & HALT also did not complete(by doing register read). Change-Id: I59e199681e46085f804636f4c07249e6f21de1d5 Signed-off-by: Ritesh Harjani <riteshh@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/host/cmdq_hci.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c
index 021ba4cc4ec8..4e79db942a04 100644
--- a/drivers/mmc/host/cmdq_hci.c
+++ b/drivers/mmc/host/cmdq_hci.c
@@ -778,17 +778,27 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt)
{
struct cmdq_host *cq_host = (struct cmdq_host *)mmc_cmdq_private(mmc);
u32 ret = 0;
+ int retries = 3;
cmdq_runtime_pm_get(cq_host);
if (halt) {
- cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) | HALT,
- CQCTL);
- ret = wait_for_completion_timeout(&cq_host->halt_comp,
+ while (retries) {
+ cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) | HALT,
+ CQCTL);
+ ret = wait_for_completion_timeout(&cq_host->halt_comp,
msecs_to_jiffies(HALT_TIMEOUT_MS));
- /* halt done: re-enable legacy interrupts */
- if (cq_host->ops->clear_set_irqs)
- cq_host->ops->clear_set_irqs(mmc, false);
- ret = ret ? 0 : -ETIMEDOUT;
+ if (!ret && !(cmdq_readl(cq_host, CQCTL) & HALT)) {
+ retries--;
+ continue;
+ } else {
+ /* halt done: re-enable legacy interrupts */
+ if (cq_host->ops->clear_set_irqs)
+ cq_host->ops->clear_set_irqs(mmc,
+ false);
+ break;
+ }
+ }
+ return retries ? 0 : -ETIMEDOUT;
} else {
if (cq_host->ops->set_data_timeout)
cq_host->ops->set_data_timeout(mmc, 0xf);