Merge tag '2019.01-next' of https://github.com/mbgg/u-boot
[platform/kernel/u-boot.git] / drivers / mmc / mmc.c
index 84d157f..b04345a 100644 (file)
@@ -724,7 +724,8 @@ static int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd)
        return err;
 }
 
-int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
+static int __mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value,
+                       bool send_status)
 {
        struct mmc_cmd cmd;
        int timeout = 1000;
@@ -740,19 +741,29 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
        while (retries > 0) {
                ret = mmc_send_cmd(mmc, &cmd, NULL);
 
-               /* Waiting for the ready status */
-               if (!ret) {
-                       ret = mmc_send_status(mmc, timeout);
-                       return ret;
+               if (ret) {
+                       retries--;
+                       continue;
+               }
+
+               if (!send_status) {
+                       mdelay(50);
+                       return 0;
                }
 
-               retries--;
+               /* Waiting for the ready status */
+               return mmc_send_status(mmc, timeout);
        }
 
        return ret;
 
 }
 
+int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
+{
+       return __mmc_switch(mmc, set, index, value, true);
+}
+
 #if !CONFIG_IS_ENABLED(MMC_TINY)
 static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode,
                              bool hsdowngrade)
@@ -784,8 +795,9 @@ static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode,
        default:
                return -EINVAL;
        }
-       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING,
-                        speed_bits);
+
+       err = __mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING,
+                          speed_bits, !hsdowngrade);
        if (err)
                return err;