[alsa-devel] Fixing EAPD for STAC9202 on an embedded platform.

Andy Davison andy at dvsn.net
Fri Oct 5 16:36:21 CEST 2018


> On 4 Oct 2018, at 22:09, Takashi Iwai <tiwai at suse.de> wrote:
> 
> On Mon, 01 Oct 2018 02:15:56 +0200,
> Andy Davison wrote:
>> 
>> Hi all,
>> 
>>> On 20 Sep 2018, at 02:31, Andy Davison <andy at dvsn.net> wrote:
>> 
>> [snip]
>> 
>>>>>> Is it really about EAPD, or is it about the jack detection logic or
>>>>>> the incorrect pin config?
>>>>> 
>>>>> That’s a good question.
>>>>> 
>>>>> 
>>>>>> The first item, the missing LO / HP detection rather indicates the pin
>>>>>> config issue.  What is the line out pin and what is the headphone pin?
>>>>> 
>>>>> I’ve managed to grab the codec information from the original, very cut-down, operating system:
>>>>> 
>>>>> https://gist.github.com/andydvsn/47640739d911abc23cc6fc838a59a404#file-codec-0
>>>> 
>>>> I see no patch file.  Did you figure out which pin NID is for the line
>>>> out, which pin NID for headphone, and which for int and ext mics?
>>> 
>>> For output, from the board it looks as though 0x0a (PORTA_L & PORTA_R) and 0x0d (PORTD_L & PORTD_R) are the only output connections. NID 0x0d looks as though it feeds the internal amplifier; I can’t entirely ascertain the purpose of 0x0a. If I mark 0x0a as not connected in hdajackretask, internal speaker muting stops working, though it appears to lead to an unpopulated area of the board.
>>> 
>>> Here is the pinout as best I can make out: https://i.imgur.com/lO8hqc8.png
>>> 
>>> This is the main board (front): https://i.imgur.com/CvYkM7G.jpg
>>> 
>>> This is the main board (rear): https://i.imgur.com/fYJor9s.jpg
>>> 
>>> 
>>>> You can use hdajackretask program to identify and reprogram the pin
>>>> configs.  At least, the pins for I/O with the actual jacks can be
>>>> identified with a jack detection (plugging / unplugging).
>>> 
>>> This patch makes sense from a labelling perspective, but I’m suspicious that separate HP/LO and internal speaker volumes may not be possible, as if 0x0d feeds the internal amplifier, I assume there is no individual level control.
>>> 
>>> https://gist.github.com/andydvsn/16bf774d236fdeaa5de22ab0378643c3
>>> 
>>> As described in the patch, this doesn’t fix the underlying issue of amplified circuit noise through the muted internal speakers. If that could be solved, everything would be working correctly. The kernel 3.18 patch appears to have relied upon 0x07 for this switching, but I’ve had no luck configuring this so far.
>>> 
>>> 
>>>>> Hopefully that output makes sense as to what are the internal speakers and which is the LO / HP jack socket.
>>>>> 
>>>>> 
>>>>>> Does the standard jack detection mechanism work for them individually?
>>>>>> 
>>>>>> Let's start from that.
>>>>> 
>>>>> I’m not sure how I would go about testing that; with no patches, inserting anything into the 3.5mm jack socket doesn’t appear to affect the system at all.
>>>>> 
>>>>> 
>>>>>> The fact that the patch_stac925x() sets own_eapd_ctrl flag means that
>>>>>> there is *no* dynamic EAPD bit flip as done in the generic driver.
>>>>>> That is, it's just kept as set in the initialized state.  If EAPD is a
>>>>>> must for some outputs, it has to be set either statically or
>>>>>> dynamically.  But you can hear something if the auto-mute is off, and
>>>>>> it implies that EAPD doesn't matter, actually.
>>>>> 
>>>>> Ah, okay. That’s interesting - yes, with auto-mute disabled the audio comes through the LO / HP socket just fine. It’s only when the auto-mute is active that there’s the issue with crackling.
>>>> 
>>>> The crackling is often because of some bad routing from analog
>>>> loopback.  See whether the loopback is enabled unnecessarily.
>>> 
>>> There doesn’t appear to be a loopback entry in alsamixer or amixer, so I’m uncertain on how to check for this.
>>> 
>>> Thank you for your help, I really want to get to the bottom of this!
>> 
>> Is there any more information I can be providing that might help out with resolving this issue? I’ve still had no luck in completely shutting down the output to the internal speakers on this device when a line out is connected, though pin detection for muting is working fine. The audio signal gets muted but the circuit noise crackle appears every time.
>> 
>> From the original patch 0x07 would seem to be involved in this switching, though how I get this working is beyond me.
> 
> Sorry, I've been off for conferences and vacation thereafter, so
> haven't checked it at all (and almost forgotten).

No problem! I’ve had no time to look at this recently either. :)

> This might be a repeated text, but, what we need is the (more or less)
> complete routing of your actual I/Os.  Then we can try to enable only
> the required paths and disable the unnecessary paths by issuing
> HD-audio verbs on the fly, and check whether this actually works as
> expected.
> 
> That said, we need a "good-working" example of the whole routings,
> then adjust knobs to achieve this with the auto-parser.

Do you mean the physical connections of the STAC9202 chip on the board?

So far as I can see, 0x0a is handling all of the audio output - HP/LO and the stereo internal speakers - into an amplifier circuit on the board. There’s a connection to what appears to be an unpopulated area from 0x0d which may well be for an DECT circuit that’s not present on this unit. Pin 0x07 has some involvement with the switching off of the internal speakers, as that is what was forced in the original patch for the 3.10 kernel (old patch below).

https://github.com/andydvsn/OpenFrame-Kernel/blob/master/patches/03-stac9202-audio-pin-tweak.patch

The jack detection is working just fine, so my guess is that some sort of trigger on 0x07 is what’s required to shut down the speakers and prevent the crackling.

Thanks again,

     Andy.






More information about the Alsa-devel mailing list