sunxi: common VBUS detection logic in usbc
[oweals/u-boot.git] / arch / arm / cpu / armv7 / sunxi / board.c
index f4a580a24218d1daa7aabd1dcdcffc9b9b2e25a1..c02c0150960c2be2ee2324c680d86d258f09b4f2 100644 (file)
 
 #include <linux/compiler.h>
 
-#ifdef CONFIG_SPL_BUILD
-/* Pointer to the global data structure for SPL */
-DECLARE_GLOBAL_DATA_PTR;
-
-/* The sunxi internal brom will try to loader external bootloader
- * from mmc0, nand flash, mmc2.
- * Unfortunately we can't check how SPL was loaded so assume
- * it's always the first SD/MMC controller
- */
-u32 spl_boot_device(void)
-{
-       return BOOT_DEVICE_MMC1;
-}
+struct fel_stash {
+       uint32_t sp;
+       uint32_t lr;
+       uint32_t cpsr;
+       uint32_t sctlr;
+       uint32_t vbar;
+       uint32_t cr;
+};
 
-/* No confirmation data available in SPL yet. Hardcode bootmode */
-u32 spl_boot_mode(void)
-{
-       return MMCSD_MODE_RAW;
-}
+struct fel_stash fel_stash __attribute__((section(".data")));
 
 static int gpio_init(void)
 {
@@ -85,7 +76,13 @@ static int gpio_init(void)
        return 0;
 }
 
-void board_init_f(ulong dummy)
+void spl_board_load_image(void)
+{
+       debug("Returning to FEL sp=%x, lr=%x\n", fel_stash.sp, fel_stash.lr);
+       return_to_fel(fel_stash.sp, fel_stash.lr);
+}
+
+void s_init(void)
 {
 #if defined CONFIG_MACH_SUN6I || defined CONFIG_MACH_SUN8I
        /* Magic (undocmented) value taken from boot0, without this DRAM
@@ -105,7 +102,54 @@ void board_init_f(ulong dummy)
        timer_init();
        gpio_init();
        i2c_init_board();
+}
 
+#ifdef CONFIG_SPL_BUILD
+/* The sunxi internal brom will try to loader external bootloader
+ * from mmc0, nand flash, mmc2.
+ * Unfortunately we can't check how SPL was loaded so assume
+ * it's always the first SD/MMC controller
+ */
+u32 spl_boot_device(void)
+{
+#ifdef CONFIG_SPL_FEL
+       /*
+        * This is the legacy compile time configuration for a special FEL
+        * enabled build. It has many restrictions and can only boot over USB.
+        */
+       return BOOT_DEVICE_BOARD;
+#else
+       /*
+        * When booting from the SD card, the "eGON.BT0" signature is expected
+        * to be found in memory at the address 0x0004 (see the "mksunxiboot"
+        * tool, which generates this header).
+        *
+        * When booting in the FEL mode over USB, this signature is patched in
+        * memory and replaced with something else by the 'fel' tool. This other
+        * signature is selected in such a way, that it can't be present in a
+        * valid bootable SD card image (because the BROM would refuse to
+        * execute the SPL in this case).
+        *
+        * This branch is just making a decision at runtime whether to load
+        * the main u-boot binary from the SD card (if the "eGON.BT0" signature
+        * is found) or return to the FEL code in the BROM to wait and receive
+        * the main u-boot binary over USB.
+        */
+       if (readl(4) == 0x4E4F4765 && readl(8) == 0x3054422E) /* eGON.BT0 */
+               return BOOT_DEVICE_MMC1;
+       else
+               return BOOT_DEVICE_BOARD;
+#endif
+}
+
+/* No confirmation data available in SPL yet. Hardcode bootmode */
+u32 spl_boot_mode(void)
+{
+       return MMCSD_MODE_RAW;
+}
+
+void board_init_f(ulong dummy)
+{
        preloader_console_init();
 
 #ifdef CONFIG_SPL_I2C_SUPPORT