]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ASoC: fsl_sai: Fix no frame sync clock issue on i.MX8MP
authorShengjiu Wang <shengjiu.wang@nxp.com>
Mon, 20 Nov 2023 10:05:35 +0000 (18:05 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Dec 2023 17:39:13 +0000 (18:39 +0100)
[ Upstream commit 14e8442e0789598514f3c9de014950de9feda7a4 ]

On i.MX8MP, when the TERE and FSD_MSTR enabled before configuring
the word width, there will be no frame sync clock issue, because
old word width impact the generation of frame sync.

TERE enabled earlier only for i.MX8MP case for the hardware limitation,
So need to disable FSD_MSTR before configuring word width, then enable
FSD_MSTR bit for this specific case.

Fixes: 3e4a82612998 ("ASoC: fsl_sai: MCLK bind with TX/RX enable bit")
Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Link: https://lore.kernel.org/r/1700474735-3863-1-git-send-email-shengjiu.wang@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/soc/fsl/fsl_sai.c

index 96fd9095e544b3839a17023b9fece65b561b425b..6364d9be28fbbff808b4ccc5c479aae09018fea8 100644 (file)
@@ -674,6 +674,20 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
                           FSL_SAI_CR3_TRCE_MASK,
                           FSL_SAI_CR3_TRCE((dl_cfg[dl_cfg_idx].mask[tx] & trce_mask)));
 
+       /*
+        * When the TERE and FSD_MSTR enabled before configuring the word width
+        * There will be no frame sync clock issue, because word width impact
+        * the generation of frame sync clock.
+        *
+        * TERE enabled earlier only for i.MX8MP case for the hardware limitation,
+        * We need to disable FSD_MSTR before configuring word width, then enable
+        * FSD_MSTR bit for this specific case.
+        */
+       if (sai->soc_data->mclk_with_tere && sai->mclk_direction_output &&
+           !sai->is_consumer_mode)
+               regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs),
+                                  FSL_SAI_CR4_FSD_MSTR, 0);
+
        regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs),
                           FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK |
                           FSL_SAI_CR4_CHMOD_MASK,
@@ -681,6 +695,13 @@ static int fsl_sai_hw_params(struct snd_pcm_substream *substream,
        regmap_update_bits(sai->regmap, FSL_SAI_xCR5(tx, ofs),
                           FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
                           FSL_SAI_CR5_FBT_MASK, val_cr5);
+
+       /* Enable FSD_MSTR after configuring word width */
+       if (sai->soc_data->mclk_with_tere && sai->mclk_direction_output &&
+           !sai->is_consumer_mode)
+               regmap_update_bits(sai->regmap, FSL_SAI_xCR4(tx, ofs),
+                                  FSL_SAI_CR4_FSD_MSTR, FSL_SAI_CR4_FSD_MSTR);
+
        regmap_write(sai->regmap, FSL_SAI_xMR(tx),
                     ~0UL - ((1 << min(channels, slots)) - 1));