From fd967eb3e0463ce25190b70387df68ffbee21a59 Mon Sep 17 00:00:00 2001 From: Ritesh Harjani Date: Tue, 4 Nov 2014 15:34:00 +0530 Subject: [PATCH] mmc: sdhci-msm: Dont wait infinitely for pwr_irq interrupt Currently there is one rare case where suspend thread trying to suspend sdhci-msm waits infinitely for pwr_irq interrupt from hardware which never gets raised and thus watchdog barks happens. Change this waiting to wait_for_completion_timeout. Change-Id: Ic4e9bca91b5496409b4afe2be2892c83aa390e95 Signed-off-by: Ritesh Harjani --- drivers/mmc/host/sdhci-msm.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index 2e46cc8ddad9..734de11cd925 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -310,6 +310,9 @@ void sdhci_msm_writel_relaxed(u32 val, struct sdhci_host *host, u32 offset) writel_relaxed(val, base_addr + offset); } +/* Timeout value to avoid infinite waiting for pwr_irq */ +#define MSM_PWR_IRQ_TIMEOUT_MS 5000 + static const u32 tuning_block_64[] = { 0x00FF0FFF, 0xCCC3CCFF, 0xFFCC3CC3, 0xEFFEFFFE, 0xDDFFDFFF, 0xFBFFFBFF, 0xFF7FFFBF, 0xEFBDF777, @@ -2776,8 +2779,10 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type) */ if (done) init_completion(&msm_host->pwr_irq_completion); - else - wait_for_completion(&msm_host->pwr_irq_completion); + else if (!wait_for_completion_timeout(&msm_host->pwr_irq_completion, + msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) + __WARN_printf("%s: request(%d) timed out waiting for pwr_irq\n", + mmc_hostname(host->mmc), req_type); pr_debug("%s: %s: request %d done\n", mmc_hostname(host->mmc), __func__, req_type);