]> 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 81463712fa828641fb4048f740836401280ece96..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,19 +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_MCI0);
+       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_MCI1);
+       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);
 
@@ -269,17 +274,19 @@ int board_early_init_f(void)
        at91_set_pio_output(AT91_PIO_PORTD, 29, 0);
        at91_set_pio_output(AT91_PIO_PORTD, 30, 0);
 
-       /* Reset CAN controllers */
-       at91_set_pio_output(AT91_PIO_PORTB, 21, 0);
-       udelay(100);
-       at91_set_pio_output(AT91_PIO_PORTB, 21, 1);
-       at91_pio3_set_pio_pulldown(AT91_PIO_PORTB, 21, 0);
-
        ma5d4evk_serial_hw_init();
 
        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 */
@@ -305,6 +312,20 @@ 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);
+       at91_set_pio_output(AT91_PIO_PORTB, 21, 1);
+       at91_pio3_set_pio_pulldown(AT91_PIO_PORTB, 21, 0);
+
+       return 0;
+}
+
+int board_late_init(void)
+{
+       setenv("bootmode", boot_mode_sf ? "sf" : "emmc");
        return 0;
 }
 
@@ -337,7 +358,31 @@ int board_eth_init(bd_t *bis)
 #ifdef CONFIG_SPL_BUILD
 void spl_board_init(void)
 {
+#ifdef CONFIG_ATMEL_SPI
        ma5d4evk_spi0_hw_init();
+#endif
+#ifdef CONFIG_GENERIC_ATMEL_MCI
+       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)
@@ -349,7 +394,6 @@ static void ddr2_conf(struct atmel_mpddrc_config *ddr2)
                    ATMEL_MPDDRC_CR_CAS_DDR_CAS3 |
                    ATMEL_MPDDRC_CR_NB_8BANKS |
                    ATMEL_MPDDRC_CR_NDQS_DISABLED |
-                   ATMEL_MPDDRC_CR_DECOD_INTERLEAVED |
                    ATMEL_MPDDRC_CR_UNAL_SUPPORTED);
 
        ddr2->rtr = 0x2b0;