diff options
-rw-r--r-- | sound/pci/hda/patch_via.c | 19 |
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) { |