ASoC: fsl_xcvr: Add constraints of period size while using eDMA
authorChancel Liu <chancel.liu@nxp.com>
Wed, 4 Jan 2023 02:39:53 +0000 (10:39 +0800)
committerMark Brown <broonie@kernel.org>
Mon, 9 Jan 2023 13:04:23 +0000 (13:04 +0000)
eDMA on i.MX93 platform requires the period size to be multiple of
maxburst.

Signed-off-by: Chancel Liu <chancel.liu@nxp.com>
Acked-by: Shengjiu Wang <shengjiu.wang@gmail.com>
Link: https://lore.kernel.org/r/20230104023953.2973362-4-chancel.liu@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_xcvr.c

index b794158..2a78243 100644 (file)
@@ -22,6 +22,7 @@
 struct fsl_xcvr_soc_data {
        const char *fw_name;
        bool spdif_only;
+       bool use_edma;
 };
 
 struct fsl_xcvr {
@@ -538,6 +539,16 @@ static int fsl_xcvr_startup(struct snd_pcm_substream *substream,
                return -EBUSY;
        }
 
+       /*
+        * EDMA controller needs period size to be a multiple of
+        * tx/rx maxburst
+        */
+       if (xcvr->soc_data->use_edma)
+               snd_pcm_hw_constraint_step(substream->runtime, 0,
+                                          SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
+                                          tx ? xcvr->dma_prms_tx.maxburst :
+                                          xcvr->dma_prms_rx.maxburst);
+
        switch (xcvr->mode) {
        case FSL_XCVR_MODE_SPDIF:
        case FSL_XCVR_MODE_ARC:
@@ -1207,6 +1218,7 @@ static const struct fsl_xcvr_soc_data fsl_xcvr_imx8mp_data = {
 
 static const struct fsl_xcvr_soc_data fsl_xcvr_imx93_data = {
        .spdif_only = true,
+       .use_edma = true,
 };
 
 static const struct of_device_id fsl_xcvr_dt_ids[] = {