summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Lindholm <holindho@cs.helsinki.fi>2007-11-30 16:27:26 (GMT)
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-12-11 20:08:18 (GMT)
commit843b1378c2ab47ab1ed9cb471938e0f0ec839fcd (patch)
tree397ca0c67ee6aeec2efd6dc46eb96955c704ff0c
parent4aa504a89a140f482ddabb45460e0005bf3e522a (diff)
downloadlinux-843b1378c2ab47ab1ed9cb471938e0f0ec839fcd.tar.xz
V4L/DVB (6690): saa7134: fix ignored interrupts
The saa7134 video driver starts dropping frames when used together with the saa7134-alsa driver. Frames are dropped because when an audio event is waiting the driver simply ignores the interrupt and passes it on to the saa7134-alsa interrupt handler. The alsa interrupt handler in turn acknowledges all types of events thus clearing the pending video events as well. Fix by only masking out the audio event in the video interrupt handler and by only acknowledging the audio event in the alsa driver. Signed-off-by: Heikki Lindholm <holindho@cs.helsinki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c3
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c21
2 files changed, 13 insertions, 11 deletions
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index ece177d..4878f30 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -222,7 +222,8 @@ static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id)
if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
handled = 1;
- saa_writel(SAA7134_IRQ_REPORT,report);
+ saa_writel(SAA7134_IRQ_REPORT,
+ SAA7134_IRQ_REPORT_DONE_RA3);
saa7134_irq_alsa_done(dev, status);
} else {
goto out;
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index a499eea..4fd187a 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -569,21 +569,22 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
for (loop = 0; loop < 10; loop++) {
report = saa_readl(SAA7134_IRQ_REPORT);
status = saa_readl(SAA7134_IRQ_STATUS);
- if (0 == report) {
- if (irq_debug > 1)
- printk(KERN_DEBUG "%s/irq: no (more) work\n",
- dev->name);
- goto out;
- }
-
- /* If dmasound support is active and we get a sound report, exit
- and let the saa7134-alsa/oss module deal with it */
+ /* If dmasound support is active and we get a sound report,
+ * mask out the report and let the saa7134-alsa module deal
+ * with it */
if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
(dev->dmasound.priv_data != NULL) )
{
if (irq_debug > 1)
- printk(KERN_DEBUG "%s/irq: ignoring interrupt for DMA sound\n",
+ printk(KERN_DEBUG "%s/irq: preserving DMA sound interrupt\n",
+ dev->name);
+ report &= ~SAA7134_IRQ_REPORT_DONE_RA3;
+ }
+
+ if (0 == report) {
+ if (irq_debug > 1)
+ printk(KERN_DEBUG "%s/irq: no (more) work\n",
dev->name);
goto out;
}