[alsa-devel] [PATCH 012/112] ALSA: hda/realtek - Fix initialization of input amps in output paths
Takashi Iwai
tiwai at suse.de
Tue Jan 8 12:38:05 CET 2013
When initializing the output paths, we assumed the input amps have
almost two inputs blindly. It's not only generic but even incorrect
for some codecs like ALC268 & co. Also, the same assumption (two
sources) exists for the bind input-amp controls.
This patch changes the codes in these places to handle the input
connections in a more generic way.
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
sound/pci/hda/patch_realtek.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 1abcd8e..981d505 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -3621,9 +3621,10 @@ static int alc_auto_add_sw_ctl(struct hda_codec *codec,
val = amp_val_replace_channels(val, chs);
if (get_amp_direction_(val) == HDA_INPUT) {
hda_nid_t nid = get_amp_nid_(val);
- if (snd_hda_get_num_conns(codec, nid) > 1) {
+ int nums = snd_hda_get_num_conns(codec, nid);
+ if (nums > 1) {
type = ALC_CTL_BIND_MUTE;
- val |= 2 << 19; /* FIXME: fixed two widgets, so far */
+ val |= nums << 19;
}
}
return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
@@ -3909,6 +3910,7 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
hda_nid_t pin, int pin_type,
hda_nid_t dac, bool force)
{
+ struct alc_spec *spec = codec->spec;
int i, val;
struct nid_path *path;
@@ -3928,13 +3930,19 @@ static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
(get_wcaps(codec, nid) & AC_WCAP_IN_AMP) &&
(force || !is_out_ctl_present(codec, path, nid,
HDA_INPUT))) {
+ hda_nid_t conn[16];
+ int n, nums;
+ nums = snd_hda_get_connections(codec, nid, conn,
+ ARRAY_SIZE(conn));
val = get_default_amp_val(codec, nid, HDA_INPUT);
- snd_hda_codec_write(codec, nid, 0,
- AC_VERB_SET_AMP_GAIN_MUTE,
- AMP_IN_UNMUTE(0) | val);
- snd_hda_codec_write(codec, nid, 0,
+ for (n = 0; n < nums; n++) {
+ if (n != path->idx[i] &&
+ conn[n] != spec->mixer_nid)
+ continue;
+ snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_AMP_GAIN_MUTE,
- AMP_IN_UNMUTE(1) | val);
+ AMP_IN_UNMUTE(n) | val);
+ }
}
if ((get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) &&
(force || !is_out_ctl_present(codec, path, nid,
--
1.8.0.1
More information about the Alsa-devel
mailing list