]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - drivers/mmc/mmc.c
mmc: make ext_csd part of struct mmc
[people/ms/u-boot.git] / drivers / mmc / mmc.c
index 707b3da6c8aae3da04771687775c6f22a49d8f1e..694091d0855a2d7caeba1c8fa2aa58dbf4c93981 100644 (file)
@@ -1146,9 +1146,10 @@ static int sd_select_bus_freq_width(struct mmc *mmc)
        return 0;
 }
 
-static int mmc_select_bus_freq_width(struct mmc *mmc, const u8 *ext_csd)
+static int mmc_select_bus_freq_width(struct mmc *mmc)
 {
        ALLOC_CACHE_ALIGN_BUFFER(u8, test_csd, MMC_MAX_BLOCK_LEN);
+       const u8 *ext_csd = mmc->ext_csd;
        /* An array of possible bus widths in order of preference */
        static const unsigned int ext_csd_bits[] = {
                EXT_CSD_DDR_BUS_WIDTH_8,
@@ -1184,6 +1185,11 @@ static int mmc_select_bus_freq_width(struct mmc *mmc, const u8 *ext_csd)
        if (mmc->version < MMC_VERSION_4)
                return 0;
 
+       if (!mmc->ext_csd) {
+               debug("No ext_csd found!\n"); /* this should enver happen */
+               return -ENOTSUPP;
+       }
+
        for (idx = 0; idx < ARRAY_SIZE(ext_csd_bits); idx++) {
                unsigned int extw = ext_csd_bits[idx];
                unsigned int caps = ext_to_hostcaps[extw];
@@ -1249,16 +1255,23 @@ static int mmc_select_bus_freq_width(struct mmc *mmc, const u8 *ext_csd)
        return err;
 }
 
-static int mmc_startup_v4(struct mmc *mmc, u8 *ext_csd)
+static int mmc_startup_v4(struct mmc *mmc)
 {
        int err, i;
        u64 capacity;
        bool has_parts = false;
        bool part_completed;
+       u8 *ext_csd;
 
        if (IS_SD(mmc) || (mmc->version < MMC_VERSION_4))
                return 0;
 
+       ext_csd = malloc_cache_aligned(MMC_MAX_BLOCK_LEN);
+       if (!ext_csd)
+               return -ENOMEM;
+
+       mmc->ext_csd = ext_csd;
+
        /* check  ext_csd version and capacity */
        err = mmc_send_ext_csd(mmc, ext_csd);
        if (err)
@@ -1418,7 +1431,6 @@ static int mmc_startup(struct mmc *mmc)
        uint mult, freq;
        u64 cmult, csize;
        struct mmc_cmd cmd;
-       ALLOC_CACHE_ALIGN_BUFFER(u8, ext_csd, MMC_MAX_BLOCK_LEN);
        struct blk_desc *bdesc;
 
 #ifdef CONFIG_MMC_SPI_CRC_ON
@@ -1567,7 +1579,7 @@ static int mmc_startup(struct mmc *mmc)
        mmc->erase_grp_size = 1;
        mmc->part_config = MMCPART_NOAVAILABLE;
 
-       err = mmc_startup_v4(mmc, ext_csd);
+       err = mmc_startup_v4(mmc);
        if (err)
                return err;
 
@@ -1578,7 +1590,7 @@ static int mmc_startup(struct mmc *mmc)
        if (IS_SD(mmc))
                err = sd_select_bus_freq_width(mmc);
        else
-               err = mmc_select_bus_freq_width(mmc, ext_csd);
+               err = mmc_select_bus_freq_width(mmc);
 
        if (err)
                return err;