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