Add eMMC hs200 mode support for ls1028a,lx2160a,ls1012a. This increases
eMMC performance. Tuning procedure is currently not supported

Signed-off-by: Yinbo Zhu <yinbo....@nxp.com>
---
Change in v2:
                update the commit information

 drivers/mmc/fsl_esdhc.c | 34 +++++++++++++++++++---------------
 include/fsl_esdhc.h     |  4 ++++
 2 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c
index 4959e1892b..abe6ea3010 100644
--- a/drivers/mmc/fsl_esdhc.c
+++ b/drivers/mmc/fsl_esdhc.c
@@ -394,10 +394,6 @@ static int esdhc_send_cmd_common(struct fsl_esdhc_priv 
*priv, struct mmc *mmc,
        esdhc_write32(&regs->cmdarg, cmd->cmdarg);
        esdhc_write32(&regs->xfertyp, xfertyp);
 
-       if ((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK) ||
-           (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200))
-               flags = IRQSTAT_BRR;
-
        /* Wait for the command to complete */
        start = get_timer(0);
        while (!(esdhc_read32(&regs->irqstat) & flags)) {
@@ -457,12 +453,6 @@ static int esdhc_send_cmd_common(struct fsl_esdhc_priv 
*priv, struct mmc *mmc,
 #ifdef CONFIG_SYS_FSL_ESDHC_USE_PIO
                esdhc_pio_read_write(priv, data);
 #else
-               flags = DATA_COMPLETE;
-               if ((cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK) ||
-                   (cmd->cmdidx == MMC_CMD_SEND_TUNING_BLOCK_HS200)) {
-                       flags = IRQSTAT_BRR;
-               }
-
                do {
                        irqstat = esdhc_read32(&regs->irqstat);
 
@@ -475,7 +465,7 @@ static int esdhc_send_cmd_common(struct fsl_esdhc_priv 
*priv, struct mmc *mmc,
                                err = -ECOMM;
                                goto out;
                        }
-               } while ((irqstat & flags) != flags);
+               } while ((irqstat & DATA_COMPLETE) != DATA_COMPLETE);
 
                /*
                 * Need invalidate the dcache here again to avoid any
@@ -516,7 +506,9 @@ static void set_sysctl(struct fsl_esdhc_priv *priv, struct 
mmc *mmc, uint clock)
        int div = 1;
        int pre_div = 2;
        int ddr_pre_div = mmc->ddr_mode ? 2 : 1;
-       int sdhc_clk = priv->sdhc_clk;
+       unsigned int sdhc_clk = priv->sdhc_clk;
+       u32 time_out;
+       u32 value;
        uint clk;
 
        if (clock < mmc->cfg->f_min)
@@ -537,11 +529,18 @@ static void set_sysctl(struct fsl_esdhc_priv *priv, 
struct mmc *mmc, uint clock)
 
        esdhc_clrsetbits32(&regs->sysctl, SYSCTL_CLOCK_MASK, clk);
 
-       udelay(10000);
+       time_out = 20;
+       value = PRSSTAT_SDSTB;
+       while (!(esdhc_read32(&regs->prsstat) & value)) {
+               if (time_out == 0) {
+                       printf("fsl_esdhc: Internal clock never stabilised.\n");
+                       break;
+               }
+               time_out--;
+               mdelay(1);
+       }
 
        esdhc_setbits32(&regs->sysctl, SYSCTL_PEREN | SYSCTL_CKEN);
-
-       priv->clock = clock;
 }
 
 #ifdef CONFIG_FSL_ESDHC_USE_PERIPHERAL_CLK
@@ -1014,6 +1013,8 @@ static int fsl_esdhc_probe(struct udevice *dev)
                return ret;
        }
 
+       mmc_of_parse(dev, &plat->cfg);
+
        mmc = &plat->mmc;
        mmc->cfg = &plat->cfg;
        mmc->dev = dev;
@@ -1071,6 +1072,9 @@ static const struct dm_mmc_ops fsl_esdhc_ops = {
        .get_cd         = fsl_esdhc_get_cd,
        .send_cmd       = fsl_esdhc_send_cmd,
        .set_ios        = fsl_esdhc_set_ios,
+#ifdef MMC_SUPPORTS_TUNING
+       .execute_tuning = fsl_esdhc_execute_tuning,
+#endif
 };
 #endif
 
diff --git a/include/fsl_esdhc.h b/include/fsl_esdhc.h
index 7d7e946ab3..3f496b4cea 100644
--- a/include/fsl_esdhc.h
+++ b/include/fsl_esdhc.h
@@ -205,6 +205,10 @@ struct fsl_esdhc_cfg {
 int fsl_esdhc_mmc_init(bd_t *bis);
 int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg);
 void fdt_fixup_esdhc(void *blob, bd_t *bd);
+#ifdef MMC_SUPPORTS_TUNING
+static inline int fsl_esdhc_execute_tuning(struct udevice *dev,
+       uint32_t opcode) {return 0; }
+#endif
 #else
 static inline int fsl_esdhc_mmc_init(bd_t *bis) { return -ENOSYS; }
 static inline void fdt_fixup_esdhc(void *blob, bd_t *bd) {}
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to