ASoC: pxa2xx-i2s: Handle SACR1_DRPL and SACR1_DREC separately
authorKarl Beldan <karl.beldan@gmail.com>
Wed, 13 May 2009 20:16:46 +0000 (22:16 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 14 May 2009 19:35:23 +0000 (20:35 +0100)
- hw_params enables both RPL and REC functions each time : Enable the
appropriate function in pxa2xx_i2s_trigger.
- pxa2xx_i2s_shutdown disables i2s anytime one of RPL or REC function is
off : Turn it off only when both functions are off.

Signed-off-by: Karl Beldan <karl.beldan@mobile-devices.fr>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
sound/soc/pxa/pxa2xx-i2s.c

index bb8630b6dc8db71955c0328aed889cc5f1c715cc..115b471b2defdedfb4e6ae852fdd116bc9ca204e 100644 (file)
@@ -176,9 +176,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
 
        /* is port used by another stream */
        if (!(SACR0 & SACR0_ENB)) {
-
                SACR0 = 0;
-               SACR1 = 0;
                if (pxa_i2s.master)
                        SACR0 |= SACR0_BCKD;
 
@@ -224,6 +222,10 @@ static int pxa2xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
 
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
+               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+                       SACR1 &= ~SACR1_DRPL;
+               else
+                       SACR1 &= ~SACR1_DREC;
                SACR0 |= SACR0_ENB;
                break;
        case SNDRV_PCM_TRIGGER_RESUME:
@@ -250,7 +252,7 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream,
                SAIMR &= ~SAIMR_RFS;
        }
 
-       if (SACR1 & (SACR1_DREC | SACR1_DRPL)) {
+       if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) {
                SACR0 &= ~SACR0_ENB;
                pxa_i2s_wait();
                clk_disable(clk_i2s);