summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-06-21 14:22:14 +0200
committerTakashi Iwai <tiwai@suse.de>2011-06-21 14:22:14 +0200
commita934d5a983528543850c90b29bedbdfd71f7097b (patch)
tree8592a7a7318a6aed9226607e81d444355a2cfc9b
parent1e11cae143e4c0a4fc77fe532e18c550d63ab02d (diff)
ALSA: hda - Fix surround-volume parsing for VT1708B codecs
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>
-rw-r--r--sound/pci/hda/patch_via.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
index b67a5768a9d..5b907b35695 100644
--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -407,7 +407,10 @@ static int __get_connection_index(struct hda_codec *codec, hda_nid_t mux,
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_codec *codec, const char *pfx,
{
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_codec *codec, const char *pfx,
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) {