提交 843b1378 编写于 作者: H Heikki Lindholm 提交者: Mauro Carvalho Chehab

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: NHeikki Lindholm  <holindho@cs.helsinki.fi>
Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
上级 4aa504a8
...@@ -222,7 +222,8 @@ static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id) ...@@ -222,7 +222,8 @@ static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id)
if (report & SAA7134_IRQ_REPORT_DONE_RA3) { if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
handled = 1; handled = 1;
saa_writel(SAA7134_IRQ_REPORT,report); saa_writel(SAA7134_IRQ_REPORT,
SAA7134_IRQ_REPORT_DONE_RA3);
saa7134_irq_alsa_done(dev, status); saa7134_irq_alsa_done(dev, status);
} else { } else {
goto out; goto out;
......
...@@ -569,21 +569,22 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id) ...@@ -569,21 +569,22 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
for (loop = 0; loop < 10; loop++) { for (loop = 0; loop < 10; loop++) {
report = saa_readl(SAA7134_IRQ_REPORT); report = saa_readl(SAA7134_IRQ_REPORT);
status = saa_readl(SAA7134_IRQ_STATUS); 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) && if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
(dev->dmasound.priv_data != NULL) ) (dev->dmasound.priv_data != NULL) )
{ {
if (irq_debug > 1) 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); dev->name);
goto out; goto out;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册