mmc: davinci: fix mmc boot in SPL
authorBartosz Golaszewski <bgolaszewski@baylibre.com>
Thu, 14 Nov 2019 15:10:31 +0000 (16:10 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 3 Dec 2019 13:44:14 +0000 (08:44 -0500)
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>
drivers/mmc/davinci_mmc.c

index a27a039f9b59ae6b2945527f816d122a9235090a..c3f7b57665d3a2954992783e474e7728d7d74015 100644 (file)
@@ -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);
 }