This function is quite long and does two separate things: init and
booting. Split it into two.

Signed-off-by: Simon Glass <s...@chromium.org>
---

 common/spl/spl.c | 64 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 49 insertions(+), 15 deletions(-)

diff --git a/common/spl/spl.c b/common/spl/spl.c
index 55b638209ae..edf24b05162 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -720,16 +720,15 @@ void board_init_f(ulong dummy)
 }
 #endif
 
-void board_init_r(gd_t *dummy1, ulong dummy2)
+/**
+ * spl_init_r() - Set up SPL ready for use
+ *
+ * Calls all required init functions to get SPL up and running
+ *
+ * @return 0 if OK, -ve on error (meaning boot cannot proceed)
+ */
+static int spl_init_r(void)
 {
-       u32 spl_boot_list[] = {
-               BOOT_DEVICE_NONE,
-               BOOT_DEVICE_NONE,
-               BOOT_DEVICE_NONE,
-               BOOT_DEVICE_NONE,
-               BOOT_DEVICE_NONE,
-       };
-       struct spl_image_info spl_image;
        int ret;
 
        debug(">>" SPL_TPL_PROMPT "board_init_r()\n");
@@ -741,8 +740,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        gd->flags |= GD_FLG_FULL_MALLOC_INIT;
 #endif
        if (!(gd->flags & GD_FLG_SPL_INIT)) {
-               if (spl_init())
-                       hang();
+               ret = spl_init();
+               if (ret)
+                       return log_msg_ret("init", ret);
        }
 #if !defined(CONFIG_PPC) && !defined(CONFIG_ARCH_MX6)
        /*
@@ -754,10 +754,9 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        if (CONFIG_IS_ENABLED(BLOBLIST)) {
                ret = bloblist_init();
                if (ret) {
-                       debug("%s: Failed to set up bloblist: ret=%d\n",
-                             __func__, ret);
+                       log_debug("Failed to set up bloblist: ret=%d\n", ret);
                        puts(SPL_TPL_PROMPT "Cannot set up bloblist\n");
-                       hang();
+                       return log_msg_ret("bl", ret);
                }
        }
        if (CONFIG_IS_ENABLED(HANDOFF)) {
@@ -766,7 +765,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                ret = setup_spl_handoff();
                if (ret) {
                        puts(SPL_TPL_PROMPT "Cannot set up SPL handoff\n");
-                       hang();
+                       return log_msg_ret("ho", ret);
                }
        }
 
@@ -795,6 +794,29 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
                dm_dump_mem(&mem);
        }
 
+       return 0;
+}
+
+/**
+ * spl_boot() - Boot into the next U-Boot phase
+ *
+ * Figures out which boot device to use, loads the image and jumps to it
+ *
+ * This function does not return. If something goes wrong, it tries to print a
+ * message, then hangs.
+ */
+static void spl_boot(void)
+{
+       u32 spl_boot_list[] = {
+               BOOT_DEVICE_NONE,
+               BOOT_DEVICE_NONE,
+               BOOT_DEVICE_NONE,
+               BOOT_DEVICE_NONE,
+               BOOT_DEVICE_NONE,
+       };
+       struct spl_image_info spl_image;
+       int ret;
+
        memset(&spl_image, '\0', sizeof(spl_image));
 #ifdef CONFIG_SYS_SPL_ARGS_ADDR
        spl_image.arg = (void *)CONFIG_SYS_SPL_ARGS_ADDR;
@@ -880,6 +902,18 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
        jump_to_image_no_args(&spl_image);
 }
 
+void board_init_r(gd_t *dummy1, ulong dummy2)
+{
+       int ret;
+
+       ret = spl_init_r();
+       if (!ret)
+               spl_boot();
+
+       puts("SPL fail\n");
+       hang();
+}
+
 /*
  * This requires UART clocks to be enabled.  In order for this to work the
  * caller must ensure that the gd pointer is valid.
-- 
2.37.3.998.g577e59143f-goog

Reply via email to