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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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_is_changeable(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 * prop_get_type_name(enum prop_type type);
+35 −0
Original line number Diff line number Diff line
@@ -78,6 +78,41 @@ struct property *sym_get_choice_prop(struct symbol *sym)
	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)
{
	struct property *prop;