davinci: spl: use bootcfg to select boot device
authorFabien Parent <fparent@baylibre.com>
Mon, 9 Jan 2017 10:06:36 +0000 (11:06 +0100)
committerTom Rini <trini@konsulko.com>
Sat, 14 Jan 2017 21:47:16 +0000 (16:47 -0500)
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@baylibre.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
arch/arm/mach-davinci/include/mach/hardware.h
arch/arm/mach-davinci/spl.c

index 2a0360a785c7e31b1bfe355ce835b2e2741b6c2f..c31f38c8a275fe57351f8643ffc64cd378016394 100644 (file)
@@ -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 */
index 0aeaa7d8b7a0a67d849cc6e89a957cc97d7e1d61..564c2008e003f39480de64ad4887c877c34a117a 100644 (file)
@@ -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();
+       }
 }