Re: [PATCH] ASoC: meson: aiu-fifo: prevent sleeping when spinlock is held
From: Valerio Setti
Date: Fri Nov 13 2026 - 08:16:07 EST
Hi Martin
On 11/13/26 12:05 AM, Martin Blumenstingl wrote:
On Wed, Nov 11, 2026 at 11:09 AM Valerio Setti <vsetti@xxxxxxxxxxxx> wrote:
[...]
@@ -37,8 +38,11 @@ snd_pcm_uframes_t aiu_fifo_pointer(struct snd_soc_component *component,As far as I understand:
struct aiu_fifo *fifo = snd_soc_dai_dma_data_get_playback(dai);
struct snd_pcm_runtime *runtime = substream->runtime;
unsigned int addr;
+ int ret;
- addr = snd_soc_component_read(component, fifo->mem_offset + AIU_MEM_RD);
+ ret = regmap_read(component->regmap, fifo->mem_offset + AIU_MEM_RD, &addr);
+ if (ret < 0)
+ return snd_soc_ret(component->dev, ret, "Failed to read FIFO pointer");
- snd_pcm_uframes_t is "unsigned long"
- snd_soc_ret() returns a (signed) int
Doesn't that lead to a signed to unsigned conversion error (highest
bit set -> large value)?
That's something that made me thinking a bit as well and the reason why I implemented it this way is the following.
'snd_soc_component_read' internally goes into 'soc_component_read_no_lock' and then to 'regmap_read'. If the latter fails then 'return soc_component_ret_reg_rw()' is called and that calls 'return snd_soc_ret()' internally.
So my goal was to keep the same return value in case of errors.
axg-fifo simply discards regmap_read's return value.
That seems odd at first, but knowing that its regmap is MMIO backed
(same as for AIU) means there can't ever be any error.
That's a good point indeed. I will follow this design then.
Thanks for pointing this out.
--
Valerio