summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/mmc.c61
-rw-r--r--include/mmc.h10
2 files changed, 45 insertions, 26 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index f7827f527a..ad429f49c9 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -2491,36 +2491,11 @@ static int mmc_power_cycle(struct mmc *mmc)
return mmc_power_on(mmc);
}
-int mmc_start_init(struct mmc *mmc)
+int mmc_get_op_cond(struct mmc *mmc)
{
- bool no_card;
bool uhs_en = supports_uhs(mmc->cfg->host_caps);
int err;
- /*
- * all hosts are capable of 1 bit bus-width and able to use the legacy
- * timings.
- */
- mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(SD_LEGACY) |
- MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
-
-#if !defined(CONFIG_MMC_BROKEN_CD)
- /* we pretend there's no card when init is NULL */
- no_card = mmc_getcd(mmc) == 0;
-#else
- no_card = 0;
-#endif
-#if !CONFIG_IS_ENABLED(DM_MMC)
- no_card = no_card || (mmc->cfg->ops->init == NULL);
-#endif
- if (no_card) {
- mmc->has_init = 0;
-#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
- pr_err("MMC: no card present\n");
-#endif
- return -ENOMEDIUM;
- }
-
if (mmc->has_init)
return 0;
@@ -2597,6 +2572,40 @@ retry:
}
}
+ return err;
+}
+
+int mmc_start_init(struct mmc *mmc)
+{
+ bool no_card;
+ int err = 0;
+
+ /*
+ * all hosts are capable of 1 bit bus-width and able to use the legacy
+ * timings.
+ */
+ mmc->host_caps = mmc->cfg->host_caps | MMC_CAP(SD_LEGACY) |
+ MMC_CAP(MMC_LEGACY) | MMC_MODE_1BIT;
+
+#if !defined(CONFIG_MMC_BROKEN_CD)
+ /* we pretend there's no card when init is NULL */
+ no_card = mmc_getcd(mmc) == 0;
+#else
+ no_card = 0;
+#endif
+#if !CONFIG_IS_ENABLED(DM_MMC)
+ no_card = no_card || (mmc->cfg->ops->init == NULL);
+#endif
+ if (no_card) {
+ mmc->has_init = 0;
+#if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
+ pr_err("MMC: no card present\n");
+#endif
+ return -ENOMEDIUM;
+ }
+
+ err = mmc_get_op_cond(mmc);
+
if (!err)
mmc->init_in_progress = 1;
diff --git a/include/mmc.h b/include/mmc.h
index 1729292d27..df4255b828 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -754,6 +754,16 @@ int mmc_set_bkops_enable(struct mmc *mmc);
/**
* Start device initialization and return immediately; it does not block on
+ * polling OCR (operation condition register) status. Useful for checking
+ * the presence of SD/eMMC when no card detect logic is available.
+ *
+ * @param mmc Pointer to a MMC device struct
+ * @return 0 on success, <0 on error.
+ */
+int mmc_get_op_cond(struct mmc *mmc);
+
+/**
+ * Start device initialization and return immediately; it does not block on
* polling OCR (operation condition register) status. Then you should call
* mmc_init, which would block on polling OCR status and complete the device
* initializatin.