All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 07/14] mmc: Tinification of the mmc code
Date: Fri, 25 Nov 2016 23:32:28 +0100	[thread overview]
Message-ID: <20161125223235.3434-7-marex@denx.de> (raw)
In-Reply-To: <20161125223235.3434-1-marex@denx.de>

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.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Tom Rini <trini@konsulko.com>
Cc: Simon Glass <sjg@chromium.org>
---
V2: Switch the MMC_TINY option to Kconfig
---
 common/spl/spl_mmc.c     |  6 +++++-
 drivers/mmc/Kconfig      | 16 ++++++++++++++++
 drivers/mmc/mmc.c        | 31 ++++++++++++++++++++++++++++++-
 drivers/mmc/mmc_legacy.c | 32 ++++++++++++++++++++++++++++++++
 include/mmc.h            |  1 +
 5 files changed, 84 insertions(+), 2 deletions(-)

diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 43c1030..3cad998 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -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");
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
index 24f4b28..aca438b8 100644
--- a/drivers/mmc/Kconfig
+++ b/drivers/mmc/Kconfig
@@ -26,6 +26,22 @@ 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"
+	default n
+	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
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 6e25b67..19c4225 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -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;
diff --git a/drivers/mmc/mmc_legacy.c b/drivers/mmc/mmc_legacy.c
index 25361d1..bdf9d98 100644
--- a/drivers/mmc/mmc_legacy.c
+++ b/drivers/mmc/mmc_legacy.c
@@ -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)
 {
diff --git a/include/mmc.h b/include/mmc.h
index e815eb3..f39be3c 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -513,6 +513,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);
 
-- 
2.10.2

  parent reply	other threads:[~2016-11-25 22:32 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-25 22:32 [U-Boot] [PATCH 01/14] mips: Let cache.h be included from assembly source Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 02/14] spl: mmc: Fix build without LIBCOMMON_SUPPORT Marek Vasut
2016-11-26 20:45   ` Tom Rini
2016-11-26 20:58     ` Marek Vasut
2016-11-28  2:33       ` Jaehoon Chung
2016-11-28  2:53         ` Marek Vasut
2016-12-01 10:10           ` Jaehoon Chung
2016-12-01 11:39             ` Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 03/14] mmc: Fix warning if debug() is not used Marek Vasut
2016-11-26 20:44   ` Tom Rini
2016-11-25 22:32 ` [U-Boot] [PATCH 04/14] serial: 16550: Add getfcr accessor Marek Vasut
2016-11-26 20:46   ` Tom Rini
2016-11-27 17:02   ` Simon Glass
2016-11-25 22:32 ` [U-Boot] [PATCH 05/14] serial: 16550: Add port type as driver data Marek Vasut
2016-11-27 17:03   ` Simon Glass
2016-11-27 17:07     ` Marek Vasut
2016-11-30  0:32       ` Simon Glass
2016-11-30  1:27         ` Marek Vasut
2016-11-30  2:26           ` Simon Glass
2016-11-30  3:04             ` Marek Vasut
2016-11-30  3:10               ` Simon Glass
2016-11-30  3:16                 ` Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 06/14] serial: 16550: Add Ingenic JZ4780 support Marek Vasut
2016-11-27 17:03   ` Simon Glass
2016-11-27 17:17     ` Marek Vasut
2016-11-25 22:32 ` Marek Vasut [this message]
2016-11-30  0:32   ` [U-Boot] [PATCH 07/14] mmc: Tinification of the mmc code Simon Glass
2016-11-30  1:28     ` Marek Vasut
2016-11-30  2:26       ` Simon Glass
2016-11-30  2:44         ` Tom Rini
2016-11-25 22:32 ` [U-Boot] [PATCH 08/14] mmc: Add JZ47xx SD/MMC controller driver Marek Vasut
2016-11-28  2:58   ` Jaehoon Chung
2016-11-28 22:55     ` Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 09/14] gpio: Add JZ47xx GPIO driver Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 10/14] misc: Add JZ47xx efuse driver Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 11/14] mips: Add SPL header Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 12/14] mips: jz47xx: Add JZ4780 SoC support Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 13/14] mips: jz47xx: Add minimal JZ MMC node Marek Vasut
2016-11-25 22:32 ` [U-Boot] [PATCH 14/14] mips: jz47xx: Add Creator CI20 platform Marek Vasut
2016-11-26 20:45   ` Tom Rini
2016-11-30 15:21 ` [U-Boot] [PATCH 01/14] mips: Let cache.h be included from assembly source Daniel Schwierzeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161125223235.3434-7-marex@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.