From f5b42ad17d9da38198e24b3f1912fffc86c904a6 Mon Sep 17 00:00:00 2001 From: lintao Date: Thu, 27 Mar 2014 10:32:31 +0800 Subject: [PATCH] mmc: host: rockchip: setup max hold time for cmd_rto --- drivers/mmc/host/rk_sdmmc.c | 15 ++++++++++++--- include/linux/mmc/rk_mmc.h | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/mmc/host/rk_sdmmc.c b/drivers/mmc/host/rk_sdmmc.c index 9edfa35867e7..f3520b63cc00 100755 --- a/drivers/mmc/host/rk_sdmmc.c +++ b/drivers/mmc/host/rk_sdmmc.c @@ -62,6 +62,7 @@ #define SDMMC_DATA_TIMEOUT_SDIO 250 #define SDMMC_DATA_TIMEOUT_EMMC 2500 +#define SDMMC_CMD_RTO_MAX_HOLD 200 //#define SDMMC_WAIT_FOR_UNBUSY 2500 #ifdef CONFIG_MMC_DW_IDMAC @@ -1457,7 +1458,15 @@ static void dw_mci_command_complete(struct dw_mci *host, struct mmc_command *cmd } if (status & SDMMC_INT_RTO) - cmd->error = -ETIMEDOUT; + { + if(host->mmc->restrict_caps & RESTRICT_CARD_TYPE_SDIO) + { + host->cmd_rto += 1; + (host->cmd_rto >= SDMMC_CMD_RTO_MAX_HOLD)?(cmd->error = -ETIMEDOUT):(cmd->error = 0); + } + else + cmd->error = -ETIMEDOUT; + } else if ((cmd->flags & MMC_RSP_CRC) && (status & SDMMC_INT_RCRC)) cmd->error = -EILSEQ; else if (status & SDMMC_INT_RESP_ERR) @@ -2115,8 +2124,8 @@ done: static void dw_mci_cmd_interrupt(struct dw_mci *host, u32 status) { if (!host->cmd_status) - host->cmd_status = status; - + host->cmd_status = status; + smp_wmb(); set_bit(EVENT_CMD_COMPLETE, &host->pending_events); diff --git a/include/linux/mmc/rk_mmc.h b/include/linux/mmc/rk_mmc.h index 4e4c5a31cc66..62696369ebf4 100755 --- a/include/linux/mmc/rk_mmc.h +++ b/include/linux/mmc/rk_mmc.h @@ -195,6 +195,7 @@ struct dw_mci { struct regulator *vmmc; /* Power regulator */ unsigned long irq_flags; /* IRQ flags */ int irq; + u32 cmd_rto; /*cmd response timeout hold times*/ struct pinctrl *pinctrl; /*Pinctrl state*/ struct pinctrl_state *pins_default; struct pinctrl_state *pins_idle; -- 2.34.1