diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c
index 22bd2c9..7d8ed51 100644
--- a/arch/arm/lib/board.c
+++ b/arch/arm/lib/board.c
@@ -346,10 +346,7 @@ void start_armboot (void)
 	}
 #endif /* CONFIG_LCD */
 
-#if defined(CONFIG_CMD_NAND)
-	puts ("NAND:  ");
-	nand_init();		/* go init the NAND */
-#endif
+	nand_early_init();
 
 #if defined(CONFIG_CMD_ONENAND)
 	onenand_init();
diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c
index fcfd174..5628ff4 100644
--- a/arch/blackfin/lib/board.c
+++ b/arch/blackfin/lib/board.c
@@ -15,6 +15,7 @@
 #include <environment.h>
 #include <malloc.h>
 #include <mmc.h>
+#include <nand.h>
 #include <net.h>
 #include <timestamp.h>
 #include <status_led.h>
@@ -24,10 +25,6 @@
 #include <asm/mach-common/bits/mpu.h>
 #include <kgdb.h>
 
-#ifdef CONFIG_CMD_NAND
-#include <nand.h>	/* cannot even include nand.h if it isnt configured */
-#endif
-
 #ifdef CONFIG_BITBANGMII
 #include <miiphy.h>
 #endif
@@ -345,10 +342,7 @@ void board_init_r(gd_t * id, ulong dest_addr)
 	bd->bi_flashoffset = 0;
 #endif
 
-#ifdef CONFIG_CMD_NAND
-	puts("NAND:  ");
-	nand_init();		/* go init the NAND */
-#endif
+	nand_early_init();
 
 #ifdef CONFIG_GENERIC_MMC
 	puts("MMC:   ");
diff --git a/arch/m68k/lib/board.c b/arch/m68k/lib/board.c
index eba2435..5eb878b 100644
--- a/arch/m68k/lib/board.c
+++ b/arch/m68k/lib/board.c
@@ -593,10 +593,10 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	doc_init ();
 #endif
 
-#if defined(CONFIG_CMD_NAND)
+#if defined(CONFIG_CMD_NAND) && \
+    (defined(CONFIG_NAND_MAYBE_EARLY_INIT) || defined(CONFIG_NAND_EARLY_INIT))
 	WATCHDOG_RESET ();
-	puts ("NAND:  ");
-	nand_init();		/* go init the NAND */
+	nand_early_init();
 #endif
 
 #ifdef CONFIG_BITBANGMII
diff --git a/arch/mips/lib/board.c b/arch/mips/lib/board.c
index 0044b19..869635f 100644
--- a/arch/mips/lib/board.c
+++ b/arch/mips/lib/board.c
@@ -330,10 +330,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	bd->bi_flashoffset = 0;
 #endif
 
-#ifdef CONFIG_CMD_NAND
-	puts ("NAND:  ");
-	nand_init ();		/* go init the NAND */
-#endif
+	nand_early_init();
 
 #if defined(CONFIG_CMD_ONENAND)
 	onenand_init();
diff --git a/arch/nios2/lib/board.c b/arch/nios2/lib/board.c
index f83e691..a1ebcae 100644
--- a/arch/nios2/lib/board.c
+++ b/arch/nios2/lib/board.c
@@ -36,9 +36,7 @@
 #if defined(CONFIG_SYS_NIOS_EPCSBASE)
 #include <nios2-epcs.h>
 #endif
-#ifdef CONFIG_CMD_NAND
-#include <nand.h>	/* cannot even include nand.h if it isnt configured */
-#endif
+#include <nand.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -130,10 +128,7 @@ void board_init (void)
 	bd->bi_flashsize = flash_init();
 #endif
 
-#ifdef CONFIG_CMD_NAND
-	puts("NAND:  ");
-	nand_init();
-#endif
+	nand_early_init();
 
 #ifdef CONFIG_GENERIC_MMC
 	puts("MMC:   ");
diff --git a/arch/powerpc/lib/board.c b/arch/powerpc/lib/board.c
index bfdfa86..163af4a 100644
--- a/arch/powerpc/lib/board.c
+++ b/arch/powerpc/lib/board.c
@@ -763,10 +763,10 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	spi_init_r ();
 #endif
 
