]> git.sur5r.net Git - u-boot/blobdiff - board/aries/ma5d4evk/ma5d4evk.c
km/ivm: always set ethaddr after reading IVM
[u-boot] / board / aries / ma5d4evk / ma5d4evk.c
index 0293b29d0ea628784e87ed5515d70c293f59a78a..b9294fc881bec328e6fd2ecacbc40ef9001bdf85 100644 (file)
 #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)
 {
@@ -200,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);
 
@@ -273,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 */
@@ -298,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);
@@ -307,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,
@@ -343,6 +365,24 @@ void spl_board_init(void)
        ma5d4evk_mci0_hw_init();
        ma5d4evk_mci1_hw_init();
 #endif
+       board_identify();
+}
+
+void board_boot_order(u32 *spl_boot_list)
+{
+       spl_boot_list[0] = spl_boot_device();
+
+       switch (spl_boot_list[0]) {
+       case BOOT_DEVICE_MMC1:
+       case BOOT_DEVICE_MMC2:
+               spl_boot_list[0] = BOOT_DEVICE_MMC1;
+               break;
+       case BOOT_DEVICE_SPI:
+               break;
+       case BOOT_DEVICE_USB:
+               spl_boot_list[0] = BOOT_DEVICE_MMC2;
+               break;
+       }
 }
 
 static void ddr2_conf(struct atmel_mpddrc_config *ddr2)