[PATCH] mmc: Poll CD in case cyclic framework is enabled

Marek Vasut marek.vasut+renesas at mailbox.org
Sun Dec 3 00:40:26 CET 2023


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>
---
 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



More information about the U-Boot mailing list