mmc: Tinification of the mmc code

Add new configuration option CONFIG_MMC_TINY which strips away all
memory allocation within the MMC code and code for handling multiple
cards. This allows extremely space-constrained SPL code use the MMC
framework.

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
master
Marek Vasut 8 years ago committed by Jaehoon Chung
parent ce9eca9438
commit b5b838f1a7
  1. 6
      common/spl/spl_mmc.c
  2. 15
      drivers/mmc/Kconfig
  3. 31
      drivers/mmc/mmc.c
  4. 32
      drivers/mmc/mmc_legacy.c
  5. 1
      include/mmc.h

@ -306,7 +306,11 @@ static int spl_mmc_load_image(struct spl_image_info *spl_image,
if (part == 7)
part = 0;
err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
if (CONFIG_IS_ENABLED(MMC_TINY))
err = mmc_switch_part(mmc, part);
else
err = blk_dselect_hwpart(mmc_get_blk_desc(mmc), part);
if (err) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
puts("spl: mmc partition switch failed\n");

@ -26,6 +26,21 @@ config DM_MMC_OPS
option will be removed as soon as all DM_MMC drivers use it, as it
will the only supported behaviour.
config SPL_MMC_TINY
bool "Tiny MMC framework in SPL"
help
Enable MMC framework tinification support. This option is useful if
if your SPL is extremely size constrained. Heed the warning, enable
this option if and only if you know exactly what you are doing, if
you are reading this help text, you most likely have no idea :-)
The MMC framework is reduced to bare minimum to be useful. No malloc
support is needed for the MMC framework operation with this option
enabled. The framework supports exactly one MMC device and exactly
one MMC driver. The MMC driver can be adjusted to avoid any malloc
operations too, which can remove the need for malloc support in SPL
and thus further reduce footprint.
config MSM_SDHCI
bool "Qualcomm SDHCI controller"
depends on DM_MMC && BLK && DM_MMC_OPS

@ -30,6 +30,29 @@ static const unsigned int sd_au_size[] = {
SZ_16M / 512, (SZ_16M + SZ_8M) / 512, SZ_32M / 512, SZ_64M / 512,
};
#if CONFIG_IS_ENABLED(MMC_TINY)
static struct mmc mmc_static;
struct mmc *find_mmc_device(int dev_num)
{
return &mmc_static;
}
void mmc_do_preinit(void)
{
struct mmc *m = &mmc_static;
#ifdef CONFIG_FSL_ESDHC_ADAPTER_IDENT
mmc_set_preinit(m, 1);
#endif
if (m->preinit)
mmc_start_init(m);
}
struct blk_desc *mmc_get_blk_desc(struct mmc *mmc)
{
return &mmc->block_dev;
}
#endif
#ifndef CONFIG_DM_MMC_OPS
__weak int board_mmc_getwp(struct mmc *mmc)
{
@ -259,7 +282,11 @@ ulong mmc_bread(struct blk_desc *block_dev, lbaint_t start, lbaint_t blkcnt,
if (!mmc)
return 0;
err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
if (CONFIG_IS_ENABLED(MMC_TINY))
err = mmc_switch_part(mmc, block_dev->hwpart);
else
err = blk_dselect_hwpart(block_dev, block_dev->hwpart);
if (err < 0)
return 0;
@ -1804,8 +1831,10 @@ int mmc_initialize(bd_t *bis)
initialized = 1;
#ifndef CONFIG_BLK
#if !CONFIG_IS_ENABLED(MMC_TINY)
mmc_list_init();
#endif
#endif
ret = mmc_probe(bis);
if (ret)
return ret;

@ -13,6 +13,7 @@
static struct list_head mmc_devices;
static int cur_dev_num = -1;
#if !CONFIG_IS_ENABLED(MMC_TINY)
struct mmc *find_mmc_device(int dev_num)
{
struct mmc *m;
@ -62,6 +63,7 @@ void mmc_do_preinit(void)
mmc_start_init(m);
}
}
#endif
void mmc_list_init(void)
{
@ -109,6 +111,35 @@ void print_mmc_devices(char separator)
void print_mmc_devices(char separator) { }
#endif
#if CONFIG_IS_ENABLED(MMC_TINY)
static struct mmc mmc_static = {
.dsr_imp = 0,
.dsr = 0xffffffff,
.block_dev = {
.if_type = IF_TYPE_MMC,
.removable = 1,
.devnum = 0,
.block_read = mmc_bread,
.block_write = mmc_bwrite,
.block_erase = mmc_berase,
.part_type = 0,
},
};
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
{
struct mmc *mmc = &mmc_static;
mmc->cfg = cfg;
mmc->priv = priv;
return mmc;
}
void mmc_destroy(struct mmc *mmc)
{
}
#else
struct mmc *mmc_create(const struct mmc_config *cfg, void *priv)
{
struct blk_desc *bdesc;
@ -157,6 +188,7 @@ void mmc_destroy(struct mmc *mmc)
/* only freeing memory for now */
free(mmc);
}
#endif
static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
{

@ -515,6 +515,7 @@ void print_mmc_devices(char separator);
* @return 0 if there is no MMC device, else the number of devices
*/
int get_mmc_num(void);
int mmc_switch_part(struct mmc *mmc, unsigned int part_num);
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
enum mmc_hwpart_conf_mode mode);

Loading…
Cancel
Save