From dfda9d88e5062620952956f7ed8e2a31ceffa6e6 Mon Sep 17 00:00:00 2001 From: Jean-Jacques Hiblot Date: Thu, 21 Sep 2017 16:29:51 +0200 Subject: [PATCH] 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 Reviewed-by: Simon Glass --- drivers/mmc/mmc.c | 22 +++++++++++++++++----- include/mmc.h | 1 + 2 files changed, 18 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; diff --git a/include/mmc.h b/include/mmc.h index 188dc749dd..7d2b363acb 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -462,6 +462,7 @@ struct mmc { struct udevice *vqmmc_supply; /* IO voltage regulator (Vccq)*/ #endif #endif + u8 *ext_csd; }; struct mmc_hwpart_conf { -- 2.39.2