aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/kconfig/symbol.c24
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 }