|
@@ -1244,10 +1244,11 @@ static int mmc_select_hs200(struct mmc_card *card)
|
|
|
{
|
|
|
struct mmc_host *host = card->host;
|
|
|
bool send_status = true;
|
|
|
- unsigned int old_timing;
|
|
|
+ unsigned int old_timing, old_signal_voltage;
|
|
|
int err = -EINVAL;
|
|
|
u8 val;
|
|
|
|
|
|
+ old_signal_voltage = host->ios.signal_voltage;
|
|
|
if (card->mmc_avail_type & EXT_CSD_CARD_TYPE_HS200_1_2V)
|
|
|
err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_120);
|
|
|
|
|
@@ -1256,7 +1257,7 @@ static int mmc_select_hs200(struct mmc_card *card)
|
|
|
|
|
|
/* If fails try again during next card power cycle */
|
|
|
if (err)
|
|
|
- goto err;
|
|
|
+ return err;
|
|
|
|
|
|
mmc_select_driver_type(card);
|
|
|
|
|
@@ -1290,9 +1291,14 @@ static int mmc_select_hs200(struct mmc_card *card)
|
|
|
}
|
|
|
}
|
|
|
err:
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ /* fall back to the old signal voltage, if fails report error */
|
|
|
+ if (__mmc_set_signal_voltage(host, old_signal_voltage))
|
|
|
+ err = -EIO;
|
|
|
+
|
|
|
pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host),
|
|
|
__func__, err);
|
|
|
+ }
|
|
|
return err;
|
|
|
}
|
|
|
|