> Subject: [PATCH] spl: dm_mmc: Initialize only the required mmc device > > In SPL, all the available mmc devices gets initialized during boot. > This might not work in cases where clocks are not available for certain mmc > devices(other than boot device) and the support for enabling device might not > be ready. > > Texas Instruments' K3 J721E device having a central system controller > (dmsc) is one such example falling in this category. Below is the sequence for > the failing scenario: > - ROM comes up in SD mode and loads SPL by just initialing SD card. > - SPL loads dmsc firmware from SD Card. > Since ROM has enabled SD, SPL need not enable the SD, just need to re > initialize the card. But SPL is trying to initialize other MMC instances which > are in disabled state. Since dmsc firmware is not yet available, devices > cannot > be enabled. So in SPL, initialize only the mmc device that is needed. > > Signed-off-by: Lokesh Vutla <lokeshvu...@ti.com> > --- > common/spl/spl_mmc.c | 14 ++++---------- > drivers/mmc/mmc.c | 24 ++++++++++++++++++++++++ > include/mmc.h | 1 + > 3 files changed, 29 insertions(+), 10 deletions(-) > > diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index > b3619889f7..303f0f80bf 100644 > --- a/common/spl/spl_mmc.c > +++ b/common/spl/spl_mmc.c > @@ -113,31 +113,25 @@ static int spl_mmc_get_device_index(u32 > boot_device) > > static int spl_mmc_find_device(struct mmc **mmcp, u32 boot_device) > { -#if CONFIG_IS_ENABLED(DM_MMC) > - struct udevice *dev; > -#endif > int err, mmc_dev; > > mmc_dev = spl_mmc_get_device_index(boot_device); > if (mmc_dev < 0) > return mmc_dev; > > +#if CONFIG_IS_ENABLED(DM_MMC) > + err = mmc_init_device(mmc_dev); > +#else > err = mmc_initialize(NULL); > +#endif /* DM_MMC */ > if (err) { > #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT > printf("spl: could not initialize mmc. error: %d\n", err); > #endif > return err; > } > - > -#if CONFIG_IS_ENABLED(DM_MMC) > - err = uclass_get_device(UCLASS_MMC, mmc_dev, &dev); > - if (!err) > - *mmcp = mmc_get_mmc_dev(dev); > -#else > *mmcp = find_mmc_device(mmc_dev); > err = *mmcp ? 0 : -ENODEV; > -#endif > if (err) { > #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT > printf("spl: could not find mmc device %d. error: %d\n", diff > --git > a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index eecc7d687e..ec8f92ce8f > 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -2998,6 +2998,30 @@ int mmc_initialize(bd_t *bis) > return 0; > } > > +#if CONFIG_IS_ENABLED(DM_MMC) > +int mmc_init_device(int num) > +{ > + struct udevice *dev; > + struct mmc *m; > + int ret; > + > + ret = uclass_get_device(UCLASS_MMC, num, &dev); > + if (ret) > + return ret; > + > + m = mmc_get_mmc_dev(dev); > + if (!m) > + return 0; > +#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT > + mmc_set_preinit(m, 1); > +#endif > + if (m->preinit) > + mmc_start_init(m); > + > + return 0; > +} > +#endif > + > #ifdef CONFIG_CMD_BKOPS_ENABLE > int mmc_set_bkops_enable(struct mmc *mmc) { diff --git > a/include/mmc.h b/include/mmc.h index 46422f41a4..878b4c9e57 100644 > --- a/include/mmc.h > +++ b/include/mmc.h > @@ -698,6 +698,7 @@ void mmc_destroy(struct mmc *mmc); > */ > int mmc_unbind(struct udevice *dev); > int mmc_initialize(bd_t *bis); > +int mmc_init_device(int num); > int mmc_init(struct mmc *mmc); > int mmc_send_tuning(struct mmc *mmc, u32 opcode, int *cmd_error);
Reviewed-by: Peng Fan <peng....@nxp.com> > > -- > 2.22.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot