[U-Boot] [PATCH 1/3 v2] nand: introduce CONFIG_NAND_EARLY_INIT and nand_early_init()

Mike Frysinger vapier at gentoo.org
Tue Oct 12 21:35:15 CEST 2010


Add new config options to allow people to control early initialization
of NAND.  The current behavior (NAND is initialized early) is unchanged,
but now people may choose to disable this behavior and only initialize
NAND when it would actually be used.

So that we can change the default in the future to not initialize NAND
early on, we also introduce a CONFIG_MAYBE_NAND_EARLY_INIT option.  If
board porters do not make a choice either way, they will get a build
warning.  This should encourage board porters to opt in to one of the
two choices by themselves.  After a release or two, we can then force
the remaining boards to enable the new config option, delete the compat
option, and have the default behavior match the standard U-Boot policy.

Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
v2
	- call nand_init() in do_nandboot() too

 common/cmd_nand.c       |    6 ++++++
 common/env_nand.c       |    8 ++++++++
 drivers/mtd/nand/nand.c |    7 +++++++
 3 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 8a81237..99408b1 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -393,6 +393,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 	if (argc < 2)
 		goto usage;
 
+	nand_init();
+
 	if (quiet_str)
 		quiet = simple_strtoul(quiet_str, NULL, 0) != 0;
 
@@ -811,7 +813,11 @@ int do_nandboot(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 	struct mtd_device *dev;
 	struct part_info *part;
 	u8 pnum;
+#endif
 
+	nand_init();
+
+#if defined(CONFIG_CMD_MTDPARTS)
 	if (argc >= 2) {
 		char *p = (argc == 2) ? argv[1] : argv[2];
 		if (!(str2long(p, &addr)) && (mtdparts_init() == 0) &&
diff --git a/common/env_nand.c b/common/env_nand.c
index 4e8307a..3dffebd 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -359,6 +359,8 @@ void env_relocate_spec(void)
 		return;
 	}
 
+	nand_init();
+
 	if (readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1))
 		puts("No Valid Environment Area found\n");
 
@@ -404,6 +406,8 @@ void env_relocate_spec(void)
 	free(tmp_env1);
 	free(tmp_env2);
 
+#else
+	nand_init();
 #endif /* ! ENV_IS_EMBEDDED */
 }
 #else /* ! CONFIG_ENV_OFFSET_REDUND */
@@ -418,6 +422,8 @@ void env_relocate_spec (void)
 	int ret;
 	char buf[CONFIG_ENV_SIZE];
 
+	nand_init();
+
 #if defined(CONFIG_ENV_OFFSET_OOB)
 	ret = get_nand_env_oob(&nand_info[0], &nand_env_oob_offset);
 	/*
@@ -439,6 +445,8 @@ void env_relocate_spec (void)
 	}
 
 	env_import(buf, 1);
+#else
+	nand_init();
 #endif /* ! ENV_IS_EMBEDDED */
 }
 #endif /* CONFIG_ENV_OFFSET_REDUND */
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
index 47d6872..4a63d5c 100644
--- a/drivers/mtd/nand/nand.c
+++ b/drivers/mtd/nand/nand.c
@@ -81,6 +81,13 @@ void nand_init(void)
 {
 	int i;
 	unsigned int size = 0;
+	static uint8_t initialized;
+
+	if (initialized)
+		return;
+	initialized = 1;
+	puts("NAND:  ");
+
 	for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++) {
 		nand_init_chip(&nand_info[i], &nand_chip[i], base_address[i]);
 		size += nand_info[i].size / 1024;
-- 
1.7.3.1



More information about the U-Boot mailing list