Hi Peng, On 10/09/19 7:50 AM, Peng Fan wrote: >> 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>
Gentle Ping. Are you planning to take this patch for this merge window? Thanks and regards, Lokesh >> --- >> 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