summaryrefslogtreecommitdiff
path: root/board/aries
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2017-05-02 20:27:50 +0200
committerTom Rini <trini@konsulko.com>2017-06-29 13:31:06 -0400
commite3f40720bac263c00b5f78777fa948775ed1330f (patch)
tree27f69305f72e77550c09a93e2554b4d48915edcc /board/aries
parent7c22476b1983cb1a78933e623f25cda659609ba7 (diff)
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>
Diffstat (limited to 'board/aries')
-rw-r--r--board/aries/ma5d4evk/ma5d4evk.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/board/aries/ma5d4evk/ma5d4evk.c b/board/aries/ma5d4evk/ma5d4evk.c
index 6393948c49..b9294fc881 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 @@ 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)