diff --git a/board/aries/ma5d4evk/ma5d4evk.c b/board/aries/ma5d4evk/ma5d4evk.c index 6393948c496315bfd3adb520057a131add3a2ebd..b9294fc881bec328e6fd2ecacbc40ef9001bdf85 100644 --- a/board/aries/ma5d4evk/ma5d4evk.c +++ b/board/aries/ma5d4evk/ma5d4evk.c @@ -22,11 +22,14 @@ #include #include #include +#include #include #include DECLARE_GLOBAL_DATA_PTR; +static u8 boot_mode_sf; + #ifdef CONFIG_ATMEL_SPI int spi_cs_is_valid(unsigned int bus, unsigned int cs) { @@ -201,18 +204,20 @@ void ma5d4evk_mci1_hw_init(void) int board_mmc_init(bd_t *bis) { int ret; + void *mci0 = (void *)ATMEL_BASE_MCI0; + void *mci1 = (void *)ATMEL_BASE_MCI1; /* De-assert reset on On-SoM eMMC */ at91_set_pio_output(AT91_PIO_PORTE, 15, 1); at91_pio3_set_pio_pulldown(AT91_PIO_PORTE, 15, 0); - ret = atmel_mci_init((void *)ATMEL_BASE_MCI1); + ret = atmel_mci_init(boot_mode_sf ? mci0 : mci1); if (ret) /* eMMC init failed, skip it. */ at91_set_pio_output(AT91_PIO_PORTE, 15, 0); /* Enable the power supply to On-board MicroSD */ at91_set_pio_output(AT91_PIO_PORTE, 17, 0); - ret = atmel_mci_init((void *)ATMEL_BASE_MCI0); + ret = atmel_mci_init(boot_mode_sf ? mci1 : mci0); if (ret) /* uSD init failed, power it down. */ at91_set_pio_output(AT91_PIO_PORTE, 17, 1); @@ -274,6 +279,14 @@ int board_early_init_f(void) return 0; } +static void board_identify(void) +{ + struct spi_flash *sf; + sf = spi_flash_probe(CONFIG_SF_DEFAULT_BUS, CONFIG_SF_DEFAULT_CS, + CONFIG_SF_DEFAULT_SPEED, CONFIG_SF_DEFAULT_MODE); + boot_mode_sf = (sf != NULL); +} + int board_init(void) { /* adress of boot parameters */ @@ -299,6 +312,8 @@ int board_init(void) at91_udp_hw_init(); #endif + board_identify(); + /* Reset CAN controllers */ at91_set_pio_output(AT91_PIO_PORTB, 21, 0); udelay(100); @@ -308,6 +323,12 @@ int board_init(void) return 0; } +int board_late_init(void) +{ + setenv("bootmode", boot_mode_sf ? "sf" : "emmc"); + return 0; +} + int dram_init(void) { gd->ram_size = get_ram_size((void *)CONFIG_SYS_SDRAM_BASE, @@ -344,6 +365,7 @@ void spl_board_init(void) ma5d4evk_mci0_hw_init(); ma5d4evk_mci1_hw_init(); #endif + board_identify(); } void board_boot_order(u32 *spl_boot_list) diff --git a/include/configs/ma5d4evk.h b/include/configs/ma5d4evk.h index c2f918214d1c8250c0c1ada60206848a8632f576..82aee1513218245106b3dca6f443c72bdcfe2ea4 100644 --- a/include/configs/ma5d4evk.h +++ b/include/configs/ma5d4evk.h @@ -13,6 +13,7 @@ #include "at91-sama5_common.h" #undef CONFIG_BOOTARGS #define CONFIG_SYS_USE_SERIALFLASH 1 +#define CONFIG_BOARD_LATE_INIT /* * Memory configurations @@ -174,18 +175,23 @@ "nfsargs=" \ "setenv bootargs root=/dev/nfs rw " \ "nfsroot=${serverip}:${rootpath},v3,tcp\0" \ + "fdtimg=if test ${bootmode} = \"sf\" ; then " \ + "setenv kernel_fdt 1 ; " \ + "else ; " \ + "setenv kernel_fdt 2 ; " \ + "fi\0" \ "mmc_mmc=" \ - "run mmcload mmcargs addargs ; " \ - "bootm ${kernel_addr_r}\0" \ + "run fdtimg mmcload mmcargs addargs ; " \ + "bootm ${kernel_addr_r}:kernel@1 - ${kernel_addr_r}:fdt@${kernel_fdt}\0" \ "mmc_nfs=" \ - "run mmcload nfsargs addip addargs ; " \ - "bootm ${kernel_addr_r}\0" \ + "run fdtimg mmcload nfsargs addip addargs ; " \ + "bootm ${kernel_addr_r}:kernel@1 - ${kernel_addr_r}:fdt@${kernel_fdt}\0" \ "net_mmc=" \ - "run netload mmcargs addargs ; " \ - "bootm ${kernel_addr_r}\0" \ + "run fdtimg netload mmcargs addargs ; " \ + "bootm ${kernel_addr_r}:kernel@1 - ${kernel_addr_r}:fdt@${kernel_fdt}\0" \ "net_nfs=" \ - "run netload nfsargs addip addargs ; " \ - "bootm ${kernel_addr_r}\0" \ + "run fdtimg netload nfsargs addip addargs ; " \ + "bootm ${kernel_addr_r}:kernel@1 - ${kernel_addr_r}:fdt@${kernel_fdt}\0" \ "try_bootscript=" \ "mmc rescan;" \ "if test -e mmc 1:1 ${bootscript} ; then " \