rpi: use board_early_init_r to init PCI/USB and detect boot device
authorMarek Szyprowski <m.szyprowski@samsung.com>
Fri, 29 Jan 2021 12:03:03 +0000 (13:03 +0100)
committerJaehoon Chung <jh80.chung@samsung.com>
Wed, 12 Oct 2022 05:48:53 +0000 (14:48 +0900)
Move initialization of the PCI and the USB subsystems from the 'preboot'
command to the board's early_init_r() function and then try to detect a
boot device by accessing the MMC0 device. If it works, then set boot
device interface to 'mmc', if not, use 'usb'.

This allows the environment variales to be loaded from the proper
storage interface.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: Idf06ba827167479510206587308875c8eedce892

board/raspberrypi/rpi/rpi.c

index f4668abb5a1e34fa1036dd46bce4a4a4c94e502b..8c843c60e246f324eadc0df189ef252d1de048d2 100644 (file)
@@ -23,6 +23,7 @@
 #ifdef CONFIG_ARM64
 #include <asm/armv8/mmu.h>
 #endif
+#include <usb.h>
 #include <watchdog.h>
 #include <dm/pinctrl.h>
 
@@ -466,6 +467,30 @@ static void set_serial_number(void)
        env_set("serial#", serial_string);
 }
 
+#if defined(CONFIG_PCI) && defined(CONFIG_BOARD_EARLY_INIT_R)
+static char *boot_interface;
+int board_early_init_r(void)
+{
+       /*
+        * Currently there is not way to detect which device (SD card or
+        * USB Mass Storage) has been used by VideoCore to load the uboot,
+        * so just try MMC0 first, if not then use USB.
+        */
+       mmc_init_device(0);
+       boot_interface = (blk_get_dev("mmc", 0)) ? "mmc" : "usb";
+
+       pci_init();
+       usb_init();
+
+       return 0;
+}
+
+char *env_fat_get_interface(void)
+{
+       return boot_interface;
+}
+#endif
+
 int misc_init_r(void)
 {
        set_fdt_addr();