public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC] [PATCH 3/3] ASoC: OMAP: Enhance OMAP1510 DMA progress software counter
@ 2009-08-10  8:50 Janusz Krzysztofik
  2009-08-10  9:43 ` Janusz Krzysztofik
  2009-08-10 23:07 ` [RFC][PATCH 3/3 v2] " Janusz Krzysztofik
  0 siblings, 2 replies; 13+ messages in thread
From: Janusz Krzysztofik @ 2009-08-10  8:50 UTC (permalink / raw)
  To: Jarkko Nikula
  Cc: Mark Brown, Peter Ujfalusi, Tony Lindgren,
	alsa-devel@alsa-project.org, linux-omap@vger.kernel.org,
	linux-arm-kernel@lists.arm.linux.org.uk,
	linux-kernel@vger.kernel.org

Enhance period index accuracy, particularly just before buffer rewind, by
making use of DMA interrupt status flags in addition to simply counting
interrupts

This patch applies on top of patch 2 from this series:
[RFC][PATCH 2/3] ASoC: OMAP: Make use of DMA channel self linking on OMAP1510

Created against linux-2.6.31-rc5.

Tested on Amstrad Delta.

Signed-off-by: Janusz Krzysztofik <jkrzyszt@tis.icnet.pl>

---
--- linux-2.6.31-rc5/sound/soc/omap/omap-pcm.c.orig	2009-08-10 08:31:08.000000000 +0200
+++ linux-2.6.31-rc5/sound/soc/omap/omap-pcm.c	2009-08-10 08:55:09.000000000 +0200
@@ -68,13 +68,28 @@ static void omap_pcm_dma_irq(int ch, u16
 		 * that can be used by omap_pcm_pointer() instead.
 		 */
 		spin_lock_irqsave(&prtd->lock, flags);
-		if (prtd->period_index >= 0) {
-			if (++prtd->period_index == runtime->periods) {
+		if (stat & OMAP_DMA_LAST_IRQ) {
+			/* last period of a buffer has been started */
+			if (prtd->period_index == (runtime->periods - 1)) {
+				/* we are in sync, do nothing */
+				spin_unlock_irqrestore(&prtd->lock, flags);
+				return;
+			} else if (prtd->period_index >= 0) {
+				/* possible IRQ loss, update the pointer */
+				prtd->period_index = runtime->periods - 1;
+			}
+		} else if (prtd->period_index >= 0) {
+			/* playback in progress - increment the counter,
+			 * check for end of buffer */
+			if ((++prtd->period_index >= runtime->periods) ||
+						(stat & OMAP_DMA_BLOCK_IRQ)) {
+				/* end of buffer reached, loop back */
 				prtd->period_index = 0;
 			}
 		}
 		spin_unlock_irqrestore(&prtd->lock, flags);
-	}
+	} else if (stat & OMAP_DMA_LAST_IRQ)
+		return;
 
 	snd_pcm_period_elapsed(substream);
 }
@@ -175,7 +190,8 @@ static int omap_pcm_prepare(struct snd_p
 	dma_params.frame_count	= runtime->periods;
 	omap_set_dma_params(prtd->dma_ch, &dma_params);
 
-	omap_enable_dma_irq(prtd->dma_ch, OMAP_DMA_FRAME_IRQ);
+	omap_enable_dma_irq(prtd->dma_ch, OMAP_DMA_FRAME_IRQ |
+				(cpu_is_omap1510() ? OMAP_DMA_LAST_IRQ : 0));
 
 	return 0;
 }

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2009-08-24 12:50 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-10  8:50 [RFC] [PATCH 3/3] ASoC: OMAP: Enhance OMAP1510 DMA progress software counter Janusz Krzysztofik
2009-08-10  9:43 ` Janusz Krzysztofik
2009-08-10 21:11   ` Janusz Krzysztofik
2009-08-10 23:07 ` [RFC][PATCH 3/3 v2] " Janusz Krzysztofik
2009-08-11  6:42   ` Jarkko Nikula
2009-08-11  9:30     ` Janusz Krzysztofik
2009-08-11 19:44   ` [PATCH 3/3 v3] " Janusz Krzysztofik
2009-08-17  9:26     ` Jarkko Nikula
2009-08-17 10:03       ` Mark Brown
2009-08-18 13:42         ` Janusz Krzysztofik
2009-08-18 13:45           ` Mark Brown
2009-08-18 16:57             ` Jarkko Nikula
2009-08-24 12:50               ` Tony Lindgren

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox