expo: Split bootflow_menu_new() into two pieces

Split the iteration piece of this function into bootflow_menu_add_all()
so that it is possible for the caller to be in control of adding items
to the menu.

Move the expo_destroy() call into the caller.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c
index ed7c076..f731d78 100644
--- a/boot/bootflow_menu.c
+++ b/boot/bootflow_menu.c
@@ -32,14 +32,12 @@
 
 int bootflow_menu_new(struct expo **expp)
 {
-	struct udevice *last_bootdev;
 	struct scene_obj_menu *menu;
 	struct menu_priv *priv;
-	struct bootflow *bflow;
 	struct scene *scn;
 	struct expo *exp;
 	void *logo;
-	int ret, i;
+	int ret;
 
 	priv = calloc(1, sizeof(*priv));
 	if (!priv)
@@ -74,6 +72,26 @@
 	if (ret < 0)
 		return log_msg_ret("new", -EINVAL);
 
+	*expp = exp;
+
+	return 0;
+}
+
+int bootflow_menu_add_all(struct expo *exp)
+{
+	struct menu_priv *priv = exp->priv;
+	struct udevice *last_bootdev;
+	struct bootflow *bflow;
+	struct scene *scn;
+	uint scene_id;
+	int ret, i;
+
+	ret = expo_first_scene_id(exp);
+	if (ret < 0)
+		return log_msg_ret("scn", ret);
+	scene_id = ret;
+	scn = expo_lookup_scene_id(exp, scene_id);
+
 	last_bootdev = NULL;
 	for (ret = bootflow_first_glob(&bflow), i = 0; !ret && i < 36;
 	     ret = bootflow_next_glob(&bflow), i++) {
@@ -133,8 +151,6 @@
 	if (ret)
 		return log_msg_ret("arr", ret);
 
-	*expp = exp;
-
 	return 0;
 }
 
@@ -184,7 +200,10 @@
 
 	ret = bootflow_menu_new(&exp);
 	if (ret)
-		return log_msg_ret("exp", ret);
+		return log_msg_ret("bmn", ret);
+	ret = bootflow_menu_add_all(exp);
+	if (ret)
+		return log_msg_ret("bma", ret);
 
 	if (ofnode_valid(std->theme)) {
 		ret = bootflow_menu_apply_theme(exp, std->theme);
diff --git a/include/bootflow.h b/include/bootflow.h
index 8244d4f..994b383 100644
--- a/include/bootflow.h
+++ b/include/bootflow.h
@@ -488,12 +488,25 @@
 /**
  * bootflow_menu_new() - Create a new bootflow menu
  *
+ * This is initially empty. Call bootflow_menu_add_all() to add all the
+ * bootflows to it.
+ *
  * @expp: Returns the expo created
  * Returns 0 on success, -ve on error
  */
 int bootflow_menu_new(struct expo **expp);
 
 /**
+ * bootflow_menu_add_all() - Add all bootflows to a menu
+ *
+ * Loops through all bootflows and adds them to the menu
+ *
+ * @exp: Menu to update
+ * Return 0 on success, -ve on error
+ */
+int bootflow_menu_add_all(struct expo *exp);
+
+/**
  * bootflow_menu_apply_theme() - Apply a theme to a bootmenu
  *
  * @exp: Expo to update
diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c
index a930d2c..58885b5 100644
--- a/test/boot/bootflow.c
+++ b/test/boot/bootflow.c
@@ -878,6 +878,7 @@
 	ut_assertok(scan_mmc4_bootdev(uts));
 
 	ut_assertok(bootflow_menu_new(&exp));
+	ut_assertok(bootflow_menu_add_all(exp));
 	node = ofnode_path("/bootstd/theme");
 	ut_assert(ofnode_valid(node));
 	ut_assertok(bootflow_menu_apply_theme(exp, node));