At Thu, 5 May 2011 15:05:41 +0800, Raymond Yau wrote:
2011/4/28 Takashi Iwai tiwai@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
- 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.
- 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
- 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;