]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/mmc/mmc.c
mmc: move the MMC startup for version above v4.0 in a separate function
[people/ms/u-boot.git] / drivers / mmc / mmc.c
index 3cdf6a4f3b1370a3a3ec43e39db7a52c3f6cab96..707b3da6c8aae3da04771687775c6f22a49d8f1e 100644 (file)
@@ -53,7 +53,7 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
 }
 #endif
 
-#ifndef CONFIG_DM_MMC_OPS
+#if !CONFIG_IS_ENABLED(DM_MMC)
 __weak int board_mmc_getwp(struct mmc *mmc)
 {
        return -1;
@@ -149,7 +149,7 @@ void mmc_trace_state(struct mmc *mmc, struct mmc_cmd *cmd)
 }
 #endif
 
-#ifndef CONFIG_DM_MMC_OPS
+#if !CONFIG_IS_ENABLED(DM_MMC)
 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 {
        int ret;
@@ -261,14 +261,14 @@ static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
        return blkcnt;
 }
 
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
 ulong mmc_bread(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *dst)
 #else
 ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
                void *dst)
 #endif
 {
-#ifdef CONFIG_BLK
+#if CONFIG_IS_ENABLED(BLK)
        struct blk_desc *block_dev = dev_get_uclass_platdata(dev);
 #endif
        int dev_num = block_dev->devnum;
@@ -839,7 +839,7 @@ int mmc_hwpart_config(struct mmc *mmc,
        return 0;
 }
 
-#ifndef CONFIG_DM_MMC_OPS
+#if !CONFIG_IS_ENABLED(DM_MMC)
 int mmc_getcd(struct mmc *mmc)
 {
        int cd;
@@ -882,8 +882,8 @@ static int sd_change_freq(struct mmc *mmc)
 {
        int err;
        struct mmc_cmd cmd;
-       ALLOC_CACHE_ALIGN_BUFFER(uint, scr, 2);
-       ALLOC_CACHE_ALIGN_BUFFER(uint, switch_status, 16);
+       ALLOC_CACHE_ALIGN_BUFFER(__be32, scr, 2);
+       ALLOC_CACHE_ALIGN_BUFFER(__be32, switch_status, 16);
        struct mmc_data data;
        int timeout;
 
@@ -1075,7 +1075,7 @@ static const u8 multipliers[] = {
        80,
 };
 
-#ifndef CONFIG_DM_MMC_OPS
+#if !CONFIG_IS_ENABLED(DM_MMC)
 static void mmc_set_ios(struct mmc *mmc)
 {
        if (mmc->cfg->ops->set_ios)
@@ -1103,16 +1103,322 @@ static void mmc_set_bus_width(struct mmc *mmc, uint width)
        mmc_set_ios(mmc);
 }
 
+static int sd_select_bus_freq_width(struct mmc *mmc)
+{
+       int err;
+       struct mmc_cmd cmd;
+
+       err = sd_change_freq(mmc);
+       if (err)
+               return err;
+
+       /* Restrict card's capabilities by what the host can do */
+       mmc->card_caps &= mmc->cfg->host_caps;
+
+       if (mmc->card_caps & MMC_MODE_4BIT) {
+               cmd.cmdidx = MMC_CMD_APP_CMD;
+               cmd.resp_type = MMC_RSP_R1;
+               cmd.cmdarg = mmc->rca << 16;
+
+               err = mmc_send_cmd(mmc, &cmd, NULL);
+               if (err)
+                       return err;
+
+               cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
+               cmd.resp_type = MMC_RSP_R1;
+               cmd.cmdarg = 2;
+               err = mmc_send_cmd(mmc, &cmd, NULL);
+               if (err)
+                       return err;
+
+               mmc_set_bus_width(mmc, 4);
+       }
+
+       err = sd_read_ssr(mmc);
+       if (err)
+               return err;
+
+       if (mmc->card_caps & MMC_MODE_HS)
+               mmc->tran_speed = 50000000;
+       else
+               mmc->tran_speed = 25000000;
+
+       return 0;
+}
+
+static int mmc_select_bus_freq_width(struct mmc *mmc, const u8 *ext_csd)
+{
+       ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
+       /* An array of possible bus widths in order of preference */
+       static const unsigned int ext_csd_bits[] = {
+               EXT_CSD_DDR_BUS_WIDTH_8,
+               EXT_CSD_DDR_BUS_WIDTH_4,
+               EXT_CSD_BUS_WIDTH_8,
+               EXT_CSD_BUS_WIDTH_4,
+               EXT_CSD_BUS_WIDTH_1,
+       };
+       /* An array to map CSD bus widths to host cap bits */
+       static const unsigned int ext_to_hostcaps[] = {
+               [EXT_CSD_DDR_BUS_WIDTH_4] =
+                       MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
+               [EXT_CSD_DDR_BUS_WIDTH_8] =
+                       MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
+               [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
+               [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
+       };
+       /* An array to map chosen bus width to an integer */
+       static const unsigned int widths[] = {
+               8, 4, 8, 4, 1,
+       };
+       int err;
+       int idx;
+
+       err = mmc_change_freq(mmc);
+       if (err)
+               return err;
+
+       /* Restrict card's capabilities by what the host can do */
+       mmc->card_caps &= mmc->cfg->host_caps;
+
+       /* Only version 4 of MMC supports wider bus widths */
+       if (mmc->version < MMC_VERSION_4)
+               return 0;
+
+       for (idx = 0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
+               unsigned int extw = ext_csd_bits[idx];
+               unsigned int caps = ext_to_hostcaps[extw];
+               /*
+                * If the bus width is still not changed,
+                * don't try to set the default again.
+                * Otherwise, recover from switch attempts
+                * by switching to 1-bit bus width.
+                */
+               if (extw == EXT_CSD_BUS_WIDTH_1 &&
+                   mmc->bus_width == 1) {
+                       err = 0;
+                       break;
+               }
+
+               /*
+                * Check to make sure the card and controller support
+                * these capabilities
+                */
+               if ((mmc->card_caps & caps) != caps)
+                       continue;
+
+               err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
+                                EXT_CSD_BUS_WIDTH, extw);
+
+               if (err)
+                       continue;
+
+               mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
+               mmc_set_bus_width(mmc, widths[idx]);
+
+               err = mmc_send_ext_csd(mmc, test_csd);
+
+               if (err)
+                       continue;
+
+               /* Only compare read only fields */
+               if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
+                       == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
+                   ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
+                       == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
+                   ext_csd[EXT_CSD_REV]
+                       == test_csd[EXT_CSD_REV] &&
+                   ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
+                       == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
+                   memcmp(&ext_csd[EXT_CSD_SEC_CNT],
+                          &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
+                       break;
+
+               err = -EBADMSG;
+       }
+
+       if (err)
+               return err;
+
+       if (mmc->card_caps & MMC_MODE_HS) {
+               if (mmc->card_caps & MMC_MODE_HS_52MHz)
+                       mmc->tran_speed = 52000000;
+               else
+                       mmc->tran_speed = 26000000;
+       }
+
+       return err;
+}
+
+static int mmc_startup_v4(struct mmc *mmc, u8 *ext_csd)
+{
+       int err, i;
+       u64 capacity;
+       bool has_parts = false;
+       bool part_completed;
+
+       if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4))
+               return 0;
+
+       /* check  ext_csd version and capacity */
+       err = mmc_send_ext_csd(mmc, ext_csd);
+       if (err)
+               return err;
+       if (ext_csd[EXT_CSD_REV] >= 2) {
+               /*
+                * According to the JEDEC Standard, the value of
+                * ext_csd's capacity is valid if the value is more
+                * than 2GB
+                */
+               capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
+                               | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
+                               | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
+                               | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
+               capacity *= MMC_MAX_BLOCK_LEN;
+               if ((capacity >> 20) > 2 * 1024)
+                       mmc->capacity_user = capacity;
+       }
+
+       switch (ext_csd[EXT_CSD_REV]) {
+       case 1:
+               mmc->version = MMC_VERSION_4_1;
+               break;
+       case 2:
+               mmc->version = MMC_VERSION_4_2;
+               break;
+       case 3:
+               mmc->version = MMC_VERSION_4_3;
+               break;
+       case 5:
+               mmc->version = MMC_VERSION_4_41;
+               break;
+       case 6:
+               mmc->version = MMC_VERSION_4_5;
+               break;
+       case 7:
+               mmc->version = MMC_VERSION_5_0;
+               break;
+       case 8:
+               mmc->version = MMC_VERSION_5_1;
+               break;
+       }
+
+       /* The partition data may be non-zero but it is only
+        * effective if PARTITION_SETTING_COMPLETED is set in
+        * EXT_CSD, so ignore any data if this bit is not set,
+        * except for enabling the high-capacity group size
+        * definition (see below).
+        */
+       part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
+                           EXT_CSD_PARTITION_SETTING_COMPLETED);
+
+       /* store the partition info of emmc */
+       mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
+       if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
+           ext_csd[EXT_CSD_BOOT_MULT])
+               mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
+       if (part_completed &&
+           (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
+               mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
+
+       mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
+
+       mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
+
+       for (i = 0; i < 4; i++) {
+               int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
+               uint mult = (ext_csd[idx + 2] << 16) +
+                       (ext_csd[idx + 1] << 8) + ext_csd[idx];
+               if (mult)
+                       has_parts = true;
+               if (!part_completed)
+                       continue;
+               mmc->capacity_gp[i] = mult;
+               mmc->capacity_gp[i] *=
+                       ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
+               mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
+               mmc->capacity_gp[i] <<= 19;
+       }
+
+       if (part_completed) {
+               mmc->enh_user_size =
+                       (ext_csd[EXT_CSD_ENH_SIZE_MULT + 2] << 16) +
+                       (ext_csd[EXT_CSD_ENH_SIZE_MULT + 1] << 8) +
+                       ext_csd[EXT_CSD_ENH_SIZE_MULT];
+               mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
+               mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
+               mmc->enh_user_size <<= 19;
+               mmc->enh_user_start =
+                       (ext_csd[EXT_CSD_ENH_START_ADDR + 3] << 24) +
+                       (ext_csd[EXT_CSD_ENH_START_ADDR + 2] << 16) +
+                       (ext_csd[EXT_CSD_ENH_START_ADDR + 1] << 8) +
+                       ext_csd[EXT_CSD_ENH_START_ADDR];
+               if (mmc->high_capacity)
+                       mmc->enh_user_start <<= 9;
+       }
+
+       /*
+        * Host needs to enable ERASE_GRP_DEF bit if device is
+        * partitioned. This bit will be lost every time after a reset
+        * or power off. This will affect erase size.
+        */
+       if (part_completed)
+               has_parts = true;
+       if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
+           (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
+               has_parts = true;
+       if (has_parts) {
+               err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
+                                EXT_CSD_ERASE_GROUP_DEF, 1);
+
+               if (err)
+                       return err;
+
+               ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
+       }
+
+       if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
+               /* Read out group size from ext_csd */
+               mmc->erase_grp_size =
+                       ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
+               /*
+                * if high capacity and partition setting completed
+                * SEC_COUNT is valid even if it is smaller than 2 GiB
+                * JEDEC Standard JESD84-B45, 6.2.4
+                */
+               if (mmc->high_capacity && part_completed) {
+                       capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
+                               (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
+                               (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
+                               (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
+                       capacity *= MMC_MAX_BLOCK_LEN;
+                       mmc->capacity_user = capacity;
+               }
+       } else {
+               /* Calculate the group size from the csd value. */
+               int erase_gsz, erase_gmul;
+
+               erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
+               erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
+               mmc->erase_grp_size = (erase_gsz + 1)
+                       * (erase_gmul + 1);
+       }
+
+       mmc->hc_wp_grp_size = 1024
+               * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
+               * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
+
+       mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
+
+       return 0;
+}
+
 static int mmc_startup(struct mmc *mmc)
 {
        int err, i;
        uint mult, freq;
-       u64 cmult, csize, capacity;
+       u64 cmult, csize;
        struct mmc_cmd cmd;
        ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
-       ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
-       bool has_parts = false;
-       bool part_completed;
        struct blk_desc *bdesc;
 
 #ifdef CONFIG_MMC_SPI_CRC_ON
@@ -1260,291 +1566,23 @@ static int mmc_startup(struct mmc *mmc)
         */
        mmc->erase_grp_size = 1;
        mmc->part_config = MMCPART_NOAVAILABLE;
-       if (!IS_SD(mmc) && (mmc->version >= MMC_VERSION_4)) {
-               /* check  ext_csd version and capacity */
-               err = mmc_send_ext_csd(mmc, ext_csd);
-               if (err)
-                       return err;
-               if (ext_csd[EXT_CSD_REV] >= 2) {
-                       /*
-                        * According to the JEDEC Standard, the value of
-                        * ext_csd's capacity is valid if the value is more
-                        * than 2GB
-                        */
-                       capacity = ext_csd[EXT_CSD_SEC_CNT] << 0
-                                       | ext_csd[EXT_CSD_SEC_CNT + 1] << 8
-                                       | ext_csd[EXT_CSD_SEC_CNT + 2] << 16
-                                       | ext_csd[EXT_CSD_SEC_CNT + 3] << 24;
-                       capacity *= MMC_MAX_BLOCK_LEN;
-                       if ((capacity >> 20) > 2 * 1024)
-                               mmc->capacity_user = capacity;
-               }
-
-               switch (ext_csd[EXT_CSD_REV]) {
-               case 1:
-                       mmc->version = MMC_VERSION_4_1;
-                       break;
-               case 2:
-                       mmc->version = MMC_VERSION_4_2;
-                       break;
-               case 3:
-                       mmc->version = MMC_VERSION_4_3;
-                       break;
-               case 5:
-                       mmc->version = MMC_VERSION_4_41;
-                       break;
-               case 6:
-                       mmc->version = MMC_VERSION_4_5;
-                       break;
-               case 7:
-                       mmc->version = MMC_VERSION_5_0;
-                       break;
-               case 8:
-                       mmc->version = MMC_VERSION_5_1;
-                       break;
-               }
 
-               /* The partition data may be non-zero but it is only
-                * effective if PARTITION_SETTING_COMPLETED is set in
-                * EXT_CSD, so ignore any data if this bit is not set,
-                * except for enabling the high-capacity group size
-                * definition (see below). */
-               part_completed = !!(ext_csd[EXT_CSD_PARTITION_SETTING] &
-                                   EXT_CSD_PARTITION_SETTING_COMPLETED);
-
-               /* store the partition info of emmc */
-               mmc->part_support = ext_csd[EXT_CSD_PARTITIONING_SUPPORT];
-               if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) ||
-                   ext_csd[EXT_CSD_BOOT_MULT])
-                       mmc->part_config = ext_csd[EXT_CSD_PART_CONF];
-               if (part_completed &&
-                   (ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & ENHNCD_SUPPORT))
-                       mmc->part_attr = ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE];
-
-               mmc->capacity_boot = ext_csd[EXT_CSD_BOOT_MULT] << 17;
-
-               mmc->capacity_rpmb = ext_csd[EXT_CSD_RPMB_MULT] << 17;
-
-               for (i = 0; i < 4; i++) {
-                       int idx = EXT_CSD_GP_SIZE_MULT + i * 3;
-                       uint mult = (ext_csd[idx + 2] << 16) +
-                               (ext_csd[idx + 1] << 8) + ext_csd[idx];
-                       if (mult)
-                               has_parts = true;
-                       if (!part_completed)
-                               continue;
-                       mmc->capacity_gp[i] = mult;
-                       mmc->capacity_gp[i] *=
-                               ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
-                       mmc->capacity_gp[i] *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
-                       mmc->capacity_gp[i] <<= 19;
-               }
-
-               if (part_completed) {
-                       mmc->enh_user_size =
-                               (ext_csd[EXT_CSD_ENH_SIZE_MULT+2] << 16) +
-                               (ext_csd[EXT_CSD_ENH_SIZE_MULT+1] << 8) +
-                               ext_csd[EXT_CSD_ENH_SIZE_MULT];
-                       mmc->enh_user_size *= ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
-                       mmc->enh_user_size *= ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
-                       mmc->enh_user_size <<= 19;
-                       mmc->enh_user_start =
-                               (ext_csd[EXT_CSD_ENH_START_ADDR+3] << 24) +
-                               (ext_csd[EXT_CSD_ENH_START_ADDR+2] << 16) +
-                               (ext_csd[EXT_CSD_ENH_START_ADDR+1] << 8) +
-                               ext_csd[EXT_CSD_ENH_START_ADDR];
-                       if (mmc->high_capacity)
-                               mmc->enh_user_start <<= 9;
-               }
-
-               /*
-                * Host needs to enable ERASE_GRP_DEF bit if device is
-                * partitioned. This bit will be lost every time after a reset
-                * or power off. This will affect erase size.
-                */
-               if (part_completed)
-                       has_parts = true;
-               if ((ext_csd[EXT_CSD_PARTITIONING_SUPPORT] & PART_SUPPORT) &&
-                   (ext_csd[EXT_CSD_PARTITIONS_ATTRIBUTE] & PART_ENH_ATTRIB))
-                       has_parts = true;
-               if (has_parts) {
-                       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
-                               EXT_CSD_ERASE_GROUP_DEF, 1);
-
-                       if (err)
-                               return err;
-                       else
-                               ext_csd[EXT_CSD_ERASE_GROUP_DEF] = 1;
-               }
-
-               if (ext_csd[EXT_CSD_ERASE_GROUP_DEF] & 0x01) {
-                       /* Read out group size from ext_csd */
-                       mmc->erase_grp_size =
-                               ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] * 1024;
-                       /*
-                        * if high capacity and partition setting completed
-                        * SEC_COUNT is valid even if it is smaller than 2 GiB
-                        * JEDEC Standard JESD84-B45, 6.2.4
-                        */
-                       if (mmc->high_capacity && part_completed) {
-                               capacity = (ext_csd[EXT_CSD_SEC_CNT]) |
-                                       (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) |
-                                       (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) |
-                                       (ext_csd[EXT_CSD_SEC_CNT + 3] << 24);
-                               capacity *= MMC_MAX_BLOCK_LEN;
-                               mmc->capacity_user = capacity;
-                       }
-               } else {
-                       /* Calculate the group size from the csd value. */
-                       int erase_gsz, erase_gmul;
-                       erase_gsz = (mmc->csd[2] & 0x00007c00) >> 10;
-                       erase_gmul = (mmc->csd[2] & 0x000003e0) >> 5;
-                       mmc->erase_grp_size = (erase_gsz + 1)
-                               * (erase_gmul + 1);
-               }
-
-               mmc->hc_wp_grp_size = 1024
-                       * ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
-                       * ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
-
-               mmc->wr_rel_set = ext_csd[EXT_CSD_WR_REL_SET];
-       }
+       err = mmc_startup_v4(mmc, ext_csd);
+       if (err)
+               return err;
 
        err = mmc_set_capacity(mmc, mmc_get_blk_desc(mmc)->hwpart);
        if (err)
                return err;
 
        if (IS_SD(mmc))
-               err = sd_change_freq(mmc);
+               err = sd_select_bus_freq_width(mmc);
        else
-               err = mmc_change_freq(mmc);
+               err = mmc_select_bus_freq_width(mmc, ext_csd);
 
        if (err)
                return err;
 
-       /* Restrict card's capabilities by what the host can do */
-       mmc->card_caps &= mmc->cfg->host_caps;
-
-       if (IS_SD(mmc)) {
-               if (mmc->card_caps & MMC_MODE_4BIT) {
-                       cmd.cmdidx = MMC_CMD_APP_CMD;
-                       cmd.resp_type = MMC_RSP_R1;
-                       cmd.cmdarg = mmc->rca << 16;
-
-                       err = mmc_send_cmd(mmc, &cmd, NULL);
-                       if (err)
-                               return err;
-
-                       cmd.cmdidx = SD_CMD_APP_SET_BUS_WIDTH;
-                       cmd.resp_type = MMC_RSP_R1;
-                       cmd.cmdarg = 2;
-                       err = mmc_send_cmd(mmc, &cmd, NULL);
-                       if (err)
-                               return err;
-
-                       mmc_set_bus_width(mmc, 4);
-               }
-
-               err = sd_read_ssr(mmc);
-               if (err)
-                       return err;
-
-               if (mmc->card_caps & MMC_MODE_HS)
-                       mmc->tran_speed = 50000000;
-               else
-                       mmc->tran_speed = 25000000;
-       } else if (mmc->version >= MMC_VERSION_4) {
-               /* Only version 4 of MMC supports wider bus widths */
-               int idx;
-
-               /* An array of possible bus widths in order of preference */
-               static unsigned ext_csd_bits[] = {
-                       EXT_CSD_DDR_BUS_WIDTH_8,
-                       EXT_CSD_DDR_BUS_WIDTH_4,
-                       EXT_CSD_BUS_WIDTH_8,
-                       EXT_CSD_BUS_WIDTH_4,
-                       EXT_CSD_BUS_WIDTH_1,
-               };
-
-               /* An array to map CSD bus widths to host cap bits */
-               static unsigned ext_to_hostcaps[] = {
-                       [EXT_CSD_DDR_BUS_WIDTH_4] =
-                               MMC_MODE_DDR_52MHz | MMC_MODE_4BIT,
-                       [EXT_CSD_DDR_BUS_WIDTH_8] =
-                               MMC_MODE_DDR_52MHz | MMC_MODE_8BIT,
-                       [EXT_CSD_BUS_WIDTH_4] = MMC_MODE_4BIT,
-                       [EXT_CSD_BUS_WIDTH_8] = MMC_MODE_8BIT,
-               };
-
-               /* An array to map chosen bus width to an integer */
-               static unsigned widths[] = {
-                       8, 4, 8, 4, 1,
-               };
-
-               for (idx=0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
-                       unsigned int extw = ext_csd_bits[idx];
-                       unsigned int caps = ext_to_hostcaps[extw];
-
-                       /*
-                        * If the bus width is still not changed,
-                        * don't try to set the default again.
-                        * Otherwise, recover from switch attempts
-                        * by switching to 1-bit bus width.
-                        */
-                       if (extw == EXT_CSD_BUS_WIDTH_1 &&
-                                       mmc->bus_width == 1) {
-                               err = 0;
-                               break;
-                       }
-
-                       /*
-                        * Check to make sure the card and controller support
-                        * these capabilities
-                        */
-                       if ((mmc->card_caps & caps) != caps)
-                               continue;
-
-                       err = mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL,
-                                       EXT_CSD_BUS_WIDTH, extw);
-
-                       if (err)
-                               continue;
-
-                       mmc->ddr_mode = (caps & MMC_MODE_DDR_52MHz) ? 1 : 0;
-                       mmc_set_bus_width(mmc, widths[idx]);
-
-                       err = mmc_send_ext_csd(mmc, test_csd);
-
-                       if (err)
-                               continue;
-
-                       /* Only compare read only fields */
-                       if (ext_csd[EXT_CSD_PARTITIONING_SUPPORT]
-                               == test_csd[EXT_CSD_PARTITIONING_SUPPORT] &&
-                           ext_csd[EXT_CSD_HC_WP_GRP_SIZE]
-                               == test_csd[EXT_CSD_HC_WP_GRP_SIZE] &&
-                           ext_csd[EXT_CSD_REV]
-                               == test_csd[EXT_CSD_REV] &&
-                           ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]
-                               == test_csd[EXT_CSD_HC_ERASE_GRP_SIZE] &&
-                           memcmp(&ext_csd[EXT_CSD_SEC_CNT],
-                                  &test_csd[EXT_CSD_SEC_CNT], 4) == 0)
-                               break;
-                       else
-                               err = -EBADMSG;
-               }
-
-               if (err)
-                       return err;
-
-               if (mmc->card_caps & MMC_MODE_HS) {
-                       if (mmc->card_caps & MMC_MODE_HS_52MHz)
-                               mmc->tran_speed = 52000000;
-                       else
-                               mmc->tran_speed = 26000000;
-               }
-       }
-
        mmc_set_clock(mmc, mmc->tran_speed);
 
        /* Fix the block length for DDR mode */
