[alsa-devel] snd jack report and unsolicited event ad1988

Takashi Iwai tiwai at suse.de
Thu May 5 11:50:45 CEST 2011


At Thu, 5 May 2011 15:05:41 +0800,
Raymond Yau wrote:
> 
> 2011/4/28 Takashi Iwai <tiwai at suse.de>
> 
> > At Thu, 28 Apr 2011 21:10:23 +0800,
> > Raymond Yau wrote:
> > >
> >
> > > Still unable to enable the unsolicited event for jack sense even if I add
> > > the unsol_event and verb for the audio jacks at rear panel since I don't
> > > have the HDA compilant front audio panel
> > >
> > > SoundMax automatically popup immediately when jack is plug into the rear
> > > panel at other OS, so the hardware is capable of jack sense at rear panel
> > >
> > > AFG Function Id: 0x1 (unsol 0)
> > >
> > > Is there any trick to enable/debug the unsolicited event ?
> > > seem unsol event is disabled in the HDA controller
> >
> > No, there shouldn't be big differences.  Otherwise it won't work on
> > any other machines.
> >
> > There might be other way to trigger the jack detection, e.g. GPIO
> > unsolicited event, depending on the codec chip.  I don't remember how
> > is AD1988, though...
> >
> >
> > OK, after a few experiments, unsolicited events seem to work for those rear
> panel jacks
> 
> 1) for the unsolicited event , different tags have to be assigned for six
> different jacks
> 
> This mean that the driver need to define FRONT_MIC_EVENT, REAR_MIC_EVENT,
> LINE_IN_EVENT in addition to HP_EVENT

Does it mean that the codec can't accept the same id tag for multiple
pins?

> Can  snd_jack_report used to report the mic event of two pink jacks (front
> panel and rear panel) of the desktop to the user space program?

I assumed so, but someone needs to confirm.
Assigning different tags is easy and safe, so even if it worked, we
can go forward for individual tags.

> 2) when the jack is plug in or out. , snd_hda_jack_detect() work with
> no_trigger_sense=1 to detect jack presence but the driver get several
> unsolicited responses with no_trigger_sense=0
> 
> 3) snd_hda_pin_sense() need trigger sense to get the Impedance
> it usually get the value of 0x7FFF,FFFF and need to wait for a while to get
> the sense measurement
> 
> (all1’s) indicates that a valid sense reading is not available, or the sense
> measurement is busy if it has been recently triggered

So, adding some delay like below makes it working?


thanks,

Takashi

---
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index c63f376..211d136 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -1593,9 +1593,12 @@ u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid)
 
 	if (!codec->no_trigger_sense) {
 		pincap = snd_hda_query_pin_caps(codec, nid);
-		if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
+		if (pincap & AC_PINCAP_TRIG_REQ) { /* need trigger? */
 			snd_hda_codec_read(codec, nid, 0,
 					AC_VERB_SET_PIN_SENSE, 0);
+			if (codec->trigger_delay > 0)
+				mdelay(codec->trigger_delay);
+		}
 	}
 	return snd_hda_codec_read(codec, nid, 0,
 				  AC_VERB_GET_PIN_SENSE, 0);
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index 59c9730..a46aae4 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -865,6 +865,8 @@ struct hda_codec {
 	unsigned long power_jiffies;
 #endif
 
+	int trigger_delay;	/* msecs delay after trigger-sense */
+
 	/* codec-specific additional proc output */
 	void (*proc_widget_hook)(struct snd_info_buffer *buffer,
 				 struct hda_codec *codec, hda_nid_t nid);
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 981c631..3818b87 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -3317,7 +3317,8 @@ static int patch_ad1988(struct hda_codec *codec)
 #endif
 	spec->vmaster_nid = 0x04;
 
-	codec->no_trigger_sense = 1;
+	/* codec->no_trigger_sense = 1; */
+	codec->trigger_delay = 5;
 	codec->no_sticky_stream = 1;
 
 	return 0;


More information about the Alsa-devel mailing list