Skip to content

Commit da96fb5

Browse files
committed
ALSA: hda - Fix invalid multi-io creation on VAIO-Z laptops
VAIO-Z laptops need to use the specific DAC for the speaker output by some unknown reason although the codec itself supports the flexible connection. So we implemented a workaround by a new flag, no_primary_hp, for assigning the speaker pin first. This worked until 3.8 kernel, but it got broken because the driver learned for a better multi-io pin mapping, and not it can assign two mic pins for multi-io. Since the multi-io requires to be the primary output, the hp and two mic pins are assigned in prior to the speaker in the end. Although the machine has two mic pins, one of them is used as a noise- canceling headphone, thus it's no real retaskable mic jack. Thus, at best, we can disable the multi-io assignment and make the parser behavior back to the state before the multi-io. This patch adds again a new flag, no_multi_io, to indicate that the device has no multi-io capability, and set it in the fixup for VAIO-Z. The no_multi_io flag itself can be used generically, added via a helper line, too. Reported-by: Tormen <my.nl.abos@gmail.com> Reported-by: Adam Williamson <awilliam@redhat.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent eefb8be commit da96fb5

File tree

4 files changed

+16
-5
lines changed

4 files changed

+16
-5
lines changed

Documentation/sound/alsa/HD-Audio.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,8 @@ The generic parser supports the following hints:
454454
- need_dac_fix (bool): limits the DACs depending on the channel count
455455
- primary_hp (bool): probe headphone jacks as the primary outputs;
456456
default true
457+
- multi_io (bool): try probing multi-I/O config (e.g. shared
458+
line-in/surround, mic/clfe jacks)
457459
- multi_cap_vol (bool): provide multiple capture volumes
458460
- inv_dmic_split (bool): provide split internal mic volume/switch for
459461
phase-inverted digital mics

sound/pci/hda/hda_generic.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ static void parse_user_hints(struct hda_codec *codec)
142142
val = snd_hda_get_bool_hint(codec, "primary_hp");
143143
if (val >= 0)
144144
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;
145148
val = snd_hda_get_bool_hint(codec, "multi_cap_vol");
146149
if (val >= 0)
147150
spec->multi_cap_vol = !!val;
@@ -1541,7 +1544,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
15411544
cfg->speaker_pins,
15421545
spec->multiout.extra_out_nid,
15431546
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 &&
15451549
cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
15461550
err = fill_multi_ios(codec, cfg->line_out_pins[0], true);
15471551
if (!err)
@@ -1554,7 +1558,7 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
15541558
spec->private_dac_nids, spec->out_paths,
15551559
spec->main_out_badness);
15561560

1557-
if (fill_mio_first &&
1561+
if (!spec->no_multi_io && fill_mio_first &&
15581562
cfg->line_outs == 1 && cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
15591563
/* try to fill multi-io first */
15601564
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,
15821586
return err;
15831587
badness += err;
15841588
}
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) {
15861591
err = fill_multi_ios(codec, cfg->line_out_pins[0], false);
15871592
if (err < 0)
15881593
return err;
@@ -1600,7 +1605,8 @@ static int fill_and_eval_dacs(struct hda_codec *codec,
16001605
check_aamix_out_path(codec, spec->speaker_paths[0]);
16011606
}
16021607

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)
16041610
if (count_multiio_pins(codec, cfg->hp_pins[0]) >= 2)
16051611
spec->multi_ios = 1; /* give badness */
16061612

sound/pci/hda/hda_generic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ struct hda_gen_spec {
220220
unsigned int hp_mic:1; /* Allow HP as a mic-in */
221221
unsigned int suppress_hp_mic_detect:1; /* Don't detect HP/mic */
222222
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 */
223224
unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */
224225
unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */
225226
unsigned int own_eapd_ctl:1; /* set EAPD by own function */

sound/pci/hda/patch_realtek.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1845,8 +1845,10 @@ static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
18451845
const struct hda_fixup *fix, int action)
18461846
{
18471847
struct alc_spec *spec = codec->spec;
1848-
if (action == HDA_FIXUP_ACT_PRE_PROBE)
1848+
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
18491849
spec->gen.no_primary_hp = 1;
1850+
spec->gen.no_multi_io = 1;
1851+
}
18501852
}
18511853

18521854
static const struct hda_fixup alc882_fixups[] = {

0 commit comments

Comments
 (0)