|
@@ -76,6 +76,7 @@ struct omap_hsmmc_data {
|
|
|
#endif
|
|
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
|
|
uint iov;
|
|
|
+ enum bus_mode mode;
|
|
|
#endif
|
|
|
u8 controller_flags;
|
|
|
#ifndef CONFIG_OMAP34XX
|
|
@@ -258,6 +259,48 @@ void mmc_init_stream(struct hsmmc *mmc_base)
|
|
|
}
|
|
|
|
|
|
#if CONFIG_IS_ENABLED(DM_MMC)
|
|
|
+static void omap_hsmmc_set_timing(struct mmc *mmc)
|
|
|
+{
|
|
|
+ u32 val;
|
|
|
+ struct hsmmc *mmc_base;
|
|
|
+ struct omap_hsmmc_data *priv = omap_hsmmc_get_data(mmc);
|
|
|
+
|
|
|
+ mmc_base = priv->base_addr;
|
|
|
+
|
|
|
+ val = readl(&mmc_base->ac12);
|
|
|
+ val &= ~AC12_UHSMC_MASK;
|
|
|
+ priv->mode = mmc->selected_mode;
|
|
|
+
|
|
|
+ switch (priv->mode) {
|
|
|
+ case MMC_HS_200:
|
|
|
+ case UHS_SDR104:
|
|
|
+ val |= AC12_UHSMC_SDR104;
|
|
|
+ break;
|
|
|
+ case UHS_SDR50:
|
|
|
+ val |= AC12_UHSMC_SDR50;
|
|
|
+ break;
|
|
|
+ case MMC_DDR_52:
|
|
|
+ case UHS_DDR50:
|
|
|
+ val |= AC12_UHSMC_DDR50;
|
|
|
+ break;
|
|
|
+ case SD_HS:
|
|
|
+ case MMC_HS_52:
|
|
|
+ case UHS_SDR25:
|
|
|
+ val |= AC12_UHSMC_SDR25;
|
|
|
+ break;
|
|
|
+ case MMC_LEGACY:
|
|
|
+ case MMC_HS:
|
|
|
+ case SD_LEGACY:
|
|
|
+ case UHS_SDR12:
|
|
|
+ val |= AC12_UHSMC_SDR12;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ val |= AC12_UHSMC_RES;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ writel(val, &mmc_base->ac12);
|
|
|
+}
|
|
|
+
|
|
|
static void omap_hsmmc_conf_bus_power(struct mmc *mmc)
|
|
|
{
|
|
|
struct hsmmc *mmc_base;
|
|
@@ -928,6 +971,10 @@ static int omap_hsmmc_set_ios(struct udevice *dev)
|
|
|
if (priv->clock != mmc->clock)
|
|
|
omap_hsmmc_set_clock(mmc);
|
|
|
|
|
|
+#if CONFIG_IS_ENABLED(DM_MMC)
|
|
|
+ if (priv->mode != mmc->selected_mode)
|
|
|
+ omap_hsmmc_set_timing(mmc);
|
|
|
+#endif
|
|
|
return 0;
|
|
|
}
|
|
|
|