ASoC: fsl_sai: allow to set mclk rate with zero clk_id
authorShengjiu Wang <shengjiu.wang@nxp.com>
Fri, 28 Mar 2025 08:57:41 +0000 (16:57 +0800)
committerMark Brown <broonie@kernel.org>
Sun, 6 Apr 2025 22:23:25 +0000 (23:23 +0100)
If clk_id is zero, it means FSL_SAI_CLK_BUS in fsl_sai_set_dai_sysclk(),
as the clk[FSL_SAI_CLK_BUS]'s rate can't be changed, there is no rate
changed for mclk.

But with audio-graph-card, the clk_id is always zero, in order to allow
to set mclk rate with zero clk_id, update the condition to be if clk_id is
zero, then set the FSL_SAI_CLK_MAST1's rate. This would not change the
original function for master mode.

Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Link: https://patch.msgid.link/20250328085744.1893434-2-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/fsl/fsl_sai.c

index ed2b4780c4707929d466c1ef8224e09aadaed679..bcb46a0b5e683403d670dcc94d76c5e321d8db81 100644 (file)
@@ -238,22 +238,22 @@ static int fsl_sai_set_dai_sysclk(struct snd_soc_dai *cpu_dai,
        if (dir == SND_SOC_CLOCK_IN)
                return 0;
 
-       if (freq > 0 && clk_id != FSL_SAI_CLK_BUS) {
-               if (clk_id < 0 || clk_id >= FSL_SAI_MCLK_MAX) {
-                       dev_err(cpu_dai->dev, "Unknown clock id: %d\n", clk_id);
-                       return -EINVAL;
-               }
+       if (clk_id < 0 || clk_id >= FSL_SAI_MCLK_MAX) {
+               dev_err(cpu_dai->dev, "Unknown clock id: %d\n", clk_id);
+               return -EINVAL;
+       }
 
-               if (IS_ERR_OR_NULL(sai->mclk_clk[clk_id])) {
-                       dev_err(cpu_dai->dev, "Unassigned clock: %d\n", clk_id);
-                       return -EINVAL;
-               }
+       if (IS_ERR_OR_NULL(sai->mclk_clk[clk_id])) {
+               dev_err(cpu_dai->dev, "Unassigned clock: %d\n", clk_id);
+               return -EINVAL;
+       }
 
-               if (sai->mclk_streams == 0) {
-                       ret = fsl_sai_set_mclk_rate(cpu_dai, clk_id, freq);
-                       if (ret < 0)
-                               return ret;
-               }
+       if (sai->mclk_streams == 0 && freq > 0) {
+               ret = fsl_sai_set_mclk_rate(cpu_dai,
+                                           clk_id ? clk_id : FSL_SAI_CLK_MAST1,
+                                           freq);
+               if (ret < 0)
+                       return ret;
        }
 
        ret = fsl_sai_set_dai_sysclk_tr(cpu_dai, clk_id, freq, true);