Commit 0d69e0dd authored by Shengjiu Wang's avatar Shengjiu Wang Committed by Mark Brown

ASoC: fsl: Add dedicated DMA buffer size for each cpu dai

As the ssi is not the only cpu dai, there are esai, spdif, sai.
and imx_pcm_dma can be used by all of them. Especially ESAI need
a larger DMA buffer size. So Add dedicated DMA buffer for each cpu
dai.
Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@freescale.com>
Acked-by: default avatarNicolin Chen <nicoleotsuka@gmail.com>
Acked-by: default avatarTimur Tabi <timur@tabi.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d770e558
...@@ -839,7 +839,7 @@ static int fsl_esai_probe(struct platform_device *pdev) ...@@ -839,7 +839,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
return ret; return ret;
} }
ret = imx_pcm_dma_init(pdev); ret = imx_pcm_dma_init(pdev, IMX_ESAI_DMABUF_SIZE);
if (ret) if (ret)
dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret); dev_err(&pdev->dev, "failed to init imx pcm dma: %d\n", ret);
......
...@@ -791,7 +791,7 @@ static int fsl_sai_probe(struct platform_device *pdev) ...@@ -791,7 +791,7 @@ static int fsl_sai_probe(struct platform_device *pdev)
return ret; return ret;
if (sai->sai_on_imx) if (sai->sai_on_imx)
return imx_pcm_dma_init(pdev); return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
else else
return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
} }
......
...@@ -1255,7 +1255,7 @@ static int fsl_spdif_probe(struct platform_device *pdev) ...@@ -1255,7 +1255,7 @@ static int fsl_spdif_probe(struct platform_device *pdev)
return ret; return ret;
} }
ret = imx_pcm_dma_init(pdev); ret = imx_pcm_dma_init(pdev, IMX_SPDIF_DMABUF_SIZE);
if (ret) if (ret)
dev_err(&pdev->dev, "imx_pcm_dma_init failed: %d\n", ret); dev_err(&pdev->dev, "imx_pcm_dma_init failed: %d\n", ret);
......
...@@ -1257,7 +1257,7 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev, ...@@ -1257,7 +1257,7 @@ static int fsl_ssi_imx_probe(struct platform_device *pdev,
if (ret) if (ret)
goto error_pcm; goto error_pcm;
} else { } else {
ret = imx_pcm_dma_init(pdev); ret = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
if (ret) if (ret)
goto error_pcm; goto error_pcm;
} }
......
...@@ -40,7 +40,7 @@ static const struct snd_pcm_hardware imx_pcm_hardware = { ...@@ -40,7 +40,7 @@ static const struct snd_pcm_hardware imx_pcm_hardware = {
SNDRV_PCM_INFO_MMAP_VALID | SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_RESUME, SNDRV_PCM_INFO_RESUME,
.buffer_bytes_max = IMX_SSI_DMABUF_SIZE, .buffer_bytes_max = IMX_DEFAULT_DMABUF_SIZE,
.period_bytes_min = 128, .period_bytes_min = 128,
.period_bytes_max = 65535, /* Limited by SDMA engine */ .period_bytes_max = 65535, /* Limited by SDMA engine */
.periods_min = 2, .periods_min = 2,
...@@ -52,13 +52,30 @@ static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = { ...@@ -52,13 +52,30 @@ static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = {
.pcm_hardware = &imx_pcm_hardware, .pcm_hardware = &imx_pcm_hardware,
.prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config,
.compat_filter_fn = filter, .compat_filter_fn = filter,
.prealloc_buffer_size = IMX_SSI_DMABUF_SIZE, .prealloc_buffer_size = IMX_DEFAULT_DMABUF_SIZE,
}; };
int imx_pcm_dma_init(struct platform_device *pdev) int imx_pcm_dma_init(struct platform_device *pdev, size_t size)
{ {
struct snd_dmaengine_pcm_config *config;
struct snd_pcm_hardware *pcm_hardware;
config = devm_kzalloc(&pdev->dev,
sizeof(struct snd_dmaengine_pcm_config), GFP_KERNEL);
*config = imx_dmaengine_pcm_config;
if (size)
config->prealloc_buffer_size = size;
pcm_hardware = devm_kzalloc(&pdev->dev,
sizeof(struct snd_pcm_hardware), GFP_KERNEL);
*pcm_hardware = imx_pcm_hardware;
if (size)
pcm_hardware->buffer_bytes_max = size;
config->pcm_hardware = pcm_hardware;
return devm_snd_dmaengine_pcm_register(&pdev->dev, return devm_snd_dmaengine_pcm_register(&pdev->dev,
&imx_dmaengine_pcm_config, config,
SND_DMAENGINE_PCM_FLAG_COMPAT); SND_DMAENGINE_PCM_FLAG_COMPAT);
} }
EXPORT_SYMBOL_GPL(imx_pcm_dma_init); EXPORT_SYMBOL_GPL(imx_pcm_dma_init);
......
...@@ -20,6 +20,11 @@ ...@@ -20,6 +20,11 @@
*/ */
#define IMX_SSI_DMABUF_SIZE (64 * 1024) #define IMX_SSI_DMABUF_SIZE (64 * 1024)
#define IMX_DEFAULT_DMABUF_SIZE (64 * 1024)
#define IMX_SAI_DMABUF_SIZE (64 * 1024)
#define IMX_SPDIF_DMABUF_SIZE (64 * 1024)
#define IMX_ESAI_DMABUF_SIZE (256 * 1024)
static inline void static inline void
imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data, imx_pcm_dma_params_init_data(struct imx_dma_data *dma_data,
int dma, enum sdma_peripheral_type peripheral_type) int dma, enum sdma_peripheral_type peripheral_type)
...@@ -39,9 +44,9 @@ struct imx_pcm_fiq_params { ...@@ -39,9 +44,9 @@ struct imx_pcm_fiq_params {
}; };
#if IS_ENABLED(CONFIG_SND_SOC_IMX_PCM_DMA) #if IS_ENABLED(CONFIG_SND_SOC_IMX_PCM_DMA)
int imx_pcm_dma_init(struct platform_device *pdev); int imx_pcm_dma_init(struct platform_device *pdev, size_t size);
#else #else
static inline int imx_pcm_dma_init(struct platform_device *pdev) static inline int imx_pcm_dma_init(struct platform_device *pdev, size_t size)
{ {
return -ENODEV; return -ENODEV;
} }
......
...@@ -603,7 +603,7 @@ static int imx_ssi_probe(struct platform_device *pdev) ...@@ -603,7 +603,7 @@ static int imx_ssi_probe(struct platform_device *pdev)
ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx; ssi->fiq_params.dma_params_tx = &ssi->dma_params_tx;
ssi->fiq_init = imx_pcm_fiq_init(pdev, &ssi->fiq_params); ssi->fiq_init = imx_pcm_fiq_init(pdev, &ssi->fiq_params);
ssi->dma_init = imx_pcm_dma_init(pdev); ssi->dma_init = imx_pcm_dma_init(pdev, IMX_SSI_DMABUF_SIZE);
if (ssi->fiq_init && ssi->dma_init) { if (ssi->fiq_init && ssi->dma_init) {
ret = ssi->fiq_init; ret = ssi->fiq_init;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment