[U-Boot] [PATCH] spl: dm_mmc: Initialize only the required mmc device

Peng Fan peng.fan at nxp.com
Wed Oct 9 05:44:12 UTC 2019


> Subject: Re: [PATCH] spl: dm_mmc: Initialize only the required mmc device
> 
> 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 <lokeshvutla at ti.com>
> 
> Gentle Ping. Are you planning to take this patch for this merge window?

Just back from holiday. Yes, I'll pick it up and prepare PR to Tom.

Thanks,
Peng.

> 
> 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.fan at nxp.com>
> >
> >>
> >> --
> >> 2.22.0
> >


More information about the U-Boot mailing list