diff options
author | Jean-Jacques Hiblot <jjhiblot@ti.com> | 2017-09-21 16:29:51 +0200 |
---|---|---|
committer | Jaehoon Chung <jh80.chung@samsung.com> | 2018-01-12 18:11:03 +0900 |
commit | dfda9d88e5062620952956f7ed8e2a31ceffa6e6 (patch) | |
tree | 9706d4151fd3870f7d7258464f6e6732015f98c7 /drivers/mmc/mmc.c | |
parent | c744b6f6dcf6054f4eb8ff2428edb6ba408c4a46 (diff) |
mmc: make ext_csd part of struct mmc
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>
Diffstat (limited to 'drivers/mmc/mmc.c')
-rw-r--r-- | drivers/mmc/mmc.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 707b3da6c8..694091d085 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -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; |