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>
This commit is contained in:
parent
ce9eca9438
commit
b5b838f1a7
|
@ -306,7 +306,11 @@ static int spl_mmc_load_image(struct spl_image_info *spl_image,
|
||||||
if (part == 7)
|
if (part == 7)
|
||||||
part = 0;
|
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) {
|
if (err) {
|
||||||
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
|
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
|
||||||
puts("spl: mmc partition switch failed\n");
|
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
|
option will be removed as soon as all DM_MMC drivers use it, as it
|
||||||
will the only supported behaviour.
|
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
|
config MSM_SDHCI
|
||||||
bool "Qualcomm SDHCI controller"
|
bool "Qualcomm SDHCI controller"
|
||||||
depends on DM_MMC && BLK && DM_MMC_OPS
|
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,
|
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
|
#ifndef CONFIG_DM_MMC_OPS
|
||||||
__weak int board_mmc_getwp(struct mmc *mmc)
|
__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)
|
if (!mmc)
|
||||||
return 0;
|
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)
|
if (err < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1804,7 +1831,9 @@ int mmc_initialize(bd_t *bis)
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
|
|
||||||
#ifndef CONFIG_BLK
|
#ifndef CONFIG_BLK
|
||||||
|
#if !CONFIG_IS_ENABLED(MMC_TINY)
|
||||||
mmc_list_init();
|
mmc_list_init();
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
ret = mmc_probe(bis);
|
ret = mmc_probe(bis);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
static struct list_head mmc_devices;
|
static struct list_head mmc_devices;
|
||||||
static int cur_dev_num = -1;
|
static int cur_dev_num = -1;
|
||||||
|
|
||||||
|
#if !CONFIG_IS_ENABLED(MMC_TINY)
|
||||||
struct mmc *find_mmc_device(int dev_num)
|
struct mmc *find_mmc_device(int dev_num)
|
||||||
{
|
{
|
||||||
struct mmc *m;
|
struct mmc *m;
|
||||||
|
@ -62,6 +63,7 @@ void mmc_do_preinit(void)
|
||||||
mmc_start_init(m);
|
mmc_start_init(m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void mmc_list_init(void)
|
void mmc_list_init(void)
|
||||||
{
|
{
|
||||||
|
@ -109,6 +111,35 @@ void print_mmc_devices(char separator)
|
||||||
void print_mmc_devices(char separator) { }
|
void print_mmc_devices(char separator) { }
|
||||||
#endif
|
#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 mmc *mmc_create(const struct mmc_config *cfg, void *priv)
|
||||||
{
|
{
|
||||||
struct blk_desc *bdesc;
|
struct blk_desc *bdesc;
|
||||||
|
@ -157,6 +188,7 @@ void mmc_destroy(struct mmc *mmc)
|
||||||
/* only freeing memory for now */
|
/* only freeing memory for now */
|
||||||
free(mmc);
|
free(mmc);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int mmc_select_hwpartp(struct blk_desc *desc, int hwpart)
|
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
|
* @return 0 if there is no MMC device, else the number of devices
|
||||||
*/
|
*/
|
||||||
int get_mmc_num(void);
|
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,
|
int mmc_hwpart_config(struct mmc *mmc, const struct mmc_hwpart_conf *conf,
|
||||||
enum mmc_hwpart_conf_mode mode);
|
enum mmc_hwpart_conf_mode mode);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue