diff options
author | Lydia Wang <lydiawang@viatech.com.cn> | 2011-07-04 17:01:33 +0800 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-07-04 14:53:25 +0200 |
commit | b89596a160dc63043be3fda8babbca9a935af0aa (patch) | |
tree | d667140add3019de2bd02df7dfb84bb45b6f7bef | |
parent | c4394f5b807289c180a486df70c1a9b1f192f1cb (diff) | |
download | linux-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.c | 25 |
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; } } |