Thread (12 messages) 12 messages, 5 authors, 2026-01-30

Re: [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform

From: Frank Li <Frank.li@nxp.com>
Date: 2026-01-29 17:14:19
Also in: imx, linux-arm-kernel, linux-sound, linuxppc-dev, lkml

On Wed, Jan 28, 2026 at 03:18:52PM +0800, Shengjiu Wang wrote:
Add a compatible string and clock mapping table to support ASRC on the
i.MX952 platform.

There is a limitation on i.MX952 that dma request is not cleared at the
end of conversion with dma slave mode. Which causes sample is dropped
from the input fifo on the second time if dma is triggered before the
client device and EDMA may copy wrong data from output fifo as the output
fifo is not ready in the beginning.

So need to trigger asrc before dma on i.MX952, and add delay to wait
output data is generated then start the EDMA for output, otherwise the
m2m function has noise issues.

Signed-off-by: Shengjiu Wang <redacted>
---
 sound/soc/fsl/fsl_asrc.c        | 39 +++++++++++++++++++++++++++++++++
 sound/soc/fsl/fsl_asrc.h        | 16 ++++++++++++++
 sound/soc/fsl/fsl_asrc_common.h |  3 +++
 sound/soc/fsl/fsl_asrc_m2m.c    | 29 +++++++++++++++++-------
 4 files changed, 79 insertions(+), 8 deletions(-)
...
quoted hunk ↗ jump to hunk
diff --git a/sound/soc/fsl/fsl_asrc_m2m.c b/sound/soc/fsl/fsl_asrc_m2m.c
index f46881f71e43..296e13a16490 100644
--- a/sound/soc/fsl/fsl_asrc_m2m.c
+++ b/sound/soc/fsl/fsl_asrc_m2m.c
@@ -253,15 +253,28 @@ static int asrc_m2m_device_run(struct fsl_asrc_pair *pair, struct snd_compr_task
 	reinit_completion(&pair->complete[IN]);
 	reinit_completion(&pair->complete[OUT]);

-	/* Submit DMA request */
-	dmaengine_submit(pair->desc[IN]);
-	dma_async_issue_pending(pair->desc[IN]->chan);
-	if (out_dma_len > 0) {
-		dmaengine_submit(pair->desc[OUT]);
-		dma_async_issue_pending(pair->desc[OUT]->chan);
-	}
+	if (asrc->start_before_dma) {
+		asrc->m2m_start(pair);
Does other Soc also work if ASRC start before DMA enable? Suppose most like
work. Then needn't start_before_dma.

Frank
+		/* Submit DMA request */
+		dmaengine_submit(pair->desc[IN]);
+		dma_async_issue_pending(pair->desc[IN]->chan);
+		if (out_dma_len > 0) {
+			if (asrc->m2m_output_ready)
+				asrc->m2m_output_ready(pair);
+			dmaengine_submit(pair->desc[OUT]);
+			dma_async_issue_pending(pair->desc[OUT]->chan);
+		}
+	} else {
+		/* Submit DMA request */
+		dmaengine_submit(pair->desc[IN]);
+		dma_async_issue_pending(pair->desc[IN]->chan);
+		if (out_dma_len > 0) {
+			dmaengine_submit(pair->desc[OUT]);
+			dma_async_issue_pending(pair->desc[OUT]->chan);
+		}

-	asrc->m2m_start(pair);
+		asrc->m2m_start(pair);
+	}

 	if (!wait_for_completion_interruptible_timeout(&pair->complete[IN], 10 * HZ)) {
 		dev_err(dev, "out DMA task timeout\n");
--
2.34.1
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help