-#if defined(CONFIG_CMD_NAND)
+#if defined(CONFIG_CMD_NAND) && \
+    (defined(CONFIG_NAND_MAYBE_EARLY_INIT) || defined(CONFIG_NAND_EARLY_INIT))
 	WATCHDOG_RESET ();
-	puts ("NAND:  ");
-	nand_init();		/* go init the NAND */
+	nand_early_init();
 #endif
 
 #ifdef CONFIG_GENERIC_MMC
diff --git a/arch/sh/lib/board.c b/arch/sh/lib/board.c
index c97e20c..f01fb7d 100644
--- a/arch/sh/lib/board.c
+++ b/arch/sh/lib/board.c
@@ -51,7 +51,8 @@ static int sh_flash_init(void)
 	return 0;
 }
 
-#if defined(CONFIG_CMD_NAND)
+#if defined(CONFIG_CMD_NAND) && \
+    (defined(CONFIG_NAND_MAYBE_EARLY_INIT) || defined(CONFIG_NAND_EARLY_INIT))
 # include <nand.h>
 # define INIT_FUNC_NAND_INIT nand_init,
 #else
diff --git a/doc/feature-removal-schedule.txt b/doc/feature-removal-schedule.txt
index ffe2615..1c2f6b5 100644
--- a/doc/feature-removal-schedule.txt
+++ b/doc/feature-removal-schedule.txt
@@ -34,6 +34,26 @@ Why:	The implementation of U-Boot for the ARM architecture has
 
 ---------------------------
 
+What:	CONFIG_NAND_MAYBE_EARLY_INIT option
+When:	Release 2011-03
+
+Why:	U-boot's policy is to initialize hardware only when needed.  The
+	NAND code however predates this and explicitly initializes the hardware
+	during board init.  In order to transition to a sane default (only
+	initialize NAND when it is going to be used) without breaking existing
+	boards, this option has been introduced.  Board porters should select
+	one of two options in their board config:
+		(1) #undef CONFIG_NAND_MAYBE_EARLY_INIT (recommended)
+		(2) #define CONFIG_NAND_EARLY_INIT
+	This way people who wish to retain the old behavior may do so, but the
+	default for new boards follows the standard U-boot policy.  Boards which
+	have not made a decision will have one made for them when this option is
+	removed in the future.
+
+Who:	Mike Frysinger <vapier@gentoo.org>
+
+---------------------------
+
 What:	CONFIG_NET_MULTI option
 When:	Release 2009-11
 
diff --git a/drivers/mtd/nand/nand.c b/drivers/mtd/nand/nand.c
index 4a63d5c..8144e3e 100644
--- a/drivers/mtd/nand/nand.c
+++ b/drivers/mtd/nand/nand.c
@@ -77,6 +77,10 @@ static void nand_init_chip(struct mtd_info *mtd, struct nand_chip *nand,
 
 }
 
+#if defined(CONFIG_NAND_MAYBE_EARLY_INIT) && !defined(CONFIG_NAND_EARLY_INIT)
+# warning Read CONFIG_NAND_MAYBE_EARLY_INIT in doc/feature-removal-schedule.txt
+#endif
+
 void nand_init(void)
 {
 	int i;
diff --git a/include/config_defaults.h b/include/config_defaults.h
index abdf3be..f8de0a5 100644
--- a/include/config_defaults.h
+++ b/include/config_defaults.h
@@ -18,4 +18,6 @@
 #define CONFIG_GZIP 1
 #define CONFIG_ZLIB 1
 
+#define CONFIG_NAND_MAYBE_EARLY_INIT 1
+
 #endif
diff --git a/include/nand.h b/include/nand.h
index a452411..f2ac93d 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -25,6 +25,11 @@
 #define _NAND_H_
 
 extern void nand_init(void);
+#if defined(CONFIG_NAND_MAYBE_EARLY_INIT) || defined(CONFIG_NAND_EARLY_INIT)
+# define nand_early_init() nand_init()
+#else
+# define nand_early_init() do {} while (0)
+#endif
 
 #include <linux/mtd/compat.h>
 #include <linux/mtd/mtd.h>
