summaryrefslogtreecommitdiff
path: root/drivers/mmc/mmc.c
diff options
context:
space:
mode:
authorJean-Jacques Hiblot <jjhiblot@ti.com>2017-09-21 16:29:51 +0200
committerJaehoon Chung <jh80.chung@samsung.com>2018-01-12 18:11:03 +0900
commitdfda9d88e5062620952956f7ed8e2a31ceffa6e6 (patch)
tree9706d4151fd3870f7d7258464f6e6732015f98c7 /drivers/mmc/mmc.c
parentc744b6f6dcf6054f4eb8ff2428edb6ba408c4a46 (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.c22
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;