ASoC: fsl_sai: Add sample rate constraint
authorChancel Liu <chancel.liu@nxp.com>
Tue, 26 Nov 2024 11:54:40 +0000 (20:54 +0900)
committerMark Brown <broonie@kernel.org>
Mon, 9 Dec 2024 13:11:11 +0000 (13:11 +0000)
Platforms like i.MX93/91 only have one audio PLL. Some sample rates are
not supported. If the PLL source is used for 8kHz series rates, then
11kHz series rates can't be supported. Use fsl_asoc_constrain_rates()
to constrain rates according to PLL sources.

Signed-off-by: Chancel Liu <chancel.liu@nxp.com>
Link: https://patch.msgid.link/20241126115440.3929061-5-chancel.liu@nxp.com
Acked-by: Shengjiu Wang <shengjiu.wang@gmail.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_sai.c
sound/soc/fsl/fsl_sai.h

index 634168d2bb6e5431624d9df2b8e95e2c57e0a104..c4eb87c5d39e4773fbb61ac274a205192ea9ac8a 100644 (file)
@@ -885,7 +885,7 @@ static int fsl_sai_startup(struct snd_pcm_substream *substream,
                                           sai->dma_params_rx.maxburst);
 
        ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
-                       SNDRV_PCM_HW_PARAM_RATE, &fsl_sai_rate_constraints);
+                                        SNDRV_PCM_HW_PARAM_RATE, &sai->constraint_rates);
 
        return ret;
 }
@@ -1442,6 +1442,11 @@ static int fsl_sai_probe(struct platform_device *pdev)
        fsl_asoc_get_pll_clocks(&pdev->dev, &sai->pll8k_clk,
                                &sai->pll11k_clk);
 
+       fsl_asoc_constrain_rates(&sai->constraint_rates,
+                                &fsl_sai_rate_constraints,
+                                sai->pll8k_clk, sai->pll11k_clk, NULL,
+                                sai->constraint_rates_list);
+
        /* Use Multi FIFO mode depending on the support from SDMA script */
        ret = of_property_read_u32_array(np, "dmas", dmas, 4);
        if (!sai->soc_data->use_edma && !ret && dmas[2] == IMX_DMATYPE_MULTI_SAI)
index 9c4d19fe22c654f703fc66c77055885933394ff4..0e25e2fc7ce0da9929b842cce5835bfd9b5bf55b 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/dma/imx-dma.h>
 #include <sound/dmaengine_pcm.h>
 
+#define FAL_SAI_NUM_RATES  20
 #define FSL_SAI_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
                         SNDRV_PCM_FMTBIT_S20_3LE |\
                         SNDRV_PCM_FMTBIT_S24_LE |\
@@ -309,6 +310,8 @@ struct fsl_sai {
        struct pinctrl *pinctrl;
        struct pinctrl_state *pins_state;
        struct sdma_peripheral_config audio_config[2];
+       struct snd_pcm_hw_constraint_list constraint_rates;
+       unsigned int constraint_rates_list[FAL_SAI_NUM_RATES];
 };
 
 #define TX 1