ARM: at91: ma5d4: Support both SF and eMMC SoMs
Discern the SoMs based on the presence of SPI flash to support both
variants of the SoM, one booting from SPI NOR and one booting from
eMMC.
Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Andreas Bießmann <andreas.devel@googlemail.com>
diff --git a/board/aries/ma5d4evk/ma5d4evk.c b/board/aries/ma5d4evk/ma5d4evk.c
index 6393948..b9294fc 100644
--- a/board/aries/ma5d4evk/ma5d4evk.c
+++ b/board/aries/ma5d4evk/ma5d4evk.c
@@ -22,11 +22,14 @@
#include <net.h>
#include <netdev.h>
#include <spi.h>
+#include <spi_flash.h>
#include <spl.h>
#include <version.h>
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 @@
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 @@
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 @@
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 @@
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 @@
ma5d4evk_mci0_hw_init();
ma5d4evk_mci1_hw_init();
#endif
+ board_identify();
}
void board_boot_order(u32 *spl_boot_list)