[PATCH] ASoC: meson: aiu: fifo-spdif: soft reset the S/PDIF datapath on start/stop
Christian Hewitt
christianshewitt at gmail.com
Mon Jun 29 07:47:44 PDT 2026
> On 29 Jun 2026, at 4:04 pm, Jerome Brunet <jbrunet at baylibre.com> wrote:
>
> On ven. 26 juin 2026 at 22:41, Martin Blumenstingl <martin.blumenstingl at googlemail.com> wrote:
>
>> On Fri, Jun 26, 2026 at 10:04 AM Christian Hewitt
>> <christianshewitt at gmail.com> wrote:
>>>
>>> The I2S FIFO soft-resets its fast domain on start (AIU_RST_SOFT bit 0 +
>>> AIU_I2S_SYNC read in aiu_fifo_i2s_trigger), mirroring the downstream
>>> vendor driver's audio_out_i2s_enable(). The S/PDIF FIFO has no equivalent:
>>> it only toggles the IEC958 DCU, so a stale datapath FIFO can be replayed,
>>> producing the "machine gun noise" buffer underrun - on start when switching
>>> outputs, and on stop when playback ends. The latter is audible on devices
>>> with an always-on S/PDIF-fed DAC (e.g. the ES7144 on the WeTek Play2).
>>>
>>> The vendor driver resets the IEC958 fast domain (AIU_RST_SOFT bit 2) on
>>> both enable and disable (audio_hw_958_enable), and when reconfiguring
>>> (audio_hw_958_reset clears AIU_958_DCU_FF_CTRL then resets). Do the same:
>>> reset before enabling the DCU on start, and after disabling it on stop.
>>>
>>> Signed-off-by: Christian Hewitt <christianshewitt at gmail.com>
>> Reviewed-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
>>
>> This matches the vendor driver, references:
>> - fast-reset SPDIF is triggered on enable and disable: [0]
>> - fast-reset SPDIF is triggered after all of the configuration is
>> written, then DCU_FF_CTRL is enabled: [1]
>
> Take what the vendor driver does with a grain of salt, especially when
> it comes to audio
>
>>
>> [...]
>>> case SNDRV_PCM_TRIGGER_SUSPEND:
>>> case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
>>> case SNDRV_PCM_TRIGGER_STOP:
>>> fifo_spdif_dcu_enable(component, false);
>>> + snd_soc_component_write(component, AIU_RST_SOFT,
>>> + AIU_RST_SOFT_958_FAST);
>> It doesn't seem to make any difference, so just for the record:
>> The vendor driver first triggers AIU_RST_SOFT_958_FAST then disables DCU: [2]
>>
>
> One could even wonder if there is any point in applying a reset when
> everything is stopped, if the enable path will apply this same
> reset before anything else is started again ? Does it really changes
> anything to the reported issue ?
Using disable/reset or reset/disable didn’t make any difference in my
testing, but without any reset playback stop on the WeTek Play2 board
with hardwired DAC always triggers the buffer underrun.
CH.
More information about the linux-arm-kernel
mailing list