From 4f574b7b1a1cc8aac617e938459e8f03a641e678 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Mon, 27 Jun 2011 16:17:07 +0200
Subject: [PATCH] ALSA: hda - More volume-init fixes for ALC267 codec

More similar fixes like previous commits: handle the exceptional case
like ALC267 where no volume amp is found in ADC widget but in the
capsrc widget instead.

Also minor checks for avoiding possible erros: no connection-select
when the pin has a single selection, and add beep verbs only when the
0x1d is used for beep.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/pci/hda/patch_realtek.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 0fefc656c6e0..cf383ede281d 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -11078,9 +11078,16 @@ static void alc882_auto_init_input_src(struct hda_codec *codec)
 		unsigned int wid_type;
 
 		/* mute ADC */
-		snd_hda_codec_write(codec, spec->adc_nids[c], 0,
+		if (query_amp_caps(codec, spec->adc_nids[c], HDA_INPUT) &
+		    AC_AMPCAP_MUTE)
+			snd_hda_codec_write(codec, spec->adc_nids[c], 0,
 				    AC_VERB_SET_AMP_GAIN_MUTE,
 				    AMP_IN_MUTE(0));
+		else if (query_amp_caps(codec, nid, HDA_OUTPUT) &
+			 AC_AMPCAP_MUTE)
+			snd_hda_codec_write(codec, nid, 0,
+				    AC_VERB_SET_AMP_GAIN_MUTE,
+				    AMP_OUT_MUTE);
 
 		conns = snd_hda_get_conn_list(codec, nid, NULL);
 		if (conns <= 0)
@@ -13580,6 +13587,8 @@ static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
 	int idx;
 
 	alc_set_pin_output(codec, nid, pin_type);
+	if (snd_hda_get_conn_list(codec, nid, NULL) <= 1)
+		return;
 	if (nid == 0x14 || nid == 0x16)
 		idx = 0;
 	else
@@ -13721,10 +13730,11 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
 	if (spec->kctls.list)
 		add_mixer(spec, spec->kctls.list);
 
-	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
+	if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) {
 		add_mixer(spec, alc268_beep_mixer);
+		add_verb(spec, alc268_beep_init_verbs);
+	}
 
-	add_verb(spec, alc268_beep_init_verbs);
 	spec->num_mux_defs = 2;
 	spec->input_mux = &spec->private_imux[0];
 
-- 
2.34.1