LF-3724-9: ASoC: fsl_sai: Set proper burst size for multi-fifo case
authorShengjiu Wang <shengjiu.wang@nxp.com>
Fri, 30 Apr 2021 08:21:56 +0000 (16:21 +0800)
committerShengjiu Wang <shengjiu.wang@nxp.com>
Fri, 30 Apr 2021 10:00:38 +0000 (18:00 +0800)
multi fifo sdma script needs the maxburst = words_per_fifo * pins
And the update the watermark level accordingly.

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

index 4303df1..68f69fb 100644 (file)
@@ -646,16 +646,24 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
                                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.maxburst = sai->audio_config[tx].words_per_fifo * pins;
                                sai->dma_params_tx.peripheral_config = &sai->audio_config[tx];
                                sai->dma_params_tx.peripheral_size = sizeof(sai->audio_config[tx]);
+
+                               regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs),
+                                                  FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth),
+                                                  sai->soc_data->fifo_depth - sai->dma_params_tx.maxburst);
                        } else {
                                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;
+                               sai->dma_params_rx.maxburst = sai->audio_config[tx].words_per_fifo * pins;
                                sai->dma_params_rx.peripheral_config = &sai->audio_config[tx];
                                sai->dma_params_rx.peripheral_size = sizeof(sai->audio_config[tx]);
+
+                               regmap_update_bits(sai->regmap, FSL_SAI_RCR1(ofs),
+                                                  FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth),
+                                                  sai->dma_params_rx.maxburst - 1);
                        }
                }