mmc: core: fix using wrong io voltage if mmc_select_hs200 fails
[linux-2.6-block.git] / drivers / mmc / core / mmc.c
index f99c47e003fe0dc9bab8db1a8f7047963f202ae8..e0c9a559c5fd162918e6e21ec9361318367a0429 100644 (file)
@@ -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;
 }