aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorLionel Xu <Lionel.Xu@freescale.com>2010-09-13 17:34:54 +0800
committerFrank Li <Frank.Li@freescale.com>2010-09-29 14:10:37 +0800
commit5db5144b1e551914183abfec5d41f28b789350c0 (patch)
tree785c7d0a6b508af5b1ce12d2807225b843e3ed13 /sound
parentff4706f6c42165f05bad53e1082eac1fae3efca1 (diff)
ENGR00131404 MXS DMA: Fix occasional system panic when playback finish
System got panic sometimes when a playback stops, this patch is used to fix the problem. Signed-off-by: Lionel Xu <r63889@freescale.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/mxs/mxs-pcm.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/sound/soc/mxs/mxs-pcm.c b/sound/soc/mxs/mxs-pcm.c
index 12c90309bd7..198f1e5201f 100644
--- a/sound/soc/mxs/mxs-pcm.c
+++ b/sound/soc/mxs/mxs-pcm.c
@@ -170,12 +170,18 @@ static void mxs_pcm_stop(struct snd_pcm_substream *substream)
struct mxs_dma_info dma_info;
int desc;
+ int periods_num = prtd->dma_totsize / prtd->dma_period;
/* Freez DMA channel for a moment */
mxs_dma_freeze(prtd->dma_ch);
mxs_dma_get_info(prtd->dma_ch, &dma_info);
desc = (dma_info.buf_addr - runtime->dma_addr) / prtd->dma_period;
+ if (desc >= periods_num)
+ desc = 0;
+ else if (desc < 0)
+ desc = 0;
+
/* Set up the next descriptor to decrement DMA channel sempahore */
prtd->dma_desc_array[(desc + 1)%8]->cmd.cmd.bits.bytes = 0;
prtd->dma_desc_array[(desc + 1)%8]->cmd.cmd.bits.pio_words = 0;