
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@mailbox.org --- Cc: Jaehoon Chung jh80.chung@samsung.com Cc: Peng Fan peng.fan@nxp.com --- drivers/mmc/mmc-uclass.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)
diff --git a/drivers/mmc/mmc-uclass.c b/drivers/mmc/mmc-uclass.c index cdead044177..c4c9881c40b 100644 --- a/drivers/mmc/mmc-uclass.c +++ b/drivers/mmc/mmc-uclass.c @@ -8,6 +8,7 @@ #define LOG_CATEGORY UCLASS_MMC
#include <common.h> +#include <cyclic.h> #include <bootdev.h> #include <log.h> #include <mmc.h> @@ -343,8 +344,23 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc) return desc; }
+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; +} + void mmc_do_preinit(void) { + struct cyclic_info *cyclic; struct udevice *dev; struct uclass *uc; int ret; @@ -362,6 +378,17 @@ void mmc_do_preinit(void)
if (m->preinit) mmc_start_init(m); + + if (!CONFIG_IS_ENABLED(CYCLIC)) + continue; + + /* Register cyclic function for card detect polling */ + cyclic = cyclic_register(mmc_cyclic_cd_poll, 100 * 1000, + m->cfg->name, m); + if (cyclic) + continue; + + printf("Failed to register %s CD poll function\n", m->cfg->name); } }