@@ -1608,7 +1646,7 @@ static int mmc_send_if_cond(struct mmc *mmc)
        return 0;
 }
 
-#ifndef CONFIG_DM_MMC
+#if !CONFIG_IS_ENABLED(DM_MMC)
 /* board-specific MMC power initializations. */
 __weak void board_mmc_power_init(void)
 {
@@ -1617,22 +1655,26 @@ __weak void board_mmc_power_init(void)
 
 static int mmc_power_init(struct mmc *mmc)
 {
-#if defined(CONFIG_DM_MMC)
-#if defined(CONFIG_DM_REGULATOR) && !defined(CONFIG_SPL_BUILD)
-       struct udevice *vmmc_supply;
+#if CONFIG_IS_ENABLED(DM_MMC)
+#if CONFIG_IS_ENABLED(DM_REGULATOR)
        int ret;
 
        ret = device_get_supply_regulator(mmc->dev, "vmmc-supply",
-                                         &vmmc_supply);
-       if (ret) {
+                                         &mmc->vmmc_supply);
+       if (ret)
                debug("%s: No vmmc supply\n", mmc->dev->name);
-               return 0;
-       }
 
-       ret = regulator_set_enable(vmmc_supply, true);
-       if (ret) {
-               puts("Error enabling VMMC supply\n");
-               return ret;
+       ret = device_get_supply_regulator(mmc->dev, "vqmmc-supply",
+                                         &mmc->vqmmc_supply);
+       if (ret)
+               debug("%s: No vqmmc supply\n", mmc->dev->name);
+
+       if (mmc->vmmc_supply) {
+               ret = regulator_set_enable(mmc->vmmc_supply, true);
+               if (ret) {
+                       puts("Error enabling VMMC supply\n");
+                       return ret;
+               }
        }
 #endif
 #else /* !CONFIG_DM_MMC */
@@ -1652,7 +1694,7 @@ int mmc_start_init(struct mmc *mmc)
 
        /* we pretend there's no card when init is NULL */
        no_card = mmc_getcd(mmc) == 0;
-#ifndef CONFIG_DM_MMC_OPS
+#if !CONFIG_IS_ENABLED(DM_MMC)
        no_card = no_card || (mmc->cfg->ops->init == NULL);
 #endif
        if (no_card) {
@@ -1673,7 +1715,7 @@ int mmc_start_init(struct mmc *mmc)
        if (err)
                return err;
 
-#ifdef CONFIG_DM_MMC_OPS
+#if CONFIG_IS_ENABLED(DM_MMC)
        /* The device has already been probed ready for use */
 #else
        /* made sure it's not NULL earlier */
@@ -1739,7 +1781,7 @@ int mmc_init(struct mmc *mmc)
 {
        int err = 0;
        __maybe_unused unsigned start;
-#ifdef CONFIG_DM_MMC
+#if CONFIG_IS_ENABLED(DM_MMC)
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(mmc->dev);
 
        upriv->mmc = mmc;
@@ -1783,12 +1825,12 @@ void mmc_set_preinit(struct mmc *mmc, int preinit)
        mmc->preinit = preinit;
 }
 
-#if defined(CONFIG_DM_MMC) && defined(CONFIG_SPL_BUILD)
+#if CONFIG_IS_ENABLED(DM_MMC) && defined(CONFIG_SPL_BUILD)
 static int mmc_probe(bd_t *bis)
 {
        return 0;
 }
-#elif defined(CONFIG_DM_MMC)
+#elif CONFIG_IS_ENABLED(DM_MMC)
 static int mmc_probe(bd_t *bis)
 {
        int ret, i;
@@ -1835,7 +1877,7 @@ int mmc_initialize(bd_t *bis)
                return 0;
        initialized = 1;
 
-#ifndef CONFIG_BLK
+#if !CONFIG_IS_ENABLED(BLK)
 #if !CONFIG_IS_ENABLED(MMC_TINY)
        mmc_list_init();
 #endif