diff options
Diffstat (limited to 'scripts/kconfig/confdata.c')
| -rw-r--r-- | scripts/kconfig/confdata.c | 51 | 
1 files changed, 36 insertions, 15 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 830d9eae11f..273d73888f9 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -843,7 +843,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  			default:  				continue;  			} -			if (!sym_is_choice(sym) || mode != def_random) +			if (!(sym_is_choice(sym) && mode == def_random))  				sym->flags |= SYMBOL_DEF_USER;  			break;  		default: @@ -856,28 +856,49 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  	if (mode != def_random)  		return; - +	/* +	 * We have different type of choice blocks. +	 * If curr.tri equal to mod then we can select several +	 * choice symbols in one block. +	 * In this case we do nothing. +	 * If curr.tri equal yes then only one symbol can be +	 * selected in a choice block and we set it to yes, +	 * and the rest to no. +	 */  	for_all_symbols(i, csym) {  		if (sym_has_value(csym) || !sym_is_choice(csym))  			continue;  		sym_calc_value(csym); + +		if (csym->curr.tri != yes) +			continue; +  		prop = sym_get_choice_prop(csym); -		def = -1; -		while (1) { -			cnt = 0; -			expr_list_for_each_sym(prop->expr, e, sym) { -				if (sym->visible == no) -					continue; -				if (def == cnt++) { -					csym->def[S_DEF_USER].val = sym; -					break; -				} + +		/* count entries in choice block */ +		cnt = 0; +		expr_list_for_each_sym(prop->expr, e, sym) +			cnt++; + +		/* +		 * find a random value and set it to yes, +		 * set the rest to no so we have only one set +		 */ +		def = (rand() % cnt); + +		cnt = 0; +		expr_list_for_each_sym(prop->expr, e, sym) { +			if (def == cnt++) { +				sym->def[S_DEF_USER].tri = yes; +				csym->def[S_DEF_USER].val = sym; +			} +			else { +				sym->def[S_DEF_USER].tri = no;  			} -			if (def >= 0 || cnt < 2) -				break; -			def = (rand() % cnt) + 1;  		}  		csym->flags |= SYMBOL_DEF_USER; +		/* clear VALID to get value calculated */ +		csym->flags &= ~(SYMBOL_VALID);  	}  }  |