diff options
Diffstat (limited to 'scripts/kconfig/symbol.c')
-rw-r--r-- | scripts/kconfig/symbol.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 3929e5b35e79..4a03191ad176 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c | |||
@@ -298,22 +298,30 @@ void sym_calc_value(struct symbol *sym) | |||
298 | if (sym_is_choice_value(sym) && sym->visible == yes) { | 298 | if (sym_is_choice_value(sym) && sym->visible == yes) { |
299 | prop = sym_get_choice_prop(sym); | 299 | prop = sym_get_choice_prop(sym); |
300 | newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; | 300 | newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; |
301 | } else if (EXPR_OR(sym->visible, sym->rev_dep.tri) != no) { | 301 | } else { |
302 | sym->flags |= SYMBOL_WRITE; | 302 | if (sym->visible != no) { |
303 | if (sym_has_value(sym)) | 303 | /* if the symbol is visible use the user value |
304 | newval.tri = sym->def[S_DEF_USER].tri; | 304 | * if available, otherwise try the default value |
305 | else if (!sym_is_choice(sym)) { | 305 | */ |
306 | prop = sym_get_default_prop(sym); | 306 | sym->flags |= SYMBOL_WRITE; |
307 | if (prop) | 307 | if (sym_has_value(sym)) { |
308 | newval.tri = expr_calc_value(prop->expr); | 308 | newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri, |
309 | sym->visible); | ||
310 | goto calc_newval; | ||
311 | } | ||
309 | } | 312 | } |
310 | newval.tri = EXPR_OR(EXPR_AND(newval.tri, sym->visible), sym->rev_dep.tri); | 313 | if (sym->rev_dep.tri != no) |
311 | } else if (!sym_is_choice(sym)) { | ||
312 | prop = sym_get_default_prop(sym); | ||
313 | if (prop) { | ||
314 | sym->flags |= SYMBOL_WRITE; | 314 | sym->flags |= SYMBOL_WRITE; |
315 | newval.tri = expr_calc_value(prop->expr); | 315 | if (!sym_is_choice(sym)) { |
316 | prop = sym_get_default_prop(sym); | ||
317 | if (prop) { | ||
318 | sym->flags |= SYMBOL_WRITE; | ||
319 | newval.tri = EXPR_AND(expr_calc_value(prop->expr), | ||
320 | prop->visible.tri); | ||
321 | } | ||
316 | } | 322 | } |
323 | calc_newval: | ||
324 | newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); | ||
317 | } | 325 | } |
318 | if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) | 326 | if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) |
319 | newval.tri = yes; | 327 | newval.tri = yes; |