ALSA: Au88x0 - Fix IRQ fifo error and channels swap of 4 channels playback
authorRaymond Yau <superquad.vortex2@gmail.com>
Fri, 6 Jan 2012 01:19:29 +0000 (09:19 +0800)
committerTakashi Iwai <tiwai@suse.de>
Sun, 8 Jan 2012 13:38:42 +0000 (14:38 +0100)
Fix IRQ fifo error when playing stereo by set stereo flag of fifo control.
This also fix the swap of front and rear channels on au8830.

Signed-off-by: Raymond Yau <superquad.vortex2@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/au88x0/au88x0_core.c
sound/pci/au88x0/au88x0_pcm.c

index 489150380eac0d11ac9c0531fa37f1d59b7cb410..d49e2c5ecb75ff28e0cd6886da3aaca2fe5ecc89 100644 (file)
@@ -805,7 +805,7 @@ static void vortex_fifo_setadbvalid(vortex_t * vortex, int fifo, int en)
 }
 
 static void
-vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority,
+vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int stereo, int priority,
                       int empty, int valid, int f)
 {
        int temp, lifeboat = 0;
@@ -837,7 +837,7 @@ vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority,
 #else
                        temp = (this_4 & 0x3f) << 0xc;
 #endif
-                       temp = (temp & 0xfffffffd) | ((b & 1) << 1);
+                       temp = (temp & 0xfffffffd) | ((stereo & 1) << 1);
                        temp = (temp & 0xfffffff3) | ((priority & 3) << 2);
                        temp = (temp & 0xffffffef) | ((valid & 1) << 4);
                        temp |= FIFO_U1;
@@ -1148,11 +1148,11 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
 
 static void
 vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir,
-                     int fmt, int d, u32 offset)
+                     int fmt, int stereo, u32 offset)
 {
        stream_t *dma = &vortex->dma_adb[adbdma];
 
-       dma->dma_unknown = d;
+       dma->dma_unknown = stereo;
        dma->dma_ctrl =
            ((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK));
        /* Enable PCMOUT interrupts. */
index c5f7ae46afefca324b1e31b8100fb0cd80afdf2b..509969038ac539e28d8be01dda8d5c1a564eb883 100644 (file)
@@ -307,8 +307,8 @@ static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream)
        fmt = vortex_alsafmt_aspfmt(runtime->format);
        spin_lock_irq(&chip->lock);
        if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) {
-               vortex_adbdma_setmode(chip, dma, 1, dir, fmt, 0 /*? */ ,
-                                     0);
+               vortex_adbdma_setmode(chip, dma, 1, dir, fmt,
+                               runtime->channels == 1 ? 0 : 1, 0);
                vortex_adbdma_setstartbuffer(chip, dma, 0);
                if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_SPDIF)
                        vortex_adb_setsrc(chip, dma, runtime->rate, dir);