ASoC: fsl_sai: Reset FIFOs after disabling TE/RE
authorNicolin Chen <nicoleotsuka@gmail.com>
Thu, 17 Jul 2014 13:21:37 +0000 (21:21 +0800)
committerMark Brown <broonie@linaro.org>
Thu, 17 Jul 2014 17:10:41 +0000 (18:10 +0100)
SAI will not clear their FIFOs after disabling TE/RE. Therfore, the driver
should take care the task so as not to let useless data remain in the FIFO.

Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
sound/soc/fsl/fsl_sai.c

index c5a0e8af8226147bd8b35a3f523756cec69490c8..b10dbd835d5c59439226479e763e932e324a57ae 100644 (file)
@@ -371,10 +371,13 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
 
                /* Check if the opposite FRDE is also disabled */
                if (!(tx ? rcsr & FSL_SAI_CSR_FRDE : tcsr & FSL_SAI_CSR_FRDE)) {
+                       /* Disable both directions and reset their FIFOs */
                        regmap_update_bits(sai->regmap, FSL_SAI_TCSR,
-                                          FSL_SAI_CSR_TERE, 0);
+                                          FSL_SAI_CSR_TERE | FSL_SAI_CSR_FR,
+                                          FSL_SAI_CSR_FR);
                        regmap_update_bits(sai->regmap, FSL_SAI_RCSR,
-                                          FSL_SAI_CSR_TERE, 0);
+                                          FSL_SAI_CSR_TERE | FSL_SAI_CSR_FR,
+                                          FSL_SAI_CSR_FR);
                }
                break;
        default: