diff options
| -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; |
