summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2019-11-14 16:10:31 +0100
committerTom Rini <trini@konsulko.com>2019-12-03 08:44:14 -0500
commit3ef94715cc011e3f0042019359f848f9f129b391 (patch)
treec85e641a691301912e9393f665b3bfa05b58ed46 /drivers/mmc
parent598d9bccc599bac1fa0fd1974eae6338563309f5 (diff)
downloadu-boot-3ef94715cc011e3f0042019359f848f9f129b391.tar.gz
mmc: davinci: fix mmc boot in SPL
The MMC boot is currently broken on omapl138-lcdk after enabling the driver model in SPL. The main problem is the driver's bind callback not being called after probe in SPL (even with the DM_FLAG_PRE_RELOC flag specified). While a proper fix is still being worked on, this hacky changeset at least fixes the MMC boot on this platform by calling mmc_bind() manually from probe(). Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/davinci_mmc.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c
index a27a039f9b..c3f7b57665 100644
--- a/drivers/mmc/davinci_mmc.c
+++ b/drivers/mmc/davinci_mmc.c
@@ -482,6 +482,9 @@ static int davinci_mmc_probe(struct udevice *dev)
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
struct davinci_mmc_priv *priv = dev_get_priv(dev);
struct mmc_config *cfg = &priv->cfg;
+#ifdef CONFIG_SPL_BUILD
+ int ret;
+#endif
cfg->f_min = 200000;
cfg->f_max = 25000000;
@@ -501,6 +504,20 @@ static int davinci_mmc_probe(struct udevice *dev)
upriv->mmc = &priv->mmc;
+#ifdef CONFIG_SPL_BUILD
+ /*
+ * FIXME This is a temporary workaround to enable the driver model in
+ * SPL on omapl138-lcdk. For some reason the bind() callback is not
+ * being called in SPL for MMC which breaks the mmc boot - the hack
+ * is to call mmc_bind() from probe(). We also don't have full DT
+ * support in SPL, hence the hard-coded base register address.
+ */
+ priv->reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE;
+ ret = mmc_bind(dev, &priv->mmc, &priv->cfg);
+ if (ret)
+ return ret;
+#endif
+
return davinci_dm_mmc_init(dev);
}