[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