Message ID | 1509631821-18232-1-git-send-email-jorge.ramirez-ortiz@linaro.org |
---|---|
State | Accepted |
Commit | 713e6815d953108a78bd33470ab90fc2ec5a7198 |
Headers | show |
Series | mmc: sdhci: don't clear SDHCI_INT_STATUS register during CMD_INHIBIT | expand |
On 11/02/2017 11:10 PM, Jorge Ramirez-Ortiz wrote: > Fixes emmc initialization regression on the db410c platform. > > Clearing this register while SDHCI_PRESENT_STATE reports > SDHCI_CMD_INHIBIT leads to undefined behaviour on the db410c. > > When commit 7dde50 was merged (mmc: sdhci: Wait for SDHCI_INT_DATA_END > when transferring), SDHCI transfers transitioned to wait for bit > SDHCI_INT_DATA_END before flagging transfers done. > > Without this patch, the db410 platform fails to initialize its eMMC > due to all of its transfers timing out (SDHCI_INT_DATA_END is never > raised after all the blocks have been transferred). > > Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> Applied to u-boot-mmc. Sorry for late. Best Regards, Jaehoon Chung > --- > drivers/mmc/sdhci.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c > index 11d1f0c..f0c5aad 100644 > --- a/drivers/mmc/sdhci.c > +++ b/drivers/mmc/sdhci.c > @@ -157,7 +157,6 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, > /* Timeout unit - ms */ > static unsigned int cmd_timeout = SDHCI_CMD_DEFAULT_TIMEOUT; > > - sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS); > mask = SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT; > > /* We shouldn't wait for data inihibit for stop commands, even > @@ -181,6 +180,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, > udelay(1000); > } > > + sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS); > + > mask = SDHCI_INT_RESPONSE; > if (!(cmd->resp_type & MMC_RSP_PRESENT)) > flags = SDHCI_CMD_RESP_NONE; >
diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 11d1f0c..f0c5aad 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -157,7 +157,6 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, /* Timeout unit - ms */ static unsigned int cmd_timeout = SDHCI_CMD_DEFAULT_TIMEOUT; - sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS); mask = SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT; /* We shouldn't wait for data inihibit for stop commands, even @@ -181,6 +180,8 @@ static int sdhci_send_command(struct mmc *mmc, struct mmc_cmd *cmd, udelay(1000); } + sdhci_writel(host, SDHCI_INT_ALL_MASK, SDHCI_INT_STATUS); + mask = SDHCI_INT_RESPONSE; if (!(cmd->resp_type & MMC_RSP_PRESENT)) flags = SDHCI_CMD_RESP_NONE;
Fixes emmc initialization regression on the db410c platform. Clearing this register while SDHCI_PRESENT_STATE reports SDHCI_CMD_INHIBIT leads to undefined behaviour on the db410c. When commit 7dde50 was merged (mmc: sdhci: Wait for SDHCI_INT_DATA_END when transferring), SDHCI transfers transitioned to wait for bit SDHCI_INT_DATA_END before flagging transfers done. Without this patch, the db410 platform fails to initialize its eMMC due to all of its transfers timing out (SDHCI_INT_DATA_END is never raised after all the blocks have been transferred). Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> --- drivers/mmc/sdhci.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)