summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLydia Wang <lydiawang@viatech.com.cn>2011-07-04 17:01:33 +0800
committerTakashi Iwai <tiwai@suse.de>2011-07-04 14:53:25 +0200
commitb89596a160dc63043be3fda8babbca9a935af0aa (patch)
treed667140add3019de2bd02df7dfb84bb45b6f7bef
parentc4394f5b807289c180a486df70c1a9b1f192f1cb (diff)
downloadlinux-3.10-b89596a160dc63043be3fda8babbca9a935af0aa.tar.gz
linux-3.10-b89596a160dc63043be3fda8babbca9a935af0aa.tar.bz2
linux-3.10-b89596a160dc63043be3fda8babbca9a935af0aa.zip
ALSA: hda - Fix invalid multi-channel amplifiers for VT1718S
For VT1718S, the multi-channel path should be like following: DAC 0-->Mixer 9(index 5)-->Mixer 0(index 1)-->Front Pin; DAC 1-->Mixer 1(index 0)-->Surround Pin; DAC 2-->C/LFE Pin; DAC 3-->Mixer 2(index 0)-->Side Pin; But current code built Surround and Side path through index 1 of Mixer 1 and 2. So Adjusting Surround and Side channel amplifier is invalid. This patch fixes the issue. Signed-off-by: Lydia Wang <lydiawang@viatech.com.cn> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/pci/hda/patch_via.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
index 89dd29db97e..7305f4de07e 100644
--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -452,8 +452,9 @@ static void activate_output_path(struct hda_codec *codec, struct nid_path *path,
if (enable && path->multi[i])
snd_hda_codec_write(codec, dst, 0,
AC_VERB_SET_CONNECT_SEL, idx);
- if (get_wcaps_type(get_wcaps(codec, src)) == AC_WID_AUD_OUT &&
- get_wcaps_type(get_wcaps(codec, dst)) == AC_WID_AUD_MIX)
+ if (!force
+ && get_wcaps_type(get_wcaps(codec, src)) == AC_WID_AUD_OUT
+ && get_wcaps_type(get_wcaps(codec, dst)) == AC_WID_AUD_MIX)
continue;
if (have_mute(codec, dst, HDA_INPUT)) {
int val = enable ? AMP_IN_UNMUTE(idx) :
@@ -490,8 +491,8 @@ static void via_auto_init_output(struct hda_codec *codec,
{
struct via_spec *spec = codec->spec;
unsigned int caps;
- hda_nid_t pin, nid;
- int i, idx;
+ hda_nid_t pin, nid, pre_nid;
+ int i, idx, j, num;
if (!path->depth)
return;
@@ -513,12 +514,26 @@ static void via_auto_init_output(struct hda_codec *codec,
return;
for (i = path->depth - 1; i > 0; i--) {
nid = path->path[i];
+ pre_nid = path->path[i - 1];
idx = get_connection_index(codec, nid, spec->aa_mix_nid);
if (idx >= 0) {
- if (have_mute(codec, nid, HDA_INPUT))
+ if (have_mute(codec, nid, HDA_INPUT)) {
snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_AMP_GAIN_MUTE,
AMP_IN_UNMUTE(idx));
+ if (pre_nid == spec->multiout.dac_nids[0]) {
+ num = snd_hda_get_conn_list(codec, nid,
+ NULL);
+ for (j = 0; j < num; j++) {
+ if (j == idx)
+ continue;
+ snd_hda_codec_write(codec,
+ nid, 0,
+ AC_VERB_SET_AMP_GAIN_MUTE,
+ AMP_IN_MUTE(j));
+ }
+ }
+ }
break;
}
}