aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/mmc/mmc.c19
-rw-r--r--include/mmc.h1
2 files changed, 17 insertions, 3 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index fe31540ba29..dbd95946ea3 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -1451,7 +1451,7 @@ static int sd_select_mode_and_width(struct mmc *mmc)
if (err)
return err;
/* Restrict card's capabilities by what the host can do */
- caps = mmc->card_caps & (mmc->cfg->host_caps | MMC_MODE_1BIT);
+ caps = mmc->card_caps & (mmc->host_caps | MMC_MODE_1BIT);
if (!uhs_en)
caps &= ~UHS_CAPS;
@@ -1599,7 +1599,7 @@ static int mmc_select_mode_and_width(struct mmc *mmc)
return err;
/* Restrict card's capabilities by what the host can do */
- mmc->card_caps &= (mmc->cfg->host_caps | MMC_MODE_1BIT);
+ mmc->card_caps &= (mmc->host_caps | MMC_MODE_1BIT);
/* Only version 4 of MMC supports wider bus widths */
if (mmc->version < MMC_VERSION_4)
@@ -2182,6 +2182,8 @@ int mmc_start_init(struct mmc *mmc)
bool uhs_en = supports_uhs(mmc->cfg->host_caps);
int err;
+ mmc->host_caps = mmc->cfg->host_caps;
+
/* we pretend there's no card when init is NULL */
no_card = mmc_getcd(mmc) == 0;
#if !CONFIG_IS_ENABLED(DM_MMC)
@@ -2205,7 +2207,18 @@ int mmc_start_init(struct mmc *mmc)
if (err)
return err;
- err = mmc_power_on(mmc);
+ err = mmc_power_cycle(mmc);
+ if (err) {
+ /*
+ * if power cycling is not supported, we should not try
+ * to use the UHS modes, because we wouldn't be able to
+ * recover from an error during the UHS initialization.
+ */
+ debug("Unable to do a full power cycle. Disabling the UHS modes for safety\n");
+ uhs_en = false;
+ mmc->host_caps &= ~UHS_CAPS;
+ err = mmc_power_on(mmc);
+ }
if (err)
return err;
diff --git a/include/mmc.h b/include/mmc.h
index ba4a13e8617..59ea363ea27 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -544,6 +544,7 @@ struct mmc {
uint clock;
enum mmc_voltage signal_voltage;
uint card_caps;
+ uint host_caps;
uint ocr;
uint dsr;
uint dsr_imp;