LF-3724-8: ASoC: fsl_sai: Set proper words_per_fifo value
authorShengjiu Wang <shengjiu.wang@nxp.com>
Thu, 22 Apr 2021 09:05:15 +0000 (17:05 +0800)
committerShengjiu Wang <shengjiu.wang@nxp.com>
Thu, 22 Apr 2021 10:18:26 +0000 (18:18 +0800)
If period_size % words_per_fifo != 0, then the multi fifo
sdma script can't work correctly. So set proper word_per_fifo
value to avoid such issue.

Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Reviewed-by: Robin Gong <yibin.gong@nxp.com>
sound/soc/fsl/fsl_sai.c

index 7dc6a1a..f90b762 100644 (file)
@@ -643,14 +643,14 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
 
                if (sai->is_multi_lane) {
                        if (tx) {
-                               sai->audio_config[tx].words_per_fifo = slots;
+                               sai->audio_config[tx].words_per_fifo = min(slots, channels);
                                sai->audio_config[tx].dst_fifo_num = pins;
                                sai->audio_config[tx].dst_fifo_off = dl_cfg[dl_cfg_idx].offset[tx];
                                sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX * pins;
                                sai->dma_params_tx.peripheral_config = &sai->audio_config[tx];
                                sai->dma_params_tx.peripheral_size = sizeof(sai->audio_config[tx]);
                        } else {
-                               sai->audio_config[tx].words_per_fifo = slots;
+                               sai->audio_config[tx].words_per_fifo = min(slots, channels);
                                sai->audio_config[tx].src_fifo_num = pins;
                                sai->audio_config[tx].src_fifo_off = dl_cfg[dl_cfg_idx].offset[tx];
                                sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX * pins;