]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
drivers: mmc: Add wait_dat0 support for Freescale eSDHC driver
authorStephen Carlson <stcarlso@linux.microsoft.com>
Tue, 17 Aug 2021 19:46:40 +0000 (12:46 -0700)
committerJaehoon Chung <jh80.chung@samsung.com>
Fri, 29 Oct 2021 09:22:32 +0000 (18:22 +0900)
Adds an implementation of the wait_dat0 MMC operation for the Freescale
eSHDC driver, allowing the driver to continue when the card is ready
rather than waiting for the worst case time on each MMC switch operation.

Signed-off-by: Stephen Carlson <stcarlso@linux.microsoft.com>
Reviewed-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
drivers/mmc/fsl_esdhc.c

index ebb307e95066b34cfec338bc1019c99c42e79c7e..05a6d0ce1562abd1de5f06b404580c5479e8470c 100644 (file)
@@ -27,6 +27,7 @@
 #include <dm/device_compat.h>
 #include <linux/bitops.h>
 #include <linux/delay.h>
+#include <linux/iopoll.h>
 #include <linux/dma-mapping.h>
 #include <sdhci.h>
 
@@ -1138,6 +1139,20 @@ int fsl_esdhc_hs400_prepare_ddr(struct udevice *dev)
        return 0;
 }
 
+static int fsl_esdhc_wait_dat0(struct udevice *dev, int state,
+                              int timeout_us)
+{
+       int ret;
+       u32 tmp;
+       struct fsl_esdhc_priv *priv = dev_get_priv(dev);
+       struct fsl_esdhc *regs = priv->esdhc_regs;
+
+       ret = readx_poll_timeout(esdhc_read32, &regs->prsstat, tmp,
+                                !!(tmp & PRSSTAT_DAT0) == !!state,
+                                timeout_us);
+       return ret;
+}
+
 static const struct dm_mmc_ops fsl_esdhc_ops = {
        .get_cd         = fsl_esdhc_get_cd,
        .send_cmd       = fsl_esdhc_send_cmd,
@@ -1147,6 +1162,7 @@ static const struct dm_mmc_ops fsl_esdhc_ops = {
 #endif
        .reinit = fsl_esdhc_reinit,
        .hs400_prepare_ddr = fsl_esdhc_hs400_prepare_ddr,
+       .wait_dat0 = fsl_esdhc_wait_dat0,
 };
 
 static const struct udevice_id fsl_esdhc_ids[] = {