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 <s...@chromium.org> --- boot/bootflow_menu.c | 31 +++++++++++++++++++++++-------- include/bootflow.h | 13 +++++++++++++ test/boot/bootflow.c | 1 + 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/boot/bootflow_menu.c b/boot/bootflow_menu.c index 018910c65b8..9b97156d943 100644 --- a/boot/bootflow_menu.c +++ b/boot/bootflow_menu.c @@ -32,14 +32,12 @@ struct menu_priv { 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 @@ int bootflow_menu_new(struct expo **expp) 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 @@ int bootflow_menu_new(struct expo **expp) if (ret) return log_msg_ret("arr", ret); - *expp = exp; - return 0; } @@ -182,9 +198,8 @@ int bootflow_menu_start(struct bootstd_priv *std, bool text_mode, struct expo *exp; int ret; - ret = bootflow_menu_new(&exp); - if (ret) - return log_msg_ret("exp", ret); + LOGR("bmn", bootflow_menu_new(&exp)); + LOGR("bma", bootflow_menu_add_all(exp)); if (ofnode_valid(std->theme)) { ret = bootflow_menu_apply_theme(exp, std->theme); diff --git a/include/bootflow.h b/include/bootflow.h index 72f09304cff..5f65129ca65 100644 --- a/include/bootflow.h +++ b/include/bootflow.h @@ -489,11 +489,24 @@ int bootflow_iter_check_system(const struct bootflow_iter *iter); /** * 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 * diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c index cbb5bcc0cf3..572851761c5 100644 --- a/test/boot/bootflow.c +++ b/test/boot/bootflow.c @@ -881,6 +881,7 @@ static int bootflow_menu_theme(struct unit_test_state *uts) 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)); -- 2.43.0