]> Git Repo - u-boot.git/blobdiff - drivers/mmc/mmc.c
Merge tag 'arc-last-minute-for-2019.04' of git://git.denx.de/u-boot-arc
[u-boot.git] / drivers / mmc / mmc.c
index 84d157ff4033518f98073ed9d5f094bf85ce1811..89b255daf486759c74c8ae2c6c6e3f5369b4108a 100644 (file)
@@ -67,7 +67,7 @@ __weak int board_mmc_getcd(struct mmc *mmc)
 void mmmc_trace_before_send(struct mmc *mmc, struct mmc_cmd *cmd)
 {
        printf("CMD_SEND:%d\n", cmd->cmdidx);
-       printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg);
+       printf("\t\tARG\t\t\t 0x%08x\n", cmd->cmdarg);
 }
 
 void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
@@ -83,21 +83,21 @@ void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
                        printf("\t\tMMC_RSP_NONE\n");
                        break;
                case MMC_RSP_R1:
-                       printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08X \n",
+                       printf("\t\tMMC_RSP_R1,5,6,7 \t 0x%08x \n",
                                cmd->response[0]);
                        break;
                case MMC_RSP_R1b:
-                       printf("\t\tMMC_RSP_R1b\t\t 0x%08X \n",
+                       printf("\t\tMMC_RSP_R1b\t\t 0x%08x \n",
                                cmd->response[0]);
                        break;
                case MMC_RSP_R2:
-                       printf("\t\tMMC_RSP_R2\t\t 0x%08X \n",
+                       printf("\t\tMMC_RSP_R2\t\t 0x%08x \n",
                                cmd->response[0]);
-                       printf("\t\t          \t\t 0x%08X \n",
+                       printf("\t\t          \t\t 0x%08x \n",
                                cmd->response[1]);
-                       printf("\t\t          \t\t 0x%08X \n",
+                       printf("\t\t          \t\t 0x%08x \n",
                                cmd->response[2]);
-                       printf("\t\t          \t\t 0x%08X \n",
+                       printf("\t\t          \t\t 0x%08x \n",
                                cmd->response[3]);
                        printf("\n");
                        printf("\t\t\t\t\tDUMPING DATA\n");
@@ -107,12 +107,12 @@ void mmmc_trace_after_send(struct mmc *mmc, struct mmc_cmd *cmd, int ret)
                                ptr = (u8 *)&cmd->response[i];
                                ptr += 3;
                                for (j = 0; j < 4; j++)
-                                       printf("%02X ", *ptr--);
+                                       printf("%02x ", *ptr--);
                                printf("\n");
                        }
                        break;
                case MMC_RSP_R3:
-                       printf("\t\tMMC_RSP_R3,4\t\t 0x%08X \n",
+                       printf("\t\tMMC_RSP_R3,4\t\t 0x%08x \n",
                                cmd->response[0]);
                        break;
                default:
@@ -226,7 +226,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)
 
                        if (cmd.response[0] & MMC_STATUS_MASK) {
 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
-                               pr_err("Status Error: 0x%08X\n",
+                               pr_err("Status Error: 0x%08x\n",
                                       cmd.response[0]);
 #endif
                                return -ECOMM;
@@ -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;
 
@@ -2769,6 +2781,32 @@ int mmc_init(struct mmc *mmc)
        return err;
 }
 
+#if CONFIG_IS_ENABLED(MMC_UHS_SUPPORT) || \
+    CONFIG_IS_ENABLED(MMC_HS200_SUPPORT) || \
+    CONFIG_IS_ENABLED(MMC_HS400_SUPPORT)
+int mmc_deinit(struct mmc *mmc)
+{
+       u32 caps_filtered;
+
+       if (!mmc->has_init)
+               return 0;
+
+       if (IS_SD(mmc)) {
+               caps_filtered = mmc->card_caps &
+                       ~(MMC_CAP(UHS_SDR12) | MMC_CAP(UHS_SDR25) |
+                         MMC_CAP(UHS_SDR50) | MMC_CAP(UHS_DDR50) |
+                         MMC_CAP(UHS_SDR104));
+
+               return sd_select_mode_and_width(mmc, caps_filtered);
+       } else {
+               caps_filtered = mmc->card_caps &
+                       ~(MMC_CAP(MMC_HS_200) | MMC_CAP(MMC_HS_400));
+
+               return mmc_select_mode_and_width(mmc, caps_filtered);
+       }
+}
+#endif
+
 int mmc_set_dsr(struct mmc *mmc, u16 val)
 {
        mmc->dsr = val;
This page took 0.031277 seconds and 4 git commands to generate.