[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