* [PATCH 0/3] ASoC: fsl_asrc: support the i.MX952 platform
@ 2026-01-28 7:18 Shengjiu Wang
2026-01-28 7:18 ` [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for " Shengjiu Wang
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-28 7:18 UTC (permalink / raw)
To: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
Update dt binding document and update driver to suppot ASRC on i.MX952.
Shengjiu Wang (3):
ASoC: dt-bindings: fsl,imx-asrc: Add support for i.MX952 platform
ASoC: fsl_asrc: Add support for i.MX952 platform
ASoC: fsl_asrc_dma: allocate memory from dma device
.../bindings/sound/fsl,imx-asrc.yaml | 1 +
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_dma.c | 48 ++++++++++++++++---
sound/soc/fsl/fsl_asrc_m2m.c | 29 +++++++----
6 files changed, 121 insertions(+), 15 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for i.MX952 platform
2026-01-28 7:18 [PATCH 0/3] ASoC: fsl_asrc: support the i.MX952 platform Shengjiu Wang
@ 2026-01-28 7:18 ` Shengjiu Wang
2026-01-28 11:46 ` Krzysztof Kozlowski
2026-01-28 7:18 ` [PATCH 2/3] ASoC: fsl_asrc: " Shengjiu Wang
2026-01-28 7:18 ` [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device Shengjiu Wang
2 siblings, 1 reply; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-28 7:18 UTC (permalink / raw)
To: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
Add new compatible string 'fsl,imx952-asrc' for i.MX952 platform
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
---
Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml b/Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml
index c9152bac7421..608defc93c1e 100644
--- a/Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml
+++ b/Documentation/devicetree/bindings/sound/fsl,imx-asrc.yaml
@@ -25,6 +25,7 @@ properties:
- fsl,imx53-asrc
- fsl,imx8qm-asrc
- fsl,imx8qxp-asrc
+ - fsl,imx952-asrc
- items:
- enum:
- fsl,imx6sx-asrc
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform
2026-01-28 7:18 [PATCH 0/3] ASoC: fsl_asrc: support the i.MX952 platform Shengjiu Wang
2026-01-28 7:18 ` [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for " Shengjiu Wang
@ 2026-01-28 7:18 ` Shengjiu Wang
2026-01-29 9:20 ` Daniel Baluta
2026-01-29 17:14 ` Frank Li
2026-01-28 7:18 ` [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device Shengjiu Wang
2 siblings, 2 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-28 7:18 UTC (permalink / raw)
To: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
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 <shengjiu.wang@nxp.com>
---
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(-)
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
index 92fb16f7be45..5a038efed39c 100644
--- a/sound/soc/fsl/fsl_asrc.c
+++ b/sound/soc/fsl/fsl_asrc.c
@@ -106,6 +106,12 @@ static unsigned char clk_map_imx8qxp[2][ASRC_CLK_MAP_LEN] = {
},
};
+static unsigned char clk_map_imx952[ASRC_CLK_MAP_LEN] = {
+ 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0,
+ 0x0, 0x1, 0x2, 0x3, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x4, 0x5, 0x6, 0x8, 0xf, 0xf,
+ 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x7, 0x9, 0xa, 0xb, 0xc, 0xd, 0xf, 0xf, 0xf, 0xf,
+};
+
/*
* According to RM, the divider range is 1 ~ 8,
* prescaler is power of 2 from 1 ~ 128.
@@ -1078,6 +1084,27 @@ static unsigned int fsl_asrc_get_output_fifo_size(struct fsl_asrc_pair *pair)
return val >> ASRFSTi_OUTPUT_FIFO_SHIFT;
}
+static bool fsl_asrc_m2m_output_ready(struct fsl_asrc_pair *pair)
+{
+ struct fsl_asrc *asrc = pair->asrc;
+ enum asrc_pair_index index = pair->index;
+ int retry = 1000;
+ u32 val;
+
+ do {
+ regmap_read(asrc->regmap, REG_ASRFST(index), &val);
+ val &= ASRFSTi_OUTPUT_FIFO_MASK;
+ val = val >> ASRFSTi_OUTPUT_FIFO_SHIFT;
+ } while (val < ASRC_M2M_OUTPUTFIFO_WML && --retry);
+
+ if (!retry) {
+ pair_warn("output is not ready\n");
+ return false;
+ }
+
+ return true;
+}
+
static int fsl_asrc_m2m_prepare(struct fsl_asrc_pair *pair)
{
struct fsl_asrc_pair_priv *pair_priv = pair->private;
@@ -1275,6 +1302,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
asrc_priv->soc = of_device_get_match_data(&pdev->dev);
asrc->use_edma = asrc_priv->soc->use_edma;
+ asrc->start_before_dma = asrc_priv->soc->start_before_dma;
asrc->get_dma_channel = fsl_asrc_get_dma_channel;
asrc->request_pair = fsl_asrc_request_pair;
asrc->release_pair = fsl_asrc_release_pair;
@@ -1289,6 +1317,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
asrc->m2m_get_maxburst = fsl_asrc_m2m_get_maxburst;
asrc->m2m_pair_resume = fsl_asrc_m2m_pair_resume;
asrc->m2m_get_cap = fsl_asrc_m2m_get_cap;
+ asrc->m2m_output_ready = fsl_asrc_m2m_output_ready;
if (of_device_is_compatible(np, "fsl,imx35-asrc")) {
asrc_priv->clk_map[IN] = input_clk_map_imx35;
@@ -1315,6 +1344,9 @@ static int fsl_asrc_probe(struct platform_device *pdev)
asrc_priv->clk_map[IN] = clk_map_imx8qxp[map_idx];
asrc_priv->clk_map[OUT] = clk_map_imx8qxp[map_idx];
}
+ } else if (of_device_is_compatible(np, "fsl,imx952-asrc")) {
+ asrc_priv->clk_map[IN] = clk_map_imx952;
+ asrc_priv->clk_map[OUT] = clk_map_imx952;
}
asrc->channel_avail = 10;
@@ -1553,11 +1585,18 @@ static const struct fsl_asrc_soc_data fsl_asrc_imx8qxp_data = {
.channel_bits = 4,
};
+static const struct fsl_asrc_soc_data fsl_asrc_imx952_data = {
+ .use_edma = true,
+ .channel_bits = 4,
+ .start_before_dma = true,
+};
+
static const struct of_device_id fsl_asrc_ids[] = {
{ .compatible = "fsl,imx35-asrc", .data = &fsl_asrc_imx35_data },
{ .compatible = "fsl,imx53-asrc", .data = &fsl_asrc_imx53_data },
{ .compatible = "fsl,imx8qm-asrc", .data = &fsl_asrc_imx8qm_data },
{ .compatible = "fsl,imx8qxp-asrc", .data = &fsl_asrc_imx8qxp_data },
+ { .compatible = "fsl,imx952-asrc", .data = &fsl_asrc_imx952_data },
{}
};
MODULE_DEVICE_TABLE(of, fsl_asrc_ids);
diff --git a/sound/soc/fsl/fsl_asrc.h b/sound/soc/fsl/fsl_asrc.h
index 1c492eb237f5..1be93148a879 100644
--- a/sound/soc/fsl/fsl_asrc.h
+++ b/sound/soc/fsl/fsl_asrc.h
@@ -324,6 +324,13 @@ enum asrc_inclk {
INCLK_SAI6_TX_BCLK = 0x22,
INCLK_HDMI_RX_SAI0_RX_BCLK = 0x24,
INCLK_HDMI_TX_SAI0_TX_BCLK = 0x25,
+
+ INCLK_SAI2_TX_BCLK = 0x26,
+ INCLK_SAI3_TX_BCLK = 0x27,
+ INCLK_SAI4_RX_BCLK = 0x28,
+ INCLK_SAI4_TX_BCLK = 0x29,
+ INCLK_SAI5_RX_BCLK = 0x2a,
+ INCLK_SAI5_TX_BCLK = 0x2b,
};
enum asrc_outclk {
@@ -364,6 +371,13 @@ enum asrc_outclk {
OUTCLK_SAI6_TX_BCLK = 0x22,
OUTCLK_HDMI_RX_SAI0_RX_BCLK = 0x24,
OUTCLK_HDMI_TX_SAI0_TX_BCLK = 0x25,
+
+ OUTCLK_SAI2_TX_BCLK = 0x26,
+ OUTCLK_SAI3_TX_BCLK = 0x27,
+ OUTCLK_SAI4_RX_BCLK = 0x28,
+ OUTCLK_SAI4_TX_BCLK = 0x29,
+ OUTCLK_SAI5_RX_BCLK = 0x2a,
+ OUTCLK_SAI5_TX_BCLK = 0x2b,
};
#define ASRC_CLK_MAX_NUM 16
@@ -432,10 +446,12 @@ struct dma_block {
*
* @use_edma: using edma as dma device or not
* @channel_bits: width of ASRCNCR register for each pair
+ * @start_before_dma: start asrc before dma
*/
struct fsl_asrc_soc_data {
bool use_edma;
unsigned int channel_bits;
+ bool start_before_dma;
};
/**
diff --git a/sound/soc/fsl/fsl_asrc_common.h b/sound/soc/fsl/fsl_asrc_common.h
index 0cd595b0f629..23ac516565d2 100644
--- a/sound/soc/fsl/fsl_asrc_common.h
+++ b/sound/soc/fsl/fsl_asrc_common.h
@@ -107,6 +107,7 @@ struct fsl_asrc_pair {
* @asrc_rate: default sample rate for ASoC Back-Ends
* @asrc_format: default sample format for ASoC Back-Ends
* @use_edma: edma is used
+ * @start_before_dma: start asrc before dma
* @get_dma_channel: function pointer
* @request_pair: function pointer
* @release_pair: function pointer
@@ -143,6 +144,7 @@ struct fsl_asrc {
int asrc_rate;
snd_pcm_format_t asrc_format;
bool use_edma;
+ bool start_before_dma;
struct dma_chan *(*get_dma_channel)(struct fsl_asrc_pair *pair, bool dir);
int (*request_pair)(int channels, struct fsl_asrc_pair *pair);
@@ -154,6 +156,7 @@ struct fsl_asrc {
int (*m2m_start)(struct fsl_asrc_pair *pair);
int (*m2m_unprepare)(struct fsl_asrc_pair *pair);
int (*m2m_stop)(struct fsl_asrc_pair *pair);
+ bool (*m2m_output_ready)(struct fsl_asrc_pair *pair);
int (*m2m_calc_out_len)(struct fsl_asrc_pair *pair, int input_buffer_length);
int (*m2m_get_maxburst)(u8 dir, struct fsl_asrc_pair *pair);
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);
+ /* 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
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device
2026-01-28 7:18 [PATCH 0/3] ASoC: fsl_asrc: support the i.MX952 platform Shengjiu Wang
2026-01-28 7:18 ` [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for " Shengjiu Wang
2026-01-28 7:18 ` [PATCH 2/3] ASoC: fsl_asrc: " Shengjiu Wang
@ 2026-01-28 7:18 ` Shengjiu Wang
2026-01-29 9:25 ` Daniel Baluta
2026-01-29 17:09 ` Frank Li
2 siblings, 2 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-28 7:18 UTC (permalink / raw)
To: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
As the dma device may support dma-coherent property on the i.MX952,
allocate memory from dma device to make asrc driver to be compatible with
such a case.
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
---
sound/soc/fsl/fsl_asrc_dma.c | 48 ++++++++++++++++++++++++++++++------
1 file changed, 41 insertions(+), 7 deletions(-)
diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c
index 7dacc06b2f02..b8fe242d53db 100644
--- a/sound/soc/fsl/fsl_asrc_dma.c
+++ b/sound/soc/fsl/fsl_asrc_dma.c
@@ -449,18 +449,52 @@ fsl_asrc_dma_pcm_pointer(struct snd_soc_component *component,
static int fsl_asrc_dma_pcm_new(struct snd_soc_component *component,
struct snd_soc_pcm_runtime *rtd)
{
- struct snd_card *card = rtd->card->snd_card;
+ struct device *dev = component->dev;
+ struct fsl_asrc *asrc = dev_get_drvdata(dev);
+ struct fsl_asrc_pair *pair;
struct snd_pcm *pcm = rtd->pcm;
+ struct dma_chan *chan;
int ret;
- ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
- if (ret) {
- dev_err(card->dev, "failed to set DMA mask\n");
- return ret;
+ pair = kzalloc(sizeof(*pair) + asrc->pair_priv_size, GFP_KERNEL);
+ if (!pair)
+ return -ENOMEM;
+
+ pair->asrc = asrc;
+ pair->private = (void *)pair + sizeof(struct fsl_asrc_pair);
+
+ /* Request a dummy pair, which will be released later.
+ * Request pair function needs channel num as input, for this
+ * dummy pair, we just request "1" channel temporarily.
+ */
+ ret = asrc->request_pair(1, pair);
+ if (ret < 0) {
+ dev_err(dev, "failed to request asrc pair\n");
+ goto req_pair_err;
}
- return snd_pcm_set_fixed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
- card->dev, FSL_ASRC_DMABUF_SIZE);
+ /* Request a dummy dma channel, which will be released later. */
+ chan = asrc->get_dma_channel(pair, IN);
+ if (!chan) {
+ dev_err(dev, "failed to get dma channel\n");
+ ret = -EINVAL;
+ goto dma_chan_err;
+ }
+
+ ret = snd_pcm_set_fixed_buffer_all(pcm,
+ SNDRV_DMA_TYPE_DEV,
+ chan->device->dev,
+ FSL_ASRC_DMABUF_SIZE);
+
+ dma_release_channel(chan);
+
+dma_chan_err:
+ asrc->release_pair(pair);
+
+req_pair_err:
+ kfree(pair);
+
+ return ret;
}
struct snd_soc_component_driver fsl_asrc_component = {
--
2.34.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for i.MX952 platform
2026-01-28 7:18 ` [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for " Shengjiu Wang
@ 2026-01-28 11:46 ` Krzysztof Kozlowski
2026-01-29 2:07 ` Shengjiu Wang
0 siblings, 1 reply; 14+ messages in thread
From: Krzysztof Kozlowski @ 2026-01-28 11:46 UTC (permalink / raw)
To: Shengjiu Wang
Cc: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Wed, Jan 28, 2026 at 03:18:51PM +0800, Shengjiu Wang wrote:
> Add new compatible string 'fsl,imx952-asrc' for i.MX952 platform
We see this from the diff. Say something useful.
Also, why power domains are not required?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for i.MX952 platform
2026-01-28 11:46 ` Krzysztof Kozlowski
@ 2026-01-29 2:07 ` Shengjiu Wang
0 siblings, 0 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-29 2:07 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Wed, Jan 28, 2026 at 7:46 PM Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On Wed, Jan 28, 2026 at 03:18:51PM +0800, Shengjiu Wang wrote:
> > Add new compatible string 'fsl,imx952-asrc' for i.MX952 platform
>
> We see this from the diff. Say something useful.
>
> Also, why power domains are not required?
Ok, I will add more info.
There is a power domain on i.MX952 for the wakeupmix system that
ASRC is in. But it is enabled by default, ASRC device don't need to enable
it, so it is optional for i.MX952.
Best regards
Shengjiu Wang
>
>
> Best regards,
> Krzysztof
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform
2026-01-28 7:18 ` [PATCH 2/3] ASoC: fsl_asrc: " Shengjiu Wang
@ 2026-01-29 9:20 ` Daniel Baluta
2026-01-29 9:53 ` Shengjiu Wang
2026-01-29 17:14 ` Frank Li
1 sibling, 1 reply; 14+ messages in thread
From: Daniel Baluta @ 2026-01-29 9:20 UTC (permalink / raw)
To: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, shengjiu.wang, Xiubo.Lee,
nicoleotsuka, perex, tiwai, linuxppc-dev
[-- Attachment #1: Type: text/plain, Size: 936 bytes --]
On 1/28/26 09:18, 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 <shengjiu.wang@nxp.com>
This patch does more than one logical change.
I would split in two patches:
- 1) introduce functionality to start ASRC before DMA.
- 2) add imx952 support including clk_map and introduce fsl_asrc_imx952_data
Thanks,
Daniel.
[-- Attachment #2: Type: text/html, Size: 1551 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device
2026-01-28 7:18 ` [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device Shengjiu Wang
@ 2026-01-29 9:25 ` Daniel Baluta
2026-01-29 9:37 ` Shengjiu Wang
2026-01-29 17:09 ` Frank Li
1 sibling, 1 reply; 14+ messages in thread
From: Daniel Baluta @ 2026-01-29 9:25 UTC (permalink / raw)
To: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, shengjiu.wang, Xiubo.Lee,
nicoleotsuka, perex, tiwai, linuxppc-dev
On 1/28/26 09:18, Shengjiu Wang wrote:
> As the dma device may support dma-coherent property on the i.MX952,
> allocate memory from dma device to make asrc driver to be compatible with
> such a case.
This commit message refers to imx952 but the change in the code apply to all supported platforms
So in not really clear what is the intention of it.
Also, it is not clear why do you allocate a pair only to free it at the end of the function.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device
2026-01-29 9:25 ` Daniel Baluta
@ 2026-01-29 9:37 ` Shengjiu Wang
0 siblings, 0 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-29 9:37 UTC (permalink / raw)
To: Daniel Baluta
Cc: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Thu, Jan 29, 2026 at 5:22 PM Daniel Baluta <daniel.baluta@oss.nxp.com> wrote:
>
> On 1/28/26 09:18, Shengjiu Wang wrote:
> > As the dma device may support dma-coherent property on the i.MX952,
> > allocate memory from dma device to make asrc driver to be compatible with
> > such a case.
>
>
> This commit message refers to imx952 but the change in the code apply to all supported platforms
>
> So in not really clear what is the intention of it.
The dma-coherent property is used to indicate a device is capable of
coherent DMA operations.
Which is applied to the EDMA device on i.MX952, in order to support
such EDMA device,
the memory is need to allocated from DMA device,
The code change is compatible for non dma-coherent and dma-coherent dma devices.
>
> Also, it is not clear why do you allocate a pair only to free it at the end of the function.
As the comment in the code says, it is to get the dma device handler
for memory allocation
. After that, it is freed.
best regards
Shengjiu wang
>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform
2026-01-29 9:20 ` Daniel Baluta
@ 2026-01-29 9:53 ` Shengjiu Wang
0 siblings, 0 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-29 9:53 UTC (permalink / raw)
To: Daniel Baluta
Cc: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Thu, Jan 29, 2026 at 5:17 PM Daniel Baluta <daniel.baluta@oss.nxp.com> wrote:
>
> On 1/28/26 09:18, 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 <shengjiu.wang@nxp.com>
>
> This patch does more than one logical change.
>
> I would split in two patches:
>
> - 1) introduce functionality to start ASRC before DMA.
>
> - 2) add imx952 support including clk_map and introduce fsl_asrc_imx952_data
Ok, will separate them.
best regards
Shengjiu Wang
>
> Thanks,
>
> Daniel.
>
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device
2026-01-28 7:18 ` [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device Shengjiu Wang
2026-01-29 9:25 ` Daniel Baluta
@ 2026-01-29 17:09 ` Frank Li
2026-01-30 1:52 ` Shengjiu Wang
1 sibling, 1 reply; 14+ messages in thread
From: Frank Li @ 2026-01-29 17:09 UTC (permalink / raw)
To: Shengjiu Wang
Cc: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Wed, Jan 28, 2026 at 03:18:53PM +0800, Shengjiu Wang wrote:
> As the dma device may support dma-coherent property on the i.MX952,
> allocate memory from dma device to make asrc driver to be compatible with
> such a case.
>
> Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
> ---
> sound/soc/fsl/fsl_asrc_dma.c | 48 ++++++++++++++++++++++++++++++------
> 1 file changed, 41 insertions(+), 7 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c
> index 7dacc06b2f02..b8fe242d53db 100644
> --- a/sound/soc/fsl/fsl_asrc_dma.c
> +++ b/sound/soc/fsl/fsl_asrc_dma.c
> @@ -449,18 +449,52 @@ fsl_asrc_dma_pcm_pointer(struct snd_soc_component *component,
> static int fsl_asrc_dma_pcm_new(struct snd_soc_component *component,
> struct snd_soc_pcm_runtime *rtd)
> {
> - struct snd_card *card = rtd->card->snd_card;
> + struct device *dev = component->dev;
> + struct fsl_asrc *asrc = dev_get_drvdata(dev);
> + struct fsl_asrc_pair *pair;
> struct snd_pcm *pcm = rtd->pcm;
> + struct dma_chan *chan;
> int ret;
>
> - ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
> - if (ret) {
> - dev_err(card->dev, "failed to set DMA mask\n");
> - return ret;
> + pair = kzalloc(sizeof(*pair) + asrc->pair_priv_size, GFP_KERNEL);
prefer use size_add(sizeof(*pair), asrc->pair_priv_size), which did
overflow check.
> + if (!pair)
> + return -ENOMEM;
> +
> + pair->asrc = asrc;
> + pair->private = (void *)pair + sizeof(struct fsl_asrc_pair);
> +
> + /* Request a dummy pair, which will be released later.
> + * Request pair function needs channel num as input, for this
> + * dummy pair, we just request "1" channel temporarily.
> + */
> + ret = asrc->request_pair(1, pair);
> + if (ret < 0) {
> + dev_err(dev, "failed to request asrc pair\n");
> + goto req_pair_err;
> }
>
> - return snd_pcm_set_fixed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
> - card->dev, FSL_ASRC_DMABUF_SIZE);
> + /* Request a dummy dma channel, which will be released later. */
> + chan = asrc->get_dma_channel(pair, IN);
Is it possible get real dma chan from fsl_asrc?
> + if (!chan) {
> + dev_err(dev, "failed to get dma channel\n");
> + ret = -EINVAL;
> + goto dma_chan_err;
> + }
> +
> + ret = snd_pcm_set_fixed_buffer_all(pcm,
> + SNDRV_DMA_TYPE_DEV,
> + chan->device->dev,
> + FSL_ASRC_DMABUF_SIZE);
Here you assume chan->device->dev never change when it did DMA transfer.
Frank
> +
> + dma_release_channel(chan);
> +
> +dma_chan_err:
> + asrc->release_pair(pair);
> +
> +req_pair_err:
> + kfree(pair);
> +
> + return ret;
> }
>
> struct snd_soc_component_driver fsl_asrc_component = {
> --
> 2.34.1
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform
2026-01-28 7:18 ` [PATCH 2/3] ASoC: fsl_asrc: " Shengjiu Wang
2026-01-29 9:20 ` Daniel Baluta
@ 2026-01-29 17:14 ` Frank Li
2026-01-30 1:44 ` Shengjiu Wang
1 sibling, 1 reply; 14+ messages in thread
From: Frank Li @ 2026-01-29 17:14 UTC (permalink / raw)
To: Shengjiu Wang
Cc: lgirdwood, broonie, robh, krzk+dt, conor+dt, shawnguo, s.hauer,
kernel, festevam, linux-sound, devicetree, imx, linux-arm-kernel,
linux-kernel, shengjiu.wang, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
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 <shengjiu.wang@nxp.com>
> ---
> 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(-)
>
...
> 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
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 2/3] ASoC: fsl_asrc: Add support for i.MX952 platform
2026-01-29 17:14 ` Frank Li
@ 2026-01-30 1:44 ` Shengjiu Wang
0 siblings, 0 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-30 1:44 UTC (permalink / raw)
To: Frank Li
Cc: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Fri, Jan 30, 2026 at 1:14 AM Frank Li <Frank.li@nxp.com> wrote:
>
> 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 <shengjiu.wang@nxp.com>
> > ---
> > 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(-)
> >
> ...
> > 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.
Yes, should work. but I don't want to change the original behaviour
of other SoC.
Best regards
Shengjiu Wang
>
> 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
> >
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device
2026-01-29 17:09 ` Frank Li
@ 2026-01-30 1:52 ` Shengjiu Wang
0 siblings, 0 replies; 14+ messages in thread
From: Shengjiu Wang @ 2026-01-30 1:52 UTC (permalink / raw)
To: Frank Li
Cc: Shengjiu Wang, lgirdwood, broonie, robh, krzk+dt, conor+dt,
shawnguo, s.hauer, kernel, festevam, linux-sound, devicetree, imx,
linux-arm-kernel, linux-kernel, Xiubo.Lee, nicoleotsuka, perex,
tiwai, linuxppc-dev
On Fri, Jan 30, 2026 at 1:09 AM Frank Li <Frank.li@nxp.com> wrote:
>
> On Wed, Jan 28, 2026 at 03:18:53PM +0800, Shengjiu Wang wrote:
> > As the dma device may support dma-coherent property on the i.MX952,
> > allocate memory from dma device to make asrc driver to be compatible with
> > such a case.
> >
> > Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
> > ---
> > sound/soc/fsl/fsl_asrc_dma.c | 48 ++++++++++++++++++++++++++++++------
> > 1 file changed, 41 insertions(+), 7 deletions(-)
> >
> > diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c
> > index 7dacc06b2f02..b8fe242d53db 100644
> > --- a/sound/soc/fsl/fsl_asrc_dma.c
> > +++ b/sound/soc/fsl/fsl_asrc_dma.c
> > @@ -449,18 +449,52 @@ fsl_asrc_dma_pcm_pointer(struct snd_soc_component *component,
> > static int fsl_asrc_dma_pcm_new(struct snd_soc_component *component,
> > struct snd_soc_pcm_runtime *rtd)
> > {
> > - struct snd_card *card = rtd->card->snd_card;
> > + struct device *dev = component->dev;
> > + struct fsl_asrc *asrc = dev_get_drvdata(dev);
> > + struct fsl_asrc_pair *pair;
> > struct snd_pcm *pcm = rtd->pcm;
> > + struct dma_chan *chan;
> > int ret;
> >
> > - ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32));
> > - if (ret) {
> > - dev_err(card->dev, "failed to set DMA mask\n");
> > - return ret;
> > + pair = kzalloc(sizeof(*pair) + asrc->pair_priv_size, GFP_KERNEL);
>
> prefer use size_add(sizeof(*pair), asrc->pair_priv_size), which did
> overflow check.
Ok, will update it.
>
> > + if (!pair)
> > + return -ENOMEM;
> > +
> > + pair->asrc = asrc;
> > + pair->private = (void *)pair + sizeof(struct fsl_asrc_pair);
> > +
> > + /* Request a dummy pair, which will be released later.
> > + * Request pair function needs channel num as input, for this
> > + * dummy pair, we just request "1" channel temporarily.
> > + */
> > + ret = asrc->request_pair(1, pair);
> > + if (ret < 0) {
> > + dev_err(dev, "failed to request asrc pair\n");
> > + goto req_pair_err;
> > }
> >
> > - return snd_pcm_set_fixed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
> > - card->dev, FSL_ASRC_DMABUF_SIZE);
> > + /* Request a dummy dma channel, which will be released later. */
> > + chan = asrc->get_dma_channel(pair, IN);
>
> Is it possible get real dma chan from fsl_asrc?
This is real dma chan, may be I should remove "dummy".
>
> > + if (!chan) {
> > + dev_err(dev, "failed to get dma channel\n");
> > + ret = -EINVAL;
> > + goto dma_chan_err;
> > + }
> > +
> > + ret = snd_pcm_set_fixed_buffer_all(pcm,
> > + SNDRV_DMA_TYPE_DEV,
> > + chan->device->dev,
> > + FSL_ASRC_DMABUF_SIZE);
>
> Here you assume chan->device->dev never change when it did DMA transfer.
Yes, this refers to the generic code in ALSA.
best regards
Shengjiu Wang
>
> Frank
> > +
> > + dma_release_channel(chan);
> > +
> > +dma_chan_err:
> > + asrc->release_pair(pair);
> > +
> > +req_pair_err:
> > + kfree(pair);
> > +
> > + return ret;
> > }
> >
> > struct snd_soc_component_driver fsl_asrc_component = {
> > --
> > 2.34.1
> >
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-01-30 1:52 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-28 7:18 [PATCH 0/3] ASoC: fsl_asrc: support the i.MX952 platform Shengjiu Wang
2026-01-28 7:18 ` [PATCH 1/3] ASoC: dt-bindings: fsl,imx-asrc: Add support for " Shengjiu Wang
2026-01-28 11:46 ` Krzysztof Kozlowski
2026-01-29 2:07 ` Shengjiu Wang
2026-01-28 7:18 ` [PATCH 2/3] ASoC: fsl_asrc: " Shengjiu Wang
2026-01-29 9:20 ` Daniel Baluta
2026-01-29 9:53 ` Shengjiu Wang
2026-01-29 17:14 ` Frank Li
2026-01-30 1:44 ` Shengjiu Wang
2026-01-28 7:18 ` [PATCH 3/3] ASoC: fsl_asrc_dma: allocate memory from dma device Shengjiu Wang
2026-01-29 9:25 ` Daniel Baluta
2026-01-29 9:37 ` Shengjiu Wang
2026-01-29 17:09 ` Frank Li
2026-01-30 1:52 ` Shengjiu Wang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox