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>
---
 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);
        }
 }
 
-- 
2.42.0

Reply via email to