ASoC: fsl_sai: Fix noise when using EDMA
EDMA requires the period size to be multiple of maxburst. Otherwise the remaining bytes are not transferred and thus noise is produced. We can handle this issue by adding a constraint on SNDRV_PCM_HW_PARAM_PERIOD_SIZE to be multiple of tx/rx maxburst value. Signed-off-by: Mihai Serban <mihai.serban@nxp.com> Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> Acked-by: Nicolin Chen <nicoleotsuka@gmail.com> Link: https://lore.kernel.org/r/20190913192807.8423-2-daniel.baluta@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
fca11622d6
commit
e75f4940e8
@ -628,6 +628,16 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
|
||||
FSL_SAI_CR3_TRCE_MASK,
|
||||
FSL_SAI_CR3_TRCE);
|
||||
|
||||
/*
|
||||
* EDMA controller needs period size to be a multiple of
|
||||
* tx/rx maxburst
|
||||
*/
|
||||
if (sai->soc_data->use_edma)
|
||||
snd_pcm_hw_constraint_step(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
tx ? sai->dma_params_tx.maxburst :
|
||||
sai->dma_params_rx.maxburst);
|
||||
|
||||
ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE, &fsl_sai_rate_constraints);
|
||||
|
||||
@ -1026,30 +1036,35 @@ static int fsl_sai_remove(struct platform_device *pdev)
|
||||
|
||||
static const struct fsl_sai_soc_data fsl_sai_vf610_data = {
|
||||
.use_imx_pcm = false,
|
||||
.use_edma = false,
|
||||
.fifo_depth = 32,
|
||||
.reg_offset = 0,
|
||||
};
|
||||
|
||||
static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = {
|
||||
.use_imx_pcm = true,
|
||||
.use_edma = false,
|
||||
.fifo_depth = 32,
|
||||
.reg_offset = 0,
|
||||
};
|
||||
|
||||
static const struct fsl_sai_soc_data fsl_sai_imx7ulp_data = {
|
||||
.use_imx_pcm = true,
|
||||
.use_edma = false,
|
||||
.fifo_depth = 16,
|
||||
.reg_offset = 8,
|
||||
};
|
||||
|
||||
static const struct fsl_sai_soc_data fsl_sai_imx8mq_data = {
|
||||
.use_imx_pcm = true,
|
||||
.use_edma = false,
|
||||
.fifo_depth = 128,
|
||||
.reg_offset = 8,
|
||||
};
|
||||
|
||||
static const struct fsl_sai_soc_data fsl_sai_imx8qm_data = {
|
||||
.use_imx_pcm = true,
|
||||
.use_edma = true,
|
||||
.fifo_depth = 64,
|
||||
.reg_offset = 0,
|
||||
};
|
||||
|
@ -157,6 +157,7 @@
|
||||
|
||||
struct fsl_sai_soc_data {
|
||||
bool use_imx_pcm;
|
||||
bool use_edma;
|
||||
unsigned int fifo_depth;
|
||||
unsigned int reg_offset;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user