aboutsummaryrefslogtreecommitdiff
path: root/sound/soc/imx/imx-pcm-dma-mx2.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-04-16 07:25:48 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2010-04-16 07:25:48 -0700
commit1f829825f21755c48de075cd7722fcd19438f587 (patch)
tree05dccdcf8d46104e5877b6726772fc65bba431a5 /sound/soc/imx/imx-pcm-dma-mx2.c
parentdc57da3875f527b1cc195ea4ce5bd32e1e68433d (diff)
parent923125c6503efd3b8779e0df9ec5fcac6acda0b4 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ASoC: imx-ssi: do not call hrtimer_disable in trigger function ALSA: hda - Add position_fix quirk for Biostar mobo ALSA: hda - add a quirk for Clevo M570U laptop ASoC: imx-ssi: increase minimum periods to 4 ALSA: hda - Avoid invalid "Independent HP" control for VIA codecs ALSA: hda - Fix control element allocations in VIA codec parser ALSA: aaci - Fix alignment faults on ARM Cortex introduced by commit 29a4f2d3 ALSA: hda - Add fix-up for Sony VAIO with ALC269 ALSA: hda - Enhance fix-up table for Realtek codecs ALSA: usb - Fix Oops after usb-midi disconnection ALSA: hda - Fix initial capture source connections of ALC880/260 ALSA: hda - Fix setup for ALC269vb amic and dmic models ALSA: hda - Fix auto-parser of ALC269vb for HP pin NID 0x21 ASoC: imx-ssi: Use a hrtimer in FIQ mode ASoC: imx-pcm-dma-mx2: restart DMA after an error ASoC: imx-ssi: honor IMX_SSI_DMA flag ASoC: wm2000: remove unused #include <linux/version.h> ALSA: hda: Add support for Medion WIM2160
Diffstat (limited to 'sound/soc/imx/imx-pcm-dma-mx2.c')
-rw-r--r--sound/soc/imx/imx-pcm-dma-mx2.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c
index 2e79d713629..2b31ac673ea 100644
--- a/sound/soc/imx/imx-pcm-dma-mx2.c
+++ b/sound/soc/imx/imx-pcm-dma-mx2.c
@@ -71,7 +71,12 @@ static void imx_ssi_dma_callback(int channel, void *data)
static void snd_imx_dma_err_callback(int channel, void *data, int err)
{
- pr_err("DMA error callback called\n");
+ struct snd_pcm_substream *substream = data;
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct imx_pcm_dma_params *dma_params = rtd->dai->cpu_dai->dma_data;
+ struct snd_pcm_runtime *runtime = substream->runtime;
+ struct imx_pcm_runtime_data *iprtd = runtime->private_data;
+ int ret;
pr_err("DMA timeout on channel %d -%s%s%s%s\n",
channel,
@@ -79,6 +84,14 @@ static void snd_imx_dma_err_callback(int channel, void *data, int err)
err & IMX_DMA_ERR_REQUEST ? " request" : "",
err & IMX_DMA_ERR_TRANSFER ? " transfer" : "",
err & IMX_DMA_ERR_BUFFER ? " buffer" : "");
+
+ imx_dma_disable(iprtd->dma);
+ ret = imx_dma_setup_sg(iprtd->dma, iprtd->sg_list, iprtd->sg_count,
+ IMX_DMA_LENGTH_LOOP, dma_params->dma_addr,
+ substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
+ DMA_MODE_WRITE : DMA_MODE_READ);
+ if (!ret)
+ imx_dma_enable(iprtd->dma);
}
static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream)