]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - arch/arm/mach-at91/spl.c
common: Pass the boot device into spl_boot_mode()
[people/ms/u-boot.git] / arch / arm / mach-at91 / spl.c
index aaa5eec2e66ff026f32cb265a1725847856cde7b..ad6a597c7317e7c000c9f9ba8d1707e7518d0b57 100644 (file)
@@ -23,23 +23,64 @@ void at91_disable_wdt(void)
 }
 #endif
 
+#if defined(CONFIG_SAMA5D2) || defined(CONFIG_SAMA5D3) || \
+    defined(CONFIG_SAMA5D4)
+#include <asm/arch/sama5_boot.h>
+struct {
+       u32     r4;
+} bootrom_stash __attribute__((section(".data")));
+
+u32 spl_boot_device(void)
+{
+       u32 dev = (bootrom_stash.r4 >> ATMEL_SAMA5_BOOT_FROM_OFF) &
+                 ATMEL_SAMA5_BOOT_FROM_MASK;
+       u32 off = (bootrom_stash.r4 >> ATMEL_SAMA5_BOOT_DEV_ID_OFF) &
+                 ATMEL_SAMA5_BOOT_DEV_ID_MASK;
+
+#if defined(CONFIG_SYS_USE_MMC)
+       if (dev == ATMEL_SAMA5_BOOT_FROM_MCI) {
+               if (off == 0)
+                       return BOOT_DEVICE_MMC1;
+               if (off == 1)
+                       return BOOT_DEVICE_MMC2;
+               printf("ERROR: MMC controller %i not present!\n", dev);
+               hang();
+       }
+#endif
+
+#if defined(CONFIG_SYS_USE_SERIALFLASH) || defined(CONFIG_SYS_USE_SPIFLASH)
+       if (dev == ATMEL_SAMA5_BOOT_FROM_SPI)
+               return BOOT_DEVICE_SPI;
+#endif
+
+       if (dev == ATMEL_SAMA5_BOOT_FROM_SAMBA)
+               return BOOT_DEVICE_USB;
+
+       printf("ERROR: SMC/TWI/QSPI boot device not supported!\n"
+              "       Boot device %i, controller number %i\n", dev, off);
+
+       return BOOT_DEVICE_NONE;
+}
+#else
 u32 spl_boot_device(void)
 {
 #ifdef CONFIG_SYS_USE_MMC
        return BOOT_DEVICE_MMC1;
 #elif CONFIG_SYS_USE_NANDFLASH
        return BOOT_DEVICE_NAND;
-#elif CONFIG_SYS_USE_SERIALFLASH
+#elif CONFIG_SYS_USE_SERIALFLASH || CONFIG_SYS_USE_SPIFLASH
        return BOOT_DEVICE_SPI;
 #endif
        return BOOT_DEVICE_NONE;
 }
+#endif
 
-u32 spl_boot_mode(void)
+u32 spl_boot_mode(const u32 boot_device)
 {
        switch (spl_boot_device()) {
 #ifdef CONFIG_SYS_USE_MMC
        case BOOT_DEVICE_MMC1:
+       case BOOT_DEVICE_MMC2:
                return MMCSD_MODE_FS;
                break;
 #endif