[PATCH v3] mmc: Poll CD in case cyclic framework is enabled
Simon Glass
sjg at chromium.org
Mon Dec 11 18:52:25 CET 2023
Hi Marek,
On Sun, 10 Dec 2023 at 08:03, Marek Vasut
<marek.vasut+renesas at mailbox.org> wrote:
>
> In case the cyclic framework is enabled, poll the card detect of already
> initialized cards and deinitialize them in case they are removed. Since
> the card initialization is a longer process and card initialization is
> done on first access to an uninitialized card anyway, avoid initializing
> newly detected uninitialized cards in the cyclic callback.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Jaehoon Chung <jh80.chung at samsung.com>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Simon Glass <sjg at chromium.org>
> ---
> V2: Move the cyclic registration/unregistration into mmc init/deinit
> V3: Replace if (CONFIG_IS_ENABLED(CYCLIC)...) with #if as the former
> does not work with structure members
> ---
> drivers/mmc/mmc.c | 36 ++++++++++++++++++++++++++++++++++++
> include/mmc.h | 5 +++++
> 2 files changed, 41 insertions(+)
>
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index eb5010c1465..a5686dbc12e 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -2985,6 +2985,22 @@ static int mmc_complete_init(struct mmc *mmc)
> return err;
> }
>
> +#if CONFIG_IS_ENABLED(CYCLIC)
> +static void mmc_cyclic_cd_poll(void *ctx)
> +{
> + struct mmc *m = ctx;
> +
> + if (!m->has_init)
> + return;
> +
> + if (mmc_getcd(m))
> + return;
> +
> + mmc_deinit(m);
> + m->has_init = 0;
> +}
> +#endif
> +
> int mmc_init(struct mmc *mmc)
> {
> int err = 0;
> @@ -3007,6 +3023,19 @@ int mmc_init(struct mmc *mmc)
> if (err)
> pr_info("%s: %d, time %lu\n", __func__, err, get_timer(start));
>
> +#if CONFIG_IS_ENABLED(CYCLIC)
We really shouldn't be adding new #ifdefs to the code.
If you really want to make put ->cyclic behind an #ifdef then how
about creating an accessor as is done in global_data.h ?
> + if (!mmc->cyclic) {
> + /* Register cyclic function for card detect polling */
> + mmc->cyclic = cyclic_register(mmc_cyclic_cd_poll, 100 * 1000,
> + mmc->cfg->name, mmc);
> + if (!mmc->cyclic) {
> + printf("Failed to register %s CD poll function\n",
> + mmc->cfg->name);
> + err = -EINVAL;
> + }
> + }
> +#endif
> +
> return err;
> }
>
> @@ -3014,6 +3043,13 @@ int mmc_deinit(struct mmc *mmc)
> {
> u32 caps_filtered;
>
> +#if CONFIG_IS_ENABLED(CYCLIC)
> + if (mmc->cyclic) {
> + cyclic_unregister(mmc->cyclic);
> + mmc->cyclic = NULL;
> + }
> +#endif
> +
> if (!CONFIG_IS_ENABLED(MMC_UHS_SUPPORT) &&
> !CONFIG_IS_ENABLED(MMC_HS200_SUPPORT) &&
> !CONFIG_IS_ENABLED(MMC_HS400_SUPPORT))
> diff --git a/include/mmc.h b/include/mmc.h
> index 1022db3ffa7..4256d5567ef 100644
> --- a/include/mmc.h
> +++ b/include/mmc.h
> @@ -14,6 +14,7 @@
> #include <linux/sizes.h>
> #include <linux/compiler.h>
> #include <linux/dma-direction.h>
> +#include <cyclic.h>
> #include <part.h>
>
> struct bd_info;
> @@ -739,6 +740,10 @@ struct mmc {
> u8 hs400_tuning;
>
> enum bus_mode user_speed_mode; /* input speed mode from user */
> +
> +#if CONFIG_IS_ENABLED(CYCLIC)
> + struct cyclic_info *cyclic;
> +#endif
> };
>
> #if CONFIG_IS_ENABLED(DM_MMC)
> --
> 2.42.0
>
Regards,
Simon
More information about the U-Boot
mailing list