[alsa-devel] [PATCH] ALSA: hda - add mic fixup for ALC269VB on Ordissimo EVE2
Anisse Astier
anisse at astier.eu
Thu Jun 6 18:14:58 CEST 2013
On Thu, 06 Jun 2013 11:49:00 +0200, Takashi Iwai <tiwai at suse.de> wrote :
> At Wed, 5 Jun 2013 17:36:43 +0200,
> Anisse Astier wrote:
> >
> > On Wed, 05 Jun 2013 12:26:59 +0200, Takashi Iwai <tiwai at suse.de> wrote :
> >
> > > > I'm on a dead end on this computer, I can't seem to find how the mic jack
> > > > presence works. It's always on(presence detected whatever the status) on NID
> > > > 0x18, the one used for the external mic. I have tried every NID, manually
> > > > enabling pin_sense on each, but only the headphone jack detection works. The
> > > > mic sense is nowhere to be seen.
> > >
> > > I also don't know any other method for Realtek. For IDT codecs, there
> > > are some devices with GPIO unsol events, but Realtek codecs seem to
> > > use only the normal pin detection unsol events.
> > >
> > > So, on your device, GET_PIN_SENSE doesn't return the detection bit
> > > set? You tried setting SET_PIN_SENSE before GET_PIN_SENSE, right?
> > >
> >
> > I did more tests, this time using hda-verb directly instead of
> > hda-analyzer tools. And GET_PIN_SENSE does return the correct value…
> > sometimes. (without the need for SET_PIN_SENSE)
> > It seems the value is correct only if queried once every 10 to 15
> > seconds.
>
> Does this mean that it gives a wrong result (i.e. no detect bit
> although plugged, or vice versa)? Also, is the unsol event issued per
It means it gives detect bit (most of the time) although unplugged.
> jack plug/unplug? If so, is the detection correct just after the
> unsol event?
I don't know yet. From what I observed for now:
- there are multiple events in a row.
- the event is issued for unplugs, everytime. For plugs, it's only
issued sometimes, if we wait long enough.
- when unpluged, we get unsol events every 10 seconds or so, even when
doing nothing.
To gather more information I added some printfs:
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 55108b5..f6b0592 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -271,6 +271,9 @@ unsigned int snd_hda_codec_read(struct hda_codec *codec, hda_nid_t nid,
unsigned int res;
if (codec_exec_verb(codec, cmd, &res))
return -1;
+ if (verb == AC_VERB_GET_PIN_SENSE) {
+ snd_printd("hda_codec: Getting PIN Sense on nid 0x%x: %08x\n", nid, res);
+ }
return res;
}
EXPORT_SYMBOL_HDA(snd_hda_codec_read);
@@ -292,6 +295,9 @@ int snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int direct,
{
unsigned int cmd = make_codec_cmd(codec, nid, direct, verb, parm);
unsigned int res;
+ if (verb == AC_VERB_SET_UNSOLICITED_ENABLE) {
+ snd_printd("hda_codec: Enabling unsolicited on nid 0x%x: %08x\n", nid, parm);
+ }
return codec_exec_verb(codec, cmd,
codec->bus->sync_write ? &res : NULL);
}
@@ -723,7 +729,10 @@ static void process_unsol_events(struct work_struct *work)
continue;
codec = bus->caddr_tbl[caddr & 0x0f];
if (codec && codec->patch_ops.unsol_event)
+ {
+ snd_printd("hda_codec: Unsol event with res 0x%x", res);
codec->patch_ops.unsol_event(codec, res);
+ }
}
}
Here's an annotated log I collected with this patch:
Mic is NID 0x18, and headphones 0x21. Headphones are unplugged the entire
time.
Mic jack is plugged. I unplug it.
[ 444.059100] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 445.063294] ALSA sound/pci/hda/hda_intel.c:948 0000:00:1b.0: azx_get_response timeout, polling the codec once: last cmd=0x020c0000
[ 445.063656] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 445.063739] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 445.064050] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 445.064072] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 445.065180] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 445.083919] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 445.084043] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
10 seconds later, an unsol events while I did nothing
[ 456.097023] ALSA sound/pci/hda/hda_intel.c:948 0000:00:1b.0: azx_get_response timeout, polling the codec once: last cmd=0x020c0000
[ 456.111282] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 456.112267] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 456.112367] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 456.112677] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 456.112700] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 456.113792] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 456.132647] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 456.132722] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
again
[ 466.156558] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 466.157490] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 466.157584] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 466.157873] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 466.157959] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 466.159033] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 466.177922] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 466.178088] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
and again
[ 476.212512] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 477.214751] ALSA sound/pci/hda/hda_intel.c:948 0000:00:1b.0: azx_get_response timeout, polling the codec once: last cmd=0x020c0000
[ 477.215049] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 477.215158] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 477.215519] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 477.215553] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 477.216926] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 477.237333] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 477.237404] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
here I plug the mic
[ 480.215725] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 480.215824] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 480.279747] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 480.279809] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
and unplug it
[ 506.284318] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 506.285313] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 506.285413] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 506.285853] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 506.285888] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 506.286878] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 506.305697] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 506.305779] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
10 seconds later, an automatic unsolicited event
[ 516.308248] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000000
[ 516.309285] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
[ 516.309384] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 516.309779] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x21: 00000081
[ 516.309813] ALSA sound/pci/hda/hda_codec.c:299 hda_codec: Enabling unsolicited on nid 0x18: 00000082
[ 516.310837] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 516.329607] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 516.329682] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
I plug it again
[ 520.674375] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000008
[ 520.674512] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 00000000
[ 520.674665] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x4000008
[ 520.674741] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 80000000
[ 520.695707] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x8000010
[ 520.695791] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x18: 80000000
[ 520.695863] ALSA sound/pci/hda/hda_codec.c:733 hda_codec: Unsol event with res 0x4000010
[ 520.695923] ALSA sound/pci/hda/hda_codec.c:275 hda_codec: Getting PIN Sense on nid 0x21: 00000000
>
> Currently we don't need to issue the real GET_PIN_SENSE at every
> inquiry but only when demanded (e.g. after unsol event, init and
> resume). If the detection works reliably at these moments, it should
> be enough in theory.
I'm not sure that would be enough according to what I'm observing.
Anisse
More information about the Alsa-devel
mailing list