X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fu-boot.git;a=blobdiff_plain;f=drivers%2Fmmc%2Fmmc.c;h=694091d0855a2d7caeba1c8fa2aa58dbf4c93981;hp=707b3da6c8aae3da04771687775c6f22a49d8f1e;hb=dfda9d88e5062620952956f7ed8e2a31ceffa6e6;hpb=c744b6f6dcf6054f4eb8ff2428edb6ba408c4a46 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;