summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorLionel Xu <Lionel.Xu@freescale.com>2010-09-13 17:34:54 +0800
committerAndy Voltz <andy.voltz@timesys.com>2011-06-01 13:19:12 -0400
commitb1d379073995a816cee18512afe054209768e899 (patch)
tree785c7d0a6b508af5b1ce12d2807225b843e3ed13 /sound
parentb612866dac19a21fc4ca0eda74e656304896423b (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 12c90309bd7a..198f1e5201fa 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;