[U-Boot] [PATCH] spl: dm_mmc: Initialize only the required mmc device
Peng Fan
peng.fan at nxp.com
Tue Sep 10 02:20:47 UTC 2019
> 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>
> ---
> 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