diff options
Diffstat (limited to 'scripts/kconfig')
-rw-r--r-- | scripts/kconfig/symbol.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 174b230a52b0..c127fa342f1d 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c | |||
@@ -232,13 +232,15 @@ static struct symbol *sym_calc_choice(struct symbol *sym) | |||
232 | struct property *prop; | 232 | struct property *prop; |
233 | struct expr *e; | 233 | struct expr *e; |
234 | 234 | ||
235 | /* first calculate all choice values' visibilities */ | ||
236 | prop = sym_get_choice_prop(sym); | ||
237 | expr_list_for_each_sym(prop->expr, e, def_sym) | ||
238 | sym_calc_visibility(def_sym); | ||
239 | |||
235 | /* is the user choice visible? */ | 240 | /* is the user choice visible? */ |
236 | def_sym = sym->def[S_DEF_USER].val; | 241 | def_sym = sym->def[S_DEF_USER].val; |
237 | if (def_sym) { | 242 | if (def_sym && def_sym->visible != no) |
238 | sym_calc_visibility(def_sym); | 243 | return def_sym; |
239 | if (def_sym->visible != no) | ||
240 | return def_sym; | ||
241 | } | ||
242 | 244 | ||
243 | /* any of the defaults visible? */ | 245 | /* any of the defaults visible? */ |
244 | for_all_defaults(sym, prop) { | 246 | for_all_defaults(sym, prop) { |
@@ -246,18 +248,15 @@ static struct symbol *sym_calc_choice(struct symbol *sym) | |||
246 | if (prop->visible.tri == no) | 248 | if (prop->visible.tri == no) |
247 | continue; | 249 | continue; |
248 | def_sym = prop_get_symbol(prop); | 250 | def_sym = prop_get_symbol(prop); |
249 | sym_calc_visibility(def_sym); | ||
250 | if (def_sym->visible != no) | 251 | if (def_sym->visible != no) |
251 | return def_sym; | 252 | return def_sym; |
252 | } | 253 | } |
253 | 254 | ||
254 | /* just get the first visible value */ | 255 | /* just get the first visible value */ |
255 | prop = sym_get_choice_prop(sym); | 256 | prop = sym_get_choice_prop(sym); |
256 | expr_list_for_each_sym(prop->expr, e, def_sym) { | 257 | expr_list_for_each_sym(prop->expr, e, def_sym) |
257 | sym_calc_visibility(def_sym); | ||
258 | if (def_sym->visible != no) | 258 | if (def_sym->visible != no) |
259 | return def_sym; | 259 | return def_sym; |
260 | } | ||
261 | 260 | ||
262 | /* no choice? reset tristate value */ | 261 | /* no choice? reset tristate value */ |
263 | sym->curr.tri = no; | 262 | sym->curr.tri = no; |
@@ -383,12 +382,13 @@ void sym_calc_value(struct symbol *sym) | |||
383 | 382 | ||
384 | if (sym_is_choice(sym)) { | 383 | if (sym_is_choice(sym)) { |
385 | struct symbol *choice_sym; | 384 | struct symbol *choice_sym; |
386 | int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); | ||
387 | 385 | ||
388 | prop = sym_get_choice_prop(sym); | 386 | prop = sym_get_choice_prop(sym); |
389 | expr_list_for_each_sym(prop->expr, e, choice_sym) { | 387 | expr_list_for_each_sym(prop->expr, e, choice_sym) { |
390 | choice_sym->flags |= flags; | 388 | if ((sym->flags & SYMBOL_WRITE) && |
391 | if (flags & SYMBOL_CHANGED) | 389 | choice_sym->visible != no) |
390 | choice_sym->flags |= SYMBOL_WRITE; | ||
391 | if (sym->flags & SYMBOL_CHANGED) | ||
392 | sym_set_changed(choice_sym); | 392 | sym_set_changed(choice_sym); |
393 | } | 393 | } |
394 | } | 394 | } |