Commit 3ae4e1f7 authored by Raymond Yau's avatar Raymond Yau Committed by Takashi Iwai

ALSA: Au88x0 - Fix IRQ fifo error and channels swap of 4 channels playback

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: default avatarRaymond Yau <superquad.vortex2@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 76474da0
...@@ -805,7 +805,7 @@ static void vortex_fifo_setadbvalid(vortex_t * vortex, int fifo, int en) ...@@ -805,7 +805,7 @@ static void vortex_fifo_setadbvalid(vortex_t * vortex, int fifo, int en)
} }
static void 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 empty, int valid, int f)
{ {
int temp, lifeboat = 0; int temp, lifeboat = 0;
...@@ -837,7 +837,7 @@ vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority, ...@@ -837,7 +837,7 @@ vortex_fifo_setadbctrl(vortex_t * vortex, int fifo, int b, int priority,
#else #else
temp = (this_4 & 0x3f) << 0xc; temp = (this_4 & 0x3f) << 0xc;
#endif #endif
temp = (temp & 0xfffffffd) | ((b & 1) << 1); temp = (temp & 0xfffffffd) | ((stereo & 1) << 1);
temp = (temp & 0xfffffff3) | ((priority & 3) << 2); temp = (temp & 0xfffffff3) | ((priority & 3) << 2);
temp = (temp & 0xffffffef) | ((valid & 1) << 4); temp = (temp & 0xffffffef) | ((valid & 1) << 4);
temp |= FIFO_U1; temp |= FIFO_U1;
...@@ -1148,11 +1148,11 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma, ...@@ -1148,11 +1148,11 @@ vortex_adbdma_setbuffers(vortex_t * vortex, int adbdma,
static void static void
vortex_adbdma_setmode(vortex_t * vortex, int adbdma, int ie, int dir, 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]; stream_t *dma = &vortex->dma_adb[adbdma];
dma->dma_unknown = d; dma->dma_unknown = stereo;
dma->dma_ctrl = dma->dma_ctrl =
((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK)); ((offset & OFFSET_MASK) | (dma->dma_ctrl & ~OFFSET_MASK));
/* Enable PCMOUT interrupts. */ /* Enable PCMOUT interrupts. */
......
...@@ -307,8 +307,8 @@ static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -307,8 +307,8 @@ static int snd_vortex_pcm_prepare(struct snd_pcm_substream *substream)
fmt = vortex_alsafmt_aspfmt(runtime->format); fmt = vortex_alsafmt_aspfmt(runtime->format);
spin_lock_irq(&chip->lock); spin_lock_irq(&chip->lock);
if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) {
vortex_adbdma_setmode(chip, dma, 1, dir, fmt, 0 /*? */ , vortex_adbdma_setmode(chip, dma, 1, dir, fmt,
0); runtime->channels == 1 ? 0 : 1, 0);
vortex_adbdma_setstartbuffer(chip, dma, 0); vortex_adbdma_setstartbuffer(chip, dma, 0);
if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_SPDIF) if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_SPDIF)
vortex_adb_setsrc(chip, dma, runtime->rate, dir); vortex_adb_setsrc(chip, dma, runtime->rate, dir);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment