Commit 7bcf2e03 authored by Masahiro Yamada's avatar Masahiro Yamada

kconfig: add sym_get_choice_menu() helper

Choices and their members are associated via the P_CHOICE property.

Currently, prop_get_symbol(sym_get_choice_prop()) is used to obtain
the choice of the given choice member.

We can do this without relying on P_CHOICE by checking the parent in
the menu structure.

Introduce a new helper to retrieve the choice if the given symbol is a
choice member.

This is intended to replace prop_get_symbol(sym_get_choice_prop()) and
deprecate P_CHOICE eventually.
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent 8a22f867
...@@ -34,6 +34,7 @@ bool sym_string_within_range(struct symbol *sym, const char *str); ...@@ -34,6 +34,7 @@ bool sym_string_within_range(struct symbol *sym, const char *str);
bool sym_set_string_value(struct symbol *sym, const char *newval); bool sym_set_string_value(struct symbol *sym, const char *newval);
bool sym_is_changeable(struct symbol *sym); bool sym_is_changeable(struct symbol *sym);
struct property * sym_get_choice_prop(struct symbol *sym); struct property * sym_get_choice_prop(struct symbol *sym);
struct menu *sym_get_choice_menu(struct symbol *sym);
const char * sym_get_string_value(struct symbol *sym); const char * sym_get_string_value(struct symbol *sym);
const char * prop_get_type_name(enum prop_type type); const char * prop_get_type_name(enum prop_type type);
......
...@@ -78,6 +78,41 @@ struct property *sym_get_choice_prop(struct symbol *sym) ...@@ -78,6 +78,41 @@ struct property *sym_get_choice_prop(struct symbol *sym)
return NULL; return NULL;
} }
/**
* sym_get_choice_menu - get the parent choice menu if present
*
* @sym: a symbol pointer
*
* Return: a choice menu if this function is called against a choice member.
*/
struct menu *sym_get_choice_menu(struct symbol *sym)
{
struct menu *menu = NULL;
struct menu *m;
/*
* Choice members must have a prompt. Find a menu entry with a prompt,
* and assume it resides inside a choice block.
*/
list_for_each_entry(m, &sym->menus, link)
if (m->prompt) {
menu = m;
break;
}
if (!menu)
return NULL;
do {
menu = menu->parent;
} while (menu && !menu->sym);
if (menu && menu->sym && sym_is_choice(menu->sym))
return menu;
return NULL;
}
static struct property *sym_get_default_prop(struct symbol *sym) static struct property *sym_get_default_prop(struct symbol *sym)
{ {
struct property *prop; struct property *prop;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment