hardware exists and only a single driver can be compiled/loaded into
 the kernel, but all drivers can be compiled as modules.
 
-A choice accepts another option "optional", which allows to set the
-choice to 'n' and no entry needs to be selected.
-
 comment::
 
        "comment" <prompt>
 
                        /*
                         * If symbol is a choice value and equals to the
                         * default for a choice - skip.
-                        * But only if value is bool and equal to "y" and
-                        * choice is not "optional".
-                        * (If choice is "optional" then all values can be "n")
                         */
                        if (sym_is_choice_value(sym)) {
                                struct symbol *cs;
 
                                cs = prop_get_symbol(sym_get_choice_prop(sym));
                                ds = sym_choice_default(cs);
-                               if (!sym_is_optional(cs) && sym == ds) {
+                               if (sym == ds) {
                                        if ((sym->type == S_BOOLEAN) &&
                                            sym_get_tristate_value(sym) == yes)
                                                continue;
 
 #define SYMBOL_CHECK      0x0008  /* used during dependency checking */
 #define SYMBOL_CHOICEVAL  0x0020  /* used as a value in a choice block */
 #define SYMBOL_VALID      0x0080  /* set when symbol.curr is calculated */
-#define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
 #define SYMBOL_WRITE      0x0200  /* write symbol to file (KCONFIG_CONFIG) */
 #define SYMBOL_CHANGED    0x0400  /* ? */
 #define SYMBOL_WRITTEN    0x0800  /* track info to avoid double-write to .config */
 
                strcat(buf, "choiceval/");
        if (val & SYMBOL_VALID)
                strcat(buf, "valid/");
-       if (val & SYMBOL_OPTIONAL)
-               strcat(buf, "optional/");
        if (val & SYMBOL_WRITE)
                strcat(buf, "write/");
        if (val & SYMBOL_CHANGED)
 
 "menuconfig"           return T_MENUCONFIG;
 "modules"              return T_MODULES;
 "on"                   return T_ON;
-"optional"             return T_OPTIONAL;
 "prompt"               return T_PROMPT;
 "range"                        return T_RANGE;
 "select"               return T_SELECT;
 
        return sym->flags & SYMBOL_CHOICEVAL ? true : false;
 }
 
-static inline bool sym_is_optional(struct symbol *sym)
-{
-       return sym->flags & SYMBOL_OPTIONAL ? true : false;
-}
-
 static inline bool sym_has_value(struct symbol *sym)
 {
        return sym->flags & SYMBOL_DEF_USER ? true : false;
 
        }
 
        /*
-        * For non-optional choices, add a reverse dependency (corresponding to
-        * a select) of '<visibility> && m'. This prevents the user from
-        * setting the choice mode to 'n' when the choice is visible.
-        *
-        * This would also work for non-choice symbols, but only non-optional
-        * choices clear SYMBOL_OPTIONAL as of writing. Choices are implemented
-        * as a type of symbol.
+        * For choices, add a reverse dependency (corresponding to a select) of
+        * '<visibility> && m'. This prevents the user from setting the choice
+        * mode to 'n' when the choice is visible.
         */
-       if (sym && !sym_is_optional(sym) && parent->prompt) {
+       if (sym && sym_is_choice(sym) && parent->prompt) {
                sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
                                expr_alloc_and(parent->prompt->visible.expr,
                                        expr_alloc_symbol(&symbol_mod)));
 
 %token T_MODULES
 %token T_ON
 %token T_OPEN_PAREN
-%token T_OPTIONAL
 %token T_PLUS_EQUAL
 %token T_PROMPT
 %token T_RANGE
 
 config_entry_start: T_CONFIG nonconst_symbol T_EOL
 {
-       $2->flags |= SYMBOL_OPTIONAL;
        menu_add_entry($2);
        printd(DEBUG_PARSE, "%s:%d:config %s\n", cur_filename, cur_lineno, $2->name);
 };
 
 menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
 {
-       $2->flags |= SYMBOL_OPTIONAL;
        menu_add_entry($2);
        printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", cur_filename, cur_lineno, $2->name);
 };
        printd(DEBUG_PARSE, "%s:%d:type(%u)\n", cur_filename, cur_lineno, $1);
 };
 
-choice_option: T_OPTIONAL T_EOL
-{
-       current_entry->sym->flags |= SYMBOL_OPTIONAL;
-       printd(DEBUG_PARSE, "%s:%d:optional\n", cur_filename, cur_lineno);
-};
-
 choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
 {
        menu_add_symbol(P_DEFAULT, $2, $3);
 
 
 endchoice
 
-choice
-       prompt "optional boolean choice"
-       optional
-       default OPT_BOOL_CHOICE1
-
-config OPT_BOOL_CHOICE0
-       bool "choice 0"
-
-config OPT_BOOL_CHOICE1
-       bool "choice 1"
-
-endchoice
-
 choice
        prompt "tristate choice"
        default TRI_CHOICE1
        tristate "choice 1"
 
 endchoice
-
-choice
-       prompt "optional tristate choice"
-       optional
-       default OPT_TRI_CHOICE1
-
-config OPT_TRI_CHOICE0
-       tristate "choice 0"
-
-config OPT_TRI_CHOICE1
-       tristate "choice 1"
-
-endchoice
 
 
 The behavior of 'y' choice is intuitive.  If choice values are tristate,
 the choice can be 'm' where each value can be enabled independently.
-Also, if a choice is marked as 'optional', the whole choice can be
-invisible.
 """
 
 
 
 CONFIG_MODULES=y
 # CONFIG_BOOL_CHOICE0 is not set
 CONFIG_BOOL_CHOICE1=y
-# CONFIG_OPT_BOOL_CHOICE0 is not set
-CONFIG_OPT_BOOL_CHOICE1=y
 CONFIG_TRI_CHOICE0=m
 CONFIG_TRI_CHOICE1=m
-CONFIG_OPT_TRI_CHOICE0=m
-CONFIG_OPT_TRI_CHOICE1=m
 
 CONFIG_MODULES=y
 # CONFIG_BOOL_CHOICE0 is not set
 CONFIG_BOOL_CHOICE1=y
-# CONFIG_OPT_BOOL_CHOICE0 is not set
-CONFIG_OPT_BOOL_CHOICE1=y
 # CONFIG_TRI_CHOICE0 is not set
 CONFIG_TRI_CHOICE1=y
-# CONFIG_OPT_TRI_CHOICE0 is not set
-CONFIG_OPT_TRI_CHOICE1=y
 
   1. choice 0 (BOOL_CHOICE0) (NEW)
 > 2. choice 1 (BOOL_CHOICE1) (NEW)
 choice[1-2?]: 
-optional boolean choice [N/y/?] (NEW) 
 tristate choice [M/y/?] (NEW) 
   choice 0 (TRI_CHOICE0) [N/m/?] (NEW) 
   choice 1 (TRI_CHOICE1) [N/m/?] (NEW) 
-optional tristate choice [N/m/y/?] (NEW) 
 
 # CONFIG_MODULES is not set
-CONFIG_OPT_BOOL_CHOICE0=y
 
   1. choice 0 (BOOL_CHOICE0) (NEW)
 > 2. choice 1 (BOOL_CHOICE1) (NEW)
 choice[1-2?]: 
-optional boolean choice [Y/n/?] (NEW) 
-optional boolean choice
-> 1. choice 0 (OPT_BOOL_CHOICE0)
-  2. choice 1 (OPT_BOOL_CHOICE1) (NEW)
-choice[1-2?]: 
 tristate choice
   1. choice 0 (TRI_CHOICE0) (NEW)
 > 2. choice 1 (TRI_CHOICE1) (NEW)
 choice[1-2?]: 
-optional tristate choice [N/y/?]