summaryrefslogtreecommitdiffstats
path: root/drivers/media/rc
diff options
context:
space:
mode:
authorHeiner Kallweit2016-07-31 15:42:55 +0200
committerMauro Carvalho Chehab2016-09-22 16:23:50 +0200
commitd14f291b6280a675b7bf129aa9a2d7a077554a31 (patch)
treec37f8e2bbafe9dddd0025e96dfd6acbe351d5130 /drivers/media/rc
parent[media] media: rc: fix deadlock when module ir_lirc_codec is removed (diff)
downloadkernel-qcow2-linux-d14f291b6280a675b7bf129aa9a2d7a077554a31.tar.gz
kernel-qcow2-linux-d14f291b6280a675b7bf129aa9a2d7a077554a31.tar.xz
kernel-qcow2-linux-d14f291b6280a675b7bf129aa9a2d7a077554a31.zip
[media] media: rc: nuvoton: ignore spurious interrupt when logical device is being disabled
When removing module nuvoton-cir I get a fifo overrun warning. It turned out to be caused by a spurious interrupt when the logical CIR device is being disabled (although no interrupt source bit being set). Reading the interrupt status register returns 0xff, therefore the fifo overrun bit is mistakenly interpreted as being set. Fix this by ignoring interrupts when interrupt source and status register reads return 0xff. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/rc')
-rw-r--r--drivers/media/rc/nuvoton-cir.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c
index 00215f343819..0c69536ea813 100644
--- a/drivers/media/rc/nuvoton-cir.c
+++ b/drivers/media/rc/nuvoton-cir.c
@@ -886,6 +886,15 @@ static irqreturn_t nvt_cir_isr(int irq, void *data)
status = nvt_cir_reg_read(nvt, CIR_IRSTS);
iren = nvt_cir_reg_read(nvt, CIR_IREN);
+ /* At least NCT6779D creates a spurious interrupt when the
+ * logical device is being disabled.
+ */
+ if (status == 0xff && iren == 0xff) {
+ spin_unlock_irqrestore(&nvt->nvt_lock, flags);
+ nvt_dbg_verbose("Spurious interrupt detected");
+ return IRQ_HANDLED;
+ }
+
/* IRQ may be shared with CIR WAKE, therefore check for each
* status bit whether the related interrupt source is enabled
*/