From 44a85386899e83f46eec1f171825a9f5d17df596 Mon Sep 17 00:00:00 2001 From: Mika Laitio Date: Tue, 12 Sep 2006 14:56:10 +0300 Subject: [PATCH] [PATCH] Change all omap15xx devices to use similar DMA handling than h6300 uses Change all omap15xx devices to use similar DMA handling than h6300 uses. Thanks for the James Selvam for verifying this with omap 1510 innovator. http://linux.omap.com/pipermail/linux-omap-open-source/2006-May/007256.html Signed-off-by: Mika Laitio Signed-off-by: Tony Lindgren --- sound/arm/omap/omap-alsa.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/sound/arm/omap/omap-alsa.c b/sound/arm/omap/omap-alsa.c index 328003be2bc..583460cf176 100644 --- a/sound/arm/omap/omap-alsa.c +++ b/sound/arm/omap/omap-alsa.c @@ -190,9 +190,7 @@ static void audio_process_dma(struct audio_stream *s) unsigned int dma_size; unsigned int offset; int ret; -#ifdef CONFIG_MACH_OMAP_H6300 unsigned long flags; -#endif ADEBUG(); runtime = substream->runtime; @@ -200,14 +198,20 @@ static void audio_process_dma(struct audio_stream *s) dma_size = frames_to_bytes(runtime, runtime->period_size); offset = dma_size * s->period; snd_assert(dma_size <= DMA_BUF_SIZE,); -#ifdef CONFIG_MACH_OMAP_H6300 - spin_lock_irqsave(&s->dma_lock, flags); - omap_stop_alsa_sound_dma(s); - spin_unlock_irqrestore(&s->dma_lock, flags); -#endif + /* + * On omap1510 based devices, we need to call the stop_dma + * before calling the start_dma or we will not receive the + * irq from DMA after the first transfered/played buffer. + * (invocation of callback_omap_alsa_sound_dma() method). + */ + if (cpu_is_omap15xx()) { + spin_lock_irqsave(&s->dma_lock, flags); + omap_stop_alsa_sound_dma(s); + spin_unlock_irqrestore(&s->dma_lock, flags); + } ret = omap_start_alsa_sound_dma(s, - (dma_addr_t) runtime->dma_area + - offset, dma_size); + (dma_addr_t)runtime->dma_area + offset, + dma_size); if (ret) { printk(KERN_ERR "audio_process_dma: cannot queue DMA buffer (%i)\n", -- 2.41.0