mmc: msm_sdcc: read all response registers only if required
In current code, all 4 response registers MCI_RESPn (n=[0..3])
are read for every command. Ideally, only MCI_RESP0 must be read
for short type (32-bit) and all 4 registers for long type (136-bit)
response. This patch fixes this by reading response registers based
on response type.
Change-Id: I7af326be16a42b8b4de7d3413f67e23fe8c68875
Reported-by: Asutosh Das <asutoshd@codeaurora.org>
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c
index c194f9c..7e9b05e 100644
--- a/drivers/mmc/host/msm_sdcc.c
+++ b/drivers/mmc/host/msm_sdcc.c
@@ -1557,10 +1557,17 @@
struct mmc_command *cmd = host->curr.cmd;
host->curr.cmd = NULL;
- cmd->resp[0] = readl_relaxed(host->base + MMCIRESPONSE0);
- cmd->resp[1] = readl_relaxed(host->base + MMCIRESPONSE1);
- cmd->resp[2] = readl_relaxed(host->base + MMCIRESPONSE2);
- cmd->resp[3] = readl_relaxed(host->base + MMCIRESPONSE3);
+ if (mmc_resp_type(cmd))
+ cmd->resp[0] = readl_relaxed(host->base + MMCIRESPONSE0);
+ /*
+ * Read rest of the response registers only if
+ * long response is expected for this command
+ */
+ if (mmc_resp_type(cmd) & MMC_RSP_136) {
+ cmd->resp[1] = readl_relaxed(host->base + MMCIRESPONSE1);
+ cmd->resp[2] = readl_relaxed(host->base + MMCIRESPONSE2);
+ cmd->resp[3] = readl_relaxed(host->base + MMCIRESPONSE3);
+ }
if (status & (MCI_CMDTIMEOUT | MCI_AUTOCMD19TIMEOUT)) {
pr_debug("%s: CMD%d: Command timeout\n",