This patch enables Tx-related SIER_FLAGS only when direction is PLAYBACK
and does same thing for CAPTURE. Also, after TRIGGER_STOP/PAUSE, it will
disable SIER_xFLAGS for symmetric.

[ Passed compile-test with mpc85xx_defconfig ]

Signed-off-by: Nicolin Chen <b42...@freescale.com>
---
 sound/soc/fsl/fsl_ssi.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
index 35e2773..3797bf0 100644
--- a/sound/soc/fsl/fsl_ssi.c
+++ b/sound/soc/fsl/fsl_ssi.c
@@ -107,11 +107,14 @@ static inline void write_ssi_mask(u32 __iomem *addr, u32 
clear, u32 set)
 #endif
 
 /* SIER bitflag of interrupts to enable */
-#define SIER_FLAGS (CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TDMAE | \
+#define SIER_TFLAGS (CCSR_SSI_SIER_TFRC_EN | CCSR_SSI_SIER_TDMAE | \
                    CCSR_SSI_SIER_TIE | CCSR_SSI_SIER_TUE0_EN | \
-                   CCSR_SSI_SIER_TUE1_EN | CCSR_SSI_SIER_RFRC_EN | \
-                   CCSR_SSI_SIER_RDMAE | CCSR_SSI_SIER_RIE | \
-                   CCSR_SSI_SIER_ROE0_EN | CCSR_SSI_SIER_ROE1_EN)
+                   CCSR_SSI_SIER_TUE1_EN)
+#define SIER_RFLAGS (CCSR_SSI_SIER_RFRC_EN | CCSR_SSI_SIER_RDMAE | \
+                   CCSR_SSI_SIER_RIE | CCSR_SSI_SIER_ROE0_EN | \
+                   CCSR_SSI_SIER_ROE1_EN)
+
+#define SIER_FLAGS (SIER_TFLAGS | SIER_RFLAGS)
 
 /**
  * fsl_ssi_private: per-SSI private data
@@ -560,12 +563,12 @@ static int fsl_ssi_trigger(struct snd_pcm_substream 
*substream, int cmd,
 
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                if (ssi_private->use_dma)
-                       sier_bits = SIER_FLAGS;
+                       sier_bits = SIER_TFLAGS;
                else
                        sier_bits = CCSR_SSI_SIER_TIE | CCSR_SSI_SIER_TFE0_EN;
        } else {
                if (ssi_private->use_dma)
-                       sier_bits = SIER_FLAGS;
+                       sier_bits = SIER_RFLAGS;
                else
                        sier_bits = CCSR_SSI_SIER_RIE | CCSR_SSI_SIER_RFF0_EN;
        }
@@ -579,6 +582,8 @@ static int fsl_ssi_trigger(struct snd_pcm_substream 
*substream, int cmd,
                else
                        write_ssi_mask(&ssi->scr, 0,
                                CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE);
+
+               write_ssi_mask(&ssi->sier, 0, sier_bits);
                break;
 
        case SNDRV_PCM_TRIGGER_STOP:
@@ -591,14 +596,14 @@ static int fsl_ssi_trigger(struct snd_pcm_substream 
*substream, int cmd,
                if (!ssi_private->imx_ac97 && (read_ssi(&ssi->scr) &
                                        (CCSR_SSI_SCR_TE | CCSR_SSI_SCR_RE)) == 
0)
                        write_ssi_mask(&ssi->scr, CCSR_SSI_SCR_SSIEN, 0);
+
+               write_ssi_mask(&ssi->sier, sier_bits, 0);
                break;
 
        default:
                return -EINVAL;
        }
 
-       write_ssi(sier_bits, &ssi->sier);
-
        return 0;
 }
 
-- 
1.8.4


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to