From a934d5a983528543850c90b29bedbdfd71f7097b Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 21 Jun 2011 14:22:14 +0200
Subject: [PATCH] ALSA: hda - Fix surround-volume parsing for VT1708B codecs
Git-commit: a934d5a983528543850c90b29bedbdfd71f7097b
Patch-mainline: 3.1-rc2
References: FATE#314310

The surround/CLFE/side DACs on VT1708B and co have no amp but the
connected selector widgets have the amp instead.  Fix the parser to
check these selector widgets for the possible mixer controls as well.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

---
 sound/pci/hda/patch_via.c |   19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -407,7 +407,10 @@ static int __get_connection_index(struct
 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
 			   unsigned int mask)
 {
-	unsigned int caps = get_wcaps(codec, nid);
+	unsigned int caps;
+	if (!nid)
+		return false;
+	caps = get_wcaps(codec, nid);
 	if (dir == HDA_INPUT)
 		caps &= AC_WCAP_IN_AMP;
 	else
@@ -1635,13 +1638,21 @@ static int create_ch_ctls(struct hda_cod
 {
 	struct via_spec *spec = codec->spec;
 	char name[32];
-	hda_nid_t nid;
-	int err;
+	hda_nid_t nid, sel, conn[8];
+	int nums, err;
+
+	/* check selector widget connected to the pin */
+	sel = 0;
+	nums = snd_hda_get_connections(codec, pin, conn, ARRAY_SIZE(conn));
+	if (nums == 1 && conn[0] != pin)
+		sel = conn[0];
 
 	if (dac && check_amp_caps(codec, dac, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
 		nid = dac;
 	else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
 		nid = pin;
+	else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_NUM_STEPS))
+		nid = sel;
 	else
 		nid = 0;
 	if (nid) {
@@ -1656,6 +1667,8 @@ static int create_ch_ctls(struct hda_cod
 		nid = dac;
 	else if (check_amp_caps(codec, pin, HDA_OUTPUT, AC_AMPCAP_MUTE))
 		nid = pin;
+	else if (check_amp_caps(codec, sel, HDA_OUTPUT, AC_AMPCAP_MUTE))
+		nid = sel;
 	else
 		nid = 0;
 	if (nid) {
