Hi Marek, On Sun, 10 Dec 2023 at 08:03, Marek Vasut <marek.vasut+rene...@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+rene...@mailbox.org> > --- > Cc: Jaehoon Chung <jh80.ch...@samsung.com> > Cc: Peng Fan <peng....@nxp.com> > Cc: Simon Glass <s...@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