[U-Boot] [PATCH 11/11] ARM: at91: ma5d4: Support both SF and eMMC SoMs
Marek Vasut
marex at denx.de
Tue May 2 18:27:50 UTC 2017
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 at denx.de>
Cc: Andreas Bießmann <andreas.devel at googlemail.com>
---
board/aries/ma5d4evk/ma5d4evk.c | 26 ++++++++++++++++++++++++--
include/configs/ma5d4evk.h | 22 ++++++++++++++--------
2 files changed, 38 insertions(+), 10 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)
diff --git a/include/configs/ma5d4evk.h b/include/configs/ma5d4evk.h
index 3c2ef99b8e..3abbbaf980 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
/*
* U-Boot Commands
@@ -181,18 +182,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 at 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 at 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 at 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 at 1 - ${kernel_addr_r}:fdt@${kernel_fdt}\0" \
"try_bootscript=" \
"mmc rescan;" \
"if test -e mmc 1:1 ${bootscript} ; then " \
--
2.11.0
More information about the U-Boot
mailing list