[alsa-devel] Digital-Out (Toslink) on HDA-Intal (AD1986A)?

Takashi Iwai tiwai at suse.de
Fri Jan 25 17:25:32 CET 2008


At Fri, 25 Jan 2008 16:44:52 +0100,
Martin Egge wrote:
> 
> Hi,
> 
> Am Freitag, 25. Januar 2008 schrieb Takashi Iwai:
> > OK, then please attach the content of /proc/asound/card0/codec#* and
> > the generated file via "alsactl -f somefile store".
> 
> Done

Thanks.  I couldn't find any missing setup for the SPDIF.
I thought the similar setup worked well on other machines with
AD1986A, but I'm not sure whether it's still OK with the recent
version...

Anyay, the patch below is to change the mic input behavior.
With the patch, the mic input is toggled automatically via jack plug.
It assumes that you didn't change the model preset
(i.e. model=laptop-eapd).

Give it a try.


Takashi

---

diff -r b0d97ac73e0f pci/hda/patch_analog.c
--- a/pci/hda/patch_analog.c	Fri Jan 25 15:24:50 2008 +0100
+++ b/pci/hda/patch_analog.c	Fri Jan 25 17:23:23 2008 +0100
@@ -609,13 +609,19 @@ static struct hda_input_mux ad1986a_lapt
 	},
 };
 
+static struct hda_input_mux ad1986a_automic_capture_source = {
+	.num_items = 2,
+	.items = {
+		{ "Mic", 0x0 },
+		{ "Mix", 0x5 },
+	},
+};
+
 static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
 	HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
 	HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
 	HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
 	HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
-	HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),
-	HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),
 	HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
 	HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
 	HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
@@ -638,6 +644,32 @@ static struct snd_kcontrol_new ad1986a_l
 	},
 	{ } /* end */
 };
+
+/* re-connect the mic boost input according to the jack sensing */
+static void ad1986a_automic(struct hda_codec *codec)
+{
+	unsigned int present;
+	present = snd_hda_codec_read(codec, 0x1f, 0, AC_VERB_GET_PIN_SENSE, 0);
+	snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_CONNECT_SEL,
+			    (present & AC_PINSENSE_PRESENCE) ? 0 : 1);
+}
+
+#define AD1986A_MIC_EVENT		0x36
+
+static void ad1986a_automic_unsol_event(struct hda_codec *codec,
+					    unsigned int res)
+{
+	if ((res >> 26) != AD1986A_MIC_EVENT)
+		return;
+	ad1986a_automic(codec);
+}
+
+static int ad1986a_automic_init(struct hda_codec *codec)
+{
+	ad198x_init(codec);
+	ad1986a_automic(codec);
+	return 0;
+}
 
 /* laptop-automute - 2ch only */
 
@@ -842,6 +874,12 @@ static struct hda_verb ad1986a_eapd_init
 	{}
 };
 
+static struct hda_verb ad1986a_automic_verbs[] = {
+	{0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+	{0x1f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1986A_MIC_EVENT},
+	{}
+};
+
 /* Ultra initialization */
 static struct hda_verb ad1986a_ultra_init[] = {
 	/* eapd initialization */
@@ -977,13 +1015,16 @@ static int patch_ad1986a(struct hda_code
 		break;
 	case AD1986A_LAPTOP_EAPD:
 		spec->mixers[0] = ad1986a_laptop_eapd_mixers;
-		spec->num_init_verbs = 2;
+		spec->num_init_verbs = 3;
 		spec->init_verbs[1] = ad1986a_eapd_init_verbs;
+		spec->init_verbs[2] = ad1986a_automic_verbs;
 		spec->multiout.max_channels = 2;
 		spec->multiout.num_dacs = 1;
 		spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
 		spec->multiout.dig_out_nid = 0;
-		spec->input_mux = &ad1986a_laptop_eapd_capture_source;
+		spec->input_mux = &ad1986a_automic_capture_source;
+		codec->patch_ops.unsol_event = ad1986a_automic_unsol_event;
+		codec->patch_ops.init = ad1986a_automic_init;
 		break;
 	case AD1986A_LAPTOP_AUTOMUTE:
 		spec->mixers[0] = ad1986a_laptop_automute_mixers;


More information about the Alsa-devel mailing list