]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
mmc: make ext_csd part of struct mmc
authorJean-Jacques Hiblot <jjhiblot@ti.com>
Thu, 21 Sep 2017 14:29:51 +0000 (16:29 +0200)
committerJaehoon Chung <jh80.chung@samsung.com>
Fri, 12 Jan 2018 09:11:03 +0000 (18:11 +0900)
The ext csd is used for comparison many times. Keep a reference content
of the ext csd in the struct mmc to avoid reading multiple times

Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/mmc/mmc.c
include/mmc.h

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;
index 188dc749dd722efd3300ed2dc057702baa7457a6..7d2b363acbb6644228346a39272ab520863ada5a 100644 (file)
@@ -462,6 +462,7 @@ struct mmc {
        struct udevice *vqmmc_supply;   /* IO voltage regulator (Vccq)*/
 #endif
 #endif
+       u8 *ext_csd;
 };
 
 struct mmc_hwpart_conf {