TX synchronous with RX: The RMR is no need to be changed when
Tx is enabled, the other configuration in hw_params() is enough for
clock generation. The TCSR.TE is no need to enabled when only RX
is enabled.

RX synchronous with TX: The TMR is no need to be changed when
Rx is enabled, the other configuration in hw_params() is enough for
clock generation. The RCSR.RE is no need to enabled when only TX
is enabled.

Signed-off-by: Shengjiu Wang <[email protected]>
---
 sound/soc/fsl/fsl_sai.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index cdff739924e2..a210c9836a9a 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -482,8 +482,6 @@ static int fsl_sai_hw_params(struct snd_pcm_substream 
*substream,
                        regmap_update_bits(sai->regmap, FSL_SAI_TCR5(ofs),
                                FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
                                FSL_SAI_CR5_FBT_MASK, val_cr5);
-                       regmap_write(sai->regmap, FSL_SAI_TMR,
-                               ~0UL - ((1 << channels) - 1));
                } else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) 
{
                        regmap_update_bits(sai->regmap, FSL_SAI_RCR4(ofs),
                                FSL_SAI_CR4_SYWD_MASK | FSL_SAI_CR4_FRSZ_MASK,
@@ -491,8 +489,6 @@ static int fsl_sai_hw_params(struct snd_pcm_substream 
*substream,
                        regmap_update_bits(sai->regmap, FSL_SAI_RCR5(ofs),
                                FSL_SAI_CR5_WNW_MASK | FSL_SAI_CR5_W0W_MASK |
                                FSL_SAI_CR5_FBT_MASK, val_cr5);
-                       regmap_write(sai->regmap, FSL_SAI_RMR,
-                               ~0UL - ((1 << channels) - 1));
                }
        }
 
@@ -553,11 +549,18 @@ static int fsl_sai_trigger(struct snd_pcm_substream 
*substream, int cmd,
                regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs),
                                   FSL_SAI_CSR_FRDE, FSL_SAI_CSR_FRDE);
 
-               regmap_update_bits(sai->regmap, FSL_SAI_RCSR(ofs),
-                                  FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
-               regmap_update_bits(sai->regmap, FSL_SAI_TCSR(ofs),
+               regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs),
                                   FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
 
+               /* Enable opposite direction when necessarily */
+               if (!sai->synchronous[TX] && sai->synchronous[RX] && !tx) {
+                       regmap_update_bits(sai->regmap, FSL_SAI_xCSR((!tx), 
ofs),
+                                          FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
+               } else if (!sai->synchronous[RX] && sai->synchronous[TX] && tx) 
{
+                       regmap_update_bits(sai->regmap, FSL_SAI_xCSR((!tx), 
ofs),
+                                          FSL_SAI_CSR_TERE, FSL_SAI_CSR_TERE);
+               }
+
                regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx, ofs),
                                   FSL_SAI_CSR_xIE_MASK, FSL_SAI_FLAGS);
                break;
-- 
2.27.0

Reply via email to