| From 51e4152a969aa6d2306492ebf143932dcb535c9b Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Thu, 3 Nov 2011 16:54:06 +0100 |
| Subject: ALSA: hda/realtek - Skip invalid digital out pins |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit 51e4152a969aa6d2306492ebf143932dcb535c9b upstream. |
| |
| 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 |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| sound/pci/hda/patch_realtek.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/sound/pci/hda/patch_realtek.c |
| +++ b/sound/pci/hda/patch_realtek.c |
| @@ -1566,27 +1566,29 @@ static void alc_auto_init_digital(struct |
| static void alc_auto_parse_digital(struct hda_codec *codec) |
| { |
| struct alc_spec *spec = codec->spec; |
| - int i, err; |
| + int i, err, nums; |
| hda_nid_t dig_nid; |
| |
| /* support multiple SPDIFs; the secondary is set up as a slave */ |
| + nums = 0; |
| for (i = 0; i < spec->autocfg.dig_outs; i++) { |
| hda_nid_t conn[4]; |
| err = snd_hda_get_connections(codec, |
| spec->autocfg.dig_out_pins[i], |
| conn, ARRAY_SIZE(conn)); |
| - if (err < 0) |
| + if (err <= 0) |
| continue; |
| dig_nid = conn[0]; /* assume the first element is audio-out */ |
| - if (!i) { |
| + if (!nums) { |
| spec->multiout.dig_out_nid = dig_nid; |
| spec->dig_out_type = spec->autocfg.dig_out_type[0]; |
| } else { |
| spec->multiout.slave_dig_outs = spec->slave_dig_outs; |
| - if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1) |
| + if (nums >= ARRAY_SIZE(spec->slave_dig_outs) - 1) |
| break; |
| - spec->slave_dig_outs[i - 1] = dig_nid; |
| + spec->slave_dig_outs[nums - 1] = dig_nid; |
| } |
| + nums++; |
| } |
| |
| if (spec->autocfg.dig_in_pin) { |