Commit ced4cefc authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Create Headhpone Mic Jack Mode when really needed

When a headphone jack is configurable as input, the generic parser
tries to make it retaskable as Headphone Mic.  The switching can be
done smoothly if Capture Source control exists (i.e. there is another
input source).  Or when user explicitly enables the creation of jack
mode controls, "Headhpone Mic Jack Mode" will be created accordingly.

However, if the headphone mic is the only input source, we have to
create "Headphone Mic Jack Mode" control because there is no capture
source selection.  Otherwise, the generic parser assumes that the
input is constantly enabled, thus the headphone is permanently set
as input.  This situation happens on the old MacBook Airs where no
input is supported properly, for example.

This patch fixes the problem: now "Headphone Mic Jack Mode" is created
when such an input selection isn't possible.

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=65681
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent a93455e1
...@@ -2506,12 +2506,8 @@ static int create_out_jack_modes(struct hda_codec *codec, int num_pins, ...@@ -2506,12 +2506,8 @@ static int create_out_jack_modes(struct hda_codec *codec, int num_pins,
for (i = 0; i < num_pins; i++) { for (i = 0; i < num_pins; i++) {
hda_nid_t pin = pins[i]; hda_nid_t pin = pins[i];
if (pin == spec->hp_mic_pin) { if (pin == spec->hp_mic_pin)
int ret = create_hp_mic_jack_mode(codec, pin);
if (ret < 0)
return ret;
continue; continue;
}
if (get_out_jack_num_items(codec, pin) > 1) { if (get_out_jack_num_items(codec, pin) > 1) {
struct snd_kcontrol_new *knew; struct snd_kcontrol_new *knew;
char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
...@@ -2784,9 +2780,6 @@ static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin) ...@@ -2784,9 +2780,6 @@ static int create_hp_mic_jack_mode(struct hda_codec *codec, hda_nid_t pin)
struct hda_gen_spec *spec = codec->spec; struct hda_gen_spec *spec = codec->spec;
struct snd_kcontrol_new *knew; struct snd_kcontrol_new *knew;
if (get_out_jack_num_items(codec, pin) <= 1 &&
get_in_jack_num_items(codec, pin) <= 1)
return 0; /* no need */
knew = snd_hda_gen_add_kctl(spec, "Headphone Mic Jack Mode", knew = snd_hda_gen_add_kctl(spec, "Headphone Mic Jack Mode",
&hp_mic_jack_mode_enum); &hp_mic_jack_mode_enum);
if (!knew) if (!knew)
...@@ -4383,6 +4376,17 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, ...@@ -4383,6 +4376,17 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
if (err < 0) if (err < 0)
return err; return err;
/* create "Headphone Mic Jack Mode" if no input selection is
* available (or user specifies add_jack_modes hint)
*/
if (spec->hp_mic_pin &&
(spec->auto_mic || spec->input_mux.num_items == 1 ||
spec->add_jack_modes)) {
err = create_hp_mic_jack_mode(codec, spec->hp_mic_pin);
if (err < 0)
return err;
}
if (spec->add_jack_modes) { if (spec->add_jack_modes) {
if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
err = create_out_jack_modes(codec, cfg->line_outs, err = create_out_jack_modes(codec, cfg->line_outs,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment