diff options
-rw-r--r-- | Documentation/sound/alsa/HD-Audio.txt | 2 | ||||
-rw-r--r-- | sound/pci/hda/hda_generic.c | 14 | ||||
-rw-r--r-- | sound/pci/hda/hda_generic.h | 1 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 4 |
4 files changed, 16 insertions, 5 deletions
diff --git a/Documentation/sound/alsa/HD-Audio.txt b/Documentation/sound/alsa/HD-Audio.txt index c3c912d023cc..42a0a39b77e6 100644 --- a/Documentation/sound/alsa/HD-Audio.txt +++ b/Documentation/sound/alsa/HD-Audio.txt | |||
@@ -454,6 +454,8 @@ The generic parser supports the following hints: | |||
454 | - need_dac_fix (bool): limits the DACs depending on the channel count | 454 | - need_dac_fix (bool): limits the DACs depending on the channel count |
455 | - primary_hp (bool): probe headphone jacks as the primary outputs; | 455 | - primary_hp (bool): probe headphone jacks as the primary outputs; |
456 | default true | 456 | default true |
457 | - multi_io (bool): try probing multi-I/O config (e.g. shared | ||
458 | line-in/surround, mic/clfe jacks) | ||
457 | - multi_cap_vol (bool): provide multiple capture volumes | 459 | - multi_cap_vol (bool): provide multiple capture volumes |
458 | - inv_dmic_split (bool): provide split internal mic volume/switch for | 460 | - inv_dmic_split (bool): provide split internal mic volume/switch for |
459 | phase-inverted digital mics | 461 | phase-inverted digital mics |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index f5c2d1ff1a09..f6c0344258ac 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -142,6 +142,9 @@ static void parse_user_hints(struct hda_codec *codec) | |||
142 | val = snd_hda_get_bool_hint(codec, "primary_hp"); | 142 | val = snd_hda_get_bool_hint(codec, "primary_hp"); |
143 | if (val >= 0) | 143 | if (val >= 0) |
144 | spec->no_primary_hp = !val; | 144 | spec->no_primary_hp = !val; |
145 | val = snd_hda_get_bool_hint(codec, "multi_io"); | ||
146 | if (val >= 0) | ||
147 | spec->no_multi_io = !val; | ||
145 | val = snd_hda_get_bool_hint(codec, "multi_cap_vol"); | 148 | val = snd_hda_get_bool_hint(codec, "multi_cap_vol"); |
146 | if (val >= 0) | 149 | if (val >= 0) |
147 | spec->multi_cap_vol = !!val; | 150 | spec->multi_cap_vol = !!val; |
@@ -1541,7 +1544,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1541 | cfg->speaker_pins, | 1544 | cfg->speaker_pins, |
1542 | spec->multiout.extra_out_nid, | 1545 | spec->multiout.extra_out_nid, |
1543 | spec->speaker_paths); | 1546 | spec->speaker_paths); |
1544 | if (fill_mio_first && cfg->line_outs == 1 && | 1547 | if (!spec->no_multi_io && |
1548 | fill_mio_first && cfg->line_outs == 1 && | ||
1545 | cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { | 1549 | cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { |
1546 | err = fill_multi_ios(codec, cfg->line_out_pins[0], true); | 1550 | err = fill_multi_ios(codec, cfg->line_out_pins[0], true); |
1547 | if (!err) | 1551 | if (!err) |
@@ -1554,7 +1558,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1554 | spec->private_dac_nids, spec->out_paths, | 1558 | spec->private_dac_nids, spec->out_paths, |
1555 | spec->main_out_badness); | 1559 | spec->main_out_badness); |
1556 | 1560 | ||
1557 | if (fill_mio_first && | 1561 | if (!spec->no_multi_io && fill_mio_first && |
1558 | cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { | 1562 | cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { |
1559 | /* try to fill multi-io first */ | 1563 | /* try to fill multi-io first */ |
1560 | err = fill_multi_ios(codec, cfg->line_out_pins[0], false); | 1564 | err = fill_multi_ios(codec, cfg->line_out_pins[0], false); |
@@ -1582,7 +1586,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1582 | return err; | 1586 | return err; |
1583 | badness += err; | 1587 | badness += err; |
1584 | } | 1588 | } |
1585 | if (cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { | 1589 | if (!spec->no_multi_io && |
1590 | cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) { | ||
1586 | err = fill_multi_ios(codec, cfg->line_out_pins[0], false); | 1591 | err = fill_multi_ios(codec, cfg->line_out_pins[0], false); |
1587 | if (err < 0) | 1592 | if (err < 0) |
1588 | return err; | 1593 | return err; |
@@ -1600,7 +1605,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1600 | check_aamix_out_path(codec, spec->speaker_paths[0]); | 1605 | check_aamix_out_path(codec, spec->speaker_paths[0]); |
1601 | } | 1606 | } |
1602 | 1607 | ||
1603 | if (cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) | 1608 | if (!spec->no_multi_io && |
1609 | cfg->hp_outs && cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) | ||
1604 | if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2) | 1610 | if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2) |
1605 | spec->multi_ios = 1; /* give badness */ | 1611 | spec->multi_ios = 1; /* give badness */ |
1606 | 1612 | ||
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index e199a852388b..48d44026705b 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h | |||
@@ -220,6 +220,7 @@ struct hda_gen_spec { | |||
220 | unsigned int hp_mic:1; /* Allow HP as a mic-in */ | 220 | unsigned int hp_mic:1; /* Allow HP as a mic-in */ |
221 | unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */ | 221 | unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */ |
222 | unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */ | 222 | unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */ |
223 | unsigned int no_multi_io:1; /* Don't try multi I/O config */ | ||
223 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ | 224 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ |
224 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ | 225 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ |
225 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ | 226 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 04a69e3fca47..ad7a0985edfe 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1845,8 +1845,10 @@ static void alc882_fixup_no_primary_hp(struct hda_codec *codec, | |||
1845 | const struct hda_fixup *fix, int action) | 1845 | const struct hda_fixup *fix, int action) |
1846 | { | 1846 | { |
1847 | struct alc_spec *spec = codec->spec; | 1847 | struct alc_spec *spec = codec->spec; |
1848 | if (action == HDA_FIXUP_ACT_PRE_PROBE) | 1848 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { |
1849 | spec->gen.no_primary_hp = 1; | 1849 | spec->gen.no_primary_hp = 1; |
1850 | spec->gen.no_multi_io = 1; | ||
1851 | } | ||
1850 | } | 1852 | } |
1851 | 1853 | ||
1852 | static const struct hda_fixup alc882_fixups[] = { | 1854 | static const struct hda_fixup alc882_fixups[] = { |