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

Andy Davison andy at dvsn.net
Tue Sep 11 02:24:11 CEST 2018


> On 10 Sep 2018, at 21:29, Takashi Iwai <tiwai at suse.de> wrote:
> 
> On Mon, 10 Sep 2018 22:01:28 +0200,
> Andy Davison wrote:
>> 
>> 
>>> On 10 Sep 2018, at 16:31, Takashi Iwai wrote:
>>> 
>>> On Mon, 10 Sep 2018 11:51:52 +0200,
>>> Andy Davison wrote:
>>>> 
>>>> Hi everyone,
>>>> 
>>>> I’m hoping that somebody here might be able to spot where I’m going wrong; I'm working with a picture-frame-like device manufactured by the late OpenPeak Inc. known as the OpenFrame (or O2 Joggler in the UK). It has an internal speaker and a 3.5mm line out socket; none of the other connections to its STAC9202 codec chip are exposed to the end user. I've been porting Ubuntu Bionic to the device and everything is done, except for the audio driver.
>>>> 
>>>> Back in kernel 3.18 it was possible to use the following kernel patch and userland ALSA patch to have these two outputs work correctly, with the insertion of a plug into the line out properly muting the internal speaker.
>>>> 
>>>> https://github.com/andydvsn/OpenFrame-Kernel/blob/master/patches/03-stac9202-audio-pin-tweak.patch
>>>> https://github.com/andydvsn/OpenFrame-Ubuntu/blob/master/overlay-trusty/lib/firmware/of1-stac9202.patch
>>>> 
>>>> In kernel 4.14 the same trick no longer works, so I've rewritten the patch to more properly add support for this variant of STAC9202 to ALSA. It now looks like this:
>>>> 
>>>> https://gist.github.com/andydvsn/7bffa8de0ed691b14508485d75501ffc
>>>> 
>>>> This seems to line up the pin configurations appropriately, but when a plug is inserted to the line out, although the audio to the internal speaker is muted, the speaker emits a crackling sound whenever the device is processing. It seems that it is not being properly powered down and is amplifying general circuit noise. Disconnecting the plug returns sound to the internal speaker and the crackling ceases. This is reliable across multiple devices.
>>> 
>>> The patch looks changing too much than needed.
>>> 
>>> What exactly do you need to make things working at first?
>>> patch_stac925x() sets own_eapd_ctl, but only from some historical
>>> reason.  You can unset this flag in the quirk as well.
>> 
>> Thank you for getting back to me. I have recompiled 4.14.69 with no audio patches and the result is as follows:
>> 
>> 
>> - Switching: Presence or absence of line out / headphones is ignored.
>> 
>> - Auto-Mute Enabled (Default): Crackling is present on the right channel only of line out / headphones. No audio on line out / headphones. Speaker plays audio.
>> 
>> - Auto-Mute Disabled: Audio plays properly, but from both the speaker and line out / headphones simultaneously.
>> 
>> 
>> So it would seem the action of EAPD is reversed, muting the line out / headphones when they’re attached and not the internal speaker. The crackling remains, but strangely just in that right channel of line out / headphones.
> 
> 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

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.

Please let me know if there’s any other information that would be useful to figuring this out.



> 
>> 
>> 
>> The alsa-info output is:
>> 
>> https://gist.github.com/andydvsn/ccf55e6f7961dd405fc39d41a6ce9ef6#file-4-14-69op1-nopatches
>> 
>> 
>> I then tried simply setting own_eapd_ctl = 0. It made no functional difference that I could tell, but alsa-info became this:
>> 
>> https://gist.github.com/andydvsn/ccf55e6f7961dd405fc39d41a6ce9ef6#file-4-14-69op1-own_eapd_ctl0
>> 
>> 
>> As you can probably tell, I’m in the dark with what to do next. I would greatly appreciate suggestions.
>> 
>> 
>>> 
>>>> Here is the alsa-info output from both the crackling kernel 4.14 and the working-just-fine kernel 3.18.
>>>> 
>>>> https://gist.github.com/andydvsn/ccf55e6f7961dd405fc39d41a6ce9ef6
>>>> 
>>>> I don't have sufficient knowledge of ALSA drivers and patches and have been working purely from the configurations used by others over the years, so I would really appreciate somebody looking at the alsa-info output and the new patch to determine where I should go from here. I believe this is all to do with EAPD control, but what options I have for controlling that aren't known to me right now.
>>>> 
>>>> Ideally, I want to end up with the audio muting and switching correctly when the jack is inserted. A bonus would be to lose the unused (or at least inaccessible) audio input and output options in alsamixer and gain individual control of the internal speaker and line out levels (which appear to be paired together at the moment).



More information about the Alsa-devel mailing list