diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c index 8cf3e641c..8da7097c4 100644 --- a/drivers/mci/imx-esdhc.c +++ b/drivers/mci/imx-esdhc.c @@ -266,6 +266,21 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data) if (irqstat & IRQSTAT_CTOE) return -ETIMEDOUT; + /* Workaround for ESDHC errata ENGcm03648 / ENGcm12360 */ + if (!data && (cmd->resp_type & MMC_RSP_BUSY)) { + /* + * Poll on DATA0 line for cmd with busy signal for + * timout / 10 usec since DLA polling can be insecure. + */ + ret = wait_on_timeout(2500 * MSECOND, + (esdhc_read32(regs + SDHCI_PRESENT_STATE) & PRSSTAT_DAT0)); + + if (ret) { + dev_err(host->dev, "timeout PRSSTAT_DAT0\n"); + return -ETIMEDOUT; + } + } + /* Copy the response to the response buffer */ if (cmd->resp_type & MMC_RSP_136) { u32 cmdrsp3, cmdrsp2, cmdrsp1, cmdrsp0; diff --git a/drivers/mci/sdhci.h b/drivers/mci/sdhci.h index 2c8b6f521..b67818485 100644 --- a/drivers/mci/sdhci.h +++ b/drivers/mci/sdhci.h @@ -77,6 +77,7 @@ #define IRQSTATEN_TC 0x00000002 #define IRQSTATEN_CC 0x00000001 +#define PRSSTAT_DAT0 0x01000000 #define PRSSTAT_CLSL 0x00800000 #define PRSSTAT_WPSPL 0x00080000 #define PRSSTAT_CDPL 0x00040000