From: Takashi Iwai Date: Mon, 4 Jul 2011 15:35:51 +0000 (+0200) Subject: ALSA: hda - Don't add aa-mix for VIA surrounds X-Git-Tag: v3.1-rc2~4^2~47^2~48 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bac4b92cf7a444c0af8dd7b269c8791595c44052;p=platform%2Fkernel%2Flinux-3.10.git ALSA: hda - Don't add aa-mix for VIA surrounds Since we now route the front DAC via aa-mix widget, adding the aa-mix to surrounds will result in a mix-up of both front and surround PCM signals. For avoiding this, the aa-mix routes have to be disabled for surround paths. Signed-off-by: Takashi Iwai --- diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 8d46a0f..42d5a91 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -489,7 +489,7 @@ static void init_output_pin(struct hda_codec *codec, hda_nid_t pin, static void via_auto_init_output(struct hda_codec *codec, struct nid_path *path, int pin_type, - bool force) + bool with_aa_mix, bool force) { struct via_spec *spec = codec->spec; unsigned int caps; @@ -520,9 +520,12 @@ static void via_auto_init_output(struct hda_codec *codec, idx = get_connection_index(codec, nid, spec->aa_mix_nid); if (idx >= 0) { if (have_mute(codec, nid, HDA_INPUT)) { + unsigned int mute = with_aa_mix ? + AMP_IN_UNMUTE(idx) : AMP_IN_MUTE(idx); snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, - AMP_IN_UNMUTE(idx)); + mute); + /* exclusively via aa-mix for front */ if (pre_nid == spec->multiout.dac_nids[0]) { num = snd_hda_get_conn_list(codec, nid, NULL); @@ -547,7 +550,9 @@ static void via_auto_init_multi_out(struct hda_codec *codec) int i; for (i = 0; i < spec->autocfg.line_outs + spec->smart51_nums; i++) - via_auto_init_output(codec, &spec->out_path[i], PIN_OUT, true); + /* enable aa-mute only for the front channel */ + via_auto_init_output(codec, &spec->out_path[i], PIN_OUT, + i == 0, true); } static void via_auto_init_hp_out(struct hda_codec *codec) @@ -555,15 +560,18 @@ static void via_auto_init_hp_out(struct hda_codec *codec) struct via_spec *spec = codec->spec; if (!spec->hp_dac_nid) { - via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true); + via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, + true, true); return; } if (spec->hp_independent_mode) { activate_output_path(codec, &spec->hp_dep_path, false, false); - via_auto_init_output(codec, &spec->hp_path, PIN_HP, true); + via_auto_init_output(codec, &spec->hp_path, PIN_HP, + true, true); } else { activate_output_path(codec, &spec->hp_path, false, false); - via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, true); + via_auto_init_output(codec, &spec->hp_dep_path, PIN_HP, + true, true); } } @@ -572,7 +580,8 @@ static void via_auto_init_speaker_out(struct hda_codec *codec) struct via_spec *spec = codec->spec; if (spec->autocfg.speaker_outs) - via_auto_init_output(codec, &spec->speaker_path, PIN_OUT, true); + via_auto_init_output(codec, &spec->speaker_path, PIN_OUT, + true, true); } static bool is_smart51_pins(struct hda_codec *codec, hda_nid_t pin);