diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-11-03 11:54:06 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-11-03 12:00:27 -0400 |
commit | 51e4152a969aa6d2306492ebf143932dcb535c9b (patch) | |
tree | 303d30a6855dbe5e9606f5e228e999c3b061fb6e /sound | |
parent | 9009b0e41c1e81e1a30acdb5d4ffbb6dc5e1345f (diff) |
ALSA: hda/realtek - Skip invalid digital out pins
Some BIOS report invalid pins as digital output pins. The driver checks
the connection but it doesn't do it fully correctly, and it leaves some
undefined value as the audio-out widget, which makes the driver spewing
warnings. This patch fixes the issue.
Reference: https://bugzilla.novell.com/show_bug.cgi?id=727348
Cc: <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 9543bc8aaef..80d6add8a62 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -1604,27 +1604,29 @@ static void alc_auto_init_digital(struct hda_codec *codec) | |||
1604 | static void alc_auto_parse_digital(struct hda_codec *codec) | 1604 | static void alc_auto_parse_digital(struct hda_codec *codec) |
1605 | { | 1605 | { |
1606 | struct alc_spec *spec = codec->spec; | 1606 | struct alc_spec *spec = codec->spec; |
1607 | int i, err; | 1607 | int i, err, nums; |
1608 | hda_nid_t dig_nid; | 1608 | hda_nid_t dig_nid; |
1609 | 1609 | ||
1610 | /* support multiple SPDIFs; the secondary is set up as a slave */ | 1610 | /* support multiple SPDIFs; the secondary is set up as a slave */ |
1611 | nums = 0; | ||
1611 | for (i = 0; i < spec->autocfg.dig_outs; i++) { | 1612 | for (i = 0; i < spec->autocfg.dig_outs; i++) { |
1612 | hda_nid_t conn[4]; | 1613 | hda_nid_t conn[4]; |
1613 | err = snd_hda_get_connections(codec, | 1614 | err = snd_hda_get_connections(codec, |
1614 | spec->autocfg.dig_out_pins[i], | 1615 | spec->autocfg.dig_out_pins[i], |
1615 | conn, ARRAY_SIZE(conn)); | 1616 | conn, ARRAY_SIZE(conn)); |
1616 | if (err < 0) | 1617 | if (err <= 0) |
1617 | continue; | 1618 | continue; |
1618 | dig_nid = conn[0]; /* assume the first element is audio-out */ | 1619 | dig_nid = conn[0]; /* assume the first element is audio-out */ |
1619 | if (!i) { | 1620 | if (!nums) { |
1620 | spec->multiout.dig_out_nid = dig_nid; | 1621 | spec->multiout.dig_out_nid = dig_nid; |
1621 | spec->dig_out_type = spec->autocfg.dig_out_type[0]; | 1622 | spec->dig_out_type = spec->autocfg.dig_out_type[0]; |
1622 | } else { | 1623 | } else { |
1623 | spec->multiout.slave_dig_outs = spec->slave_dig_outs; | 1624 | spec->multiout.slave_dig_outs = spec->slave_dig_outs; |
1624 | if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) | 1625 | if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1) |
1625 | break; | 1626 | break; |
1626 | spec->slave_dig_outs[i - 1] = dig_nid; | 1627 | spec->slave_dig_outs[nums - 1] = dig_nid; |
1627 | } | 1628 | } |
1629 | nums++; | ||
1628 | } | 1630 | } |
1629 | 1631 | ||
1630 | if (spec->autocfg.dig_in_pin) { | 1632 | if (spec->autocfg.dig_in_pin) { |