[U-Boot] [PATCH 1/3] davinci: spl: use bootcfg to select boot device

Fabien Parent fparent at baylibre.com
Mon Jan 9 11:06:36 CET 2017


Right now the SPL is trying to load u-boot based on defines, i.e. one
has to define CONFIG_SPL_NAND_SIMPLE to boot from NAND,
or CONFIG_SPL_SPI_LOAD to boot from SPI FLASH, etc...
This prevent us from having a single SPL image that is able to boot from
all media, and one need to build an image for each medium. This
commit is replacing the #ifdef that select the boot medium by reading
the value of the boot pins (via the BOOTCFG register).

Now a single SPL image will be able to read from the boot pin to know
which device should be used to load u-boot.

Signed-off-by: Fabien Parent <fparent at baylibre.com>
---
 arch/arm/mach-davinci/include/mach/hardware.h | 16 ++++++++++++--
 arch/arm/mach-davinci/spl.c                   | 31 +++++++++++++++++++--------
 2 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/arch/arm/mach-davinci/include/mach/hardware.h b/arch/arm/mach-davinci/include/mach/hardware.h
index 2a0360a785..c31f38c8a2 100644
--- a/arch/arm/mach-davinci/include/mach/hardware.h
+++ b/arch/arm/mach-davinci/include/mach/hardware.h
@@ -475,12 +475,15 @@ int clk_get(enum davinci_clk_ids id);
 /* Boot config */
 struct davinci_syscfg_regs {
 	dv_reg	revid;
-	dv_reg	rsvd[13];
+	dv_reg	rsvd[7];
+	dv_reg	bootcfg;
+	dv_reg	chiprevidr;
+	dv_reg	rsvd2[4];
 	dv_reg	kick0;
 	dv_reg	kick1;
 	dv_reg	rsvd1[52];
 	dv_reg	mstpri[3];
-	dv_reg  rsvd2;
+	dv_reg  rsvd3;
 	dv_reg	pinmux[20];
 	dv_reg	suspsrc;
 	dv_reg	chipsig;
@@ -495,6 +498,15 @@ struct davinci_syscfg_regs {
 #define davinci_syscfg_regs \
 	((struct davinci_syscfg_regs *)DAVINCI_BOOTCFG_BASE)
 
+enum {
+	DAVINCI_NAND8_BOOT	= 0b001110,
+	DAVINCI_NAND16_BOOT	= 0b010000,
+	DAVINCI_SD_OR_MMC_BOOT	= 0b011100,
+	DAVINCI_MMC_ONLY_BOOT	= 0b111100,
+	DAVINCI_SPI0_FLASH_BOOT	= 0b001010,
+	DAVINCI_SPI1_FLASH_BOOT	= 0b001100,
+};
+
 #define pinmux(x)	(&davinci_syscfg_regs->pinmux[x])
 
 /* Emulation suspend bits */
diff --git a/arch/arm/mach-davinci/spl.c b/arch/arm/mach-davinci/spl.c
index 0aeaa7d8b7..564c2008e0 100644
--- a/arch/arm/mach-davinci/spl.c
+++ b/arch/arm/mach-davinci/spl.c
@@ -52,14 +52,27 @@ u32 spl_boot_mode(const u32 boot_device)
 
 u32 spl_boot_device(void)
 {
-#ifdef CONFIG_SPL_NAND_SIMPLE
-	return BOOT_DEVICE_NAND;
-#elif defined(CONFIG_SPL_SPI_LOAD)
-	return BOOT_DEVICE_SPI;
-#elif defined(CONFIG_SPL_MMC_LOAD)
-	return BOOT_DEVICE_MMC1;
-#else
-	puts("Unknown boot device\n");
-	hang();
+	switch (davinci_syscfg_regs->bootcfg) {
+#ifdef CONFIG_SPL_NAND_SUPPORT
+	case DAVINCI_NAND8_BOOT:
+	case DAVINCI_NAND16_BOOT:
+		return BOOT_DEVICE_NAND;
 #endif
+
+#ifdef CONFIG_SPL_MMC_SUPPORT
+	case DAVINCI_SD_OR_MMC_BOOT:
+	case DAVINCI_MMC_ONLY_BOOT:
+		return BOOT_DEVICE_MMC1;
+#endif
+
+#ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
+	case DAVINCI_SPI0_FLASH_BOOT:
+	case DAVINCI_SPI1_FLASH_BOOT:
+		return BOOT_DEVICE_SPI;
+#endif
+
+	default:
+		puts("Unknown boot device\n");
+		hang();
+	}
 }
-- 
2.11.0



More information about the U-Boot mailing list