[PATCH] media: ite-cir: ignore interrupts when they are not pending

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On an Intel NUC6iSYK, during suspend an interrupt is sometimes received
by the driver even though there is no work pending. This results in an
infred overflow being recorded:

rc rc0: receive overflow

There is no receiver overflow at this time.

Signed-off-by: Sean Young <sean@xxxxxxxx>
---
 drivers/media/rc/ite-cir.c | 26 ++++++++++++++++----------
 drivers/media/rc/ite-cir.h |  1 +
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/media/rc/ite-cir.c b/drivers/media/rc/ite-cir.c
index fcfadd7ea31c..ffb0c2249010 100644
--- a/drivers/media/rc/ite-cir.c
+++ b/drivers/media/rc/ite-cir.c
@@ -234,6 +234,8 @@ static irqreturn_t ite_cir_isr(int irq, void *data)
 
 	/* read the interrupt flags */
 	iflags = dev->params->get_irq_causes(dev);
+	if (iflags == ITE_IRQ_NOT_PENDING)
+		return IRQ_RETVAL(IRQ_NONE);
 
 	/* Check for RX overflow */
 	if (iflags & ITE_IRQ_RX_FIFO_OVERRUN) {
@@ -498,16 +500,20 @@ static int it87_get_irq_causes(struct ite_dev *dev)
 	/* read the interrupt flags */
 	iflags = inb(dev->cir_addr + IT87_IIR) & IT87_II;
 
-	switch (iflags) {
-	case IT87_II_RXDS:
-		ret = ITE_IRQ_RX_FIFO;
-		break;
-	case IT87_II_RXFO:
-		ret = ITE_IRQ_RX_FIFO_OVERRUN;
-		break;
-	case IT87_II_TXLDL:
-		ret = ITE_IRQ_TX_FIFO;
-		break;
+	if (!(iflags & IT87_IP)) {
+		ret = ITE_IRQ_NOT_PENDING;
+	} else {
+		switch (iflags) {
+		case IT87_II_RXDS:
+			ret = ITE_IRQ_RX_FIFO;
+			break;
+		case IT87_II_RXFO:
+			ret = ITE_IRQ_RX_FIFO_OVERRUN;
+			break;
+		case IT87_II_TXLDL:
+			ret = ITE_IRQ_TX_FIFO;
+			break;
+		}
 	}
 
 	return ret;
diff --git a/drivers/media/rc/ite-cir.h b/drivers/media/rc/ite-cir.h
index 4b4294d77555..8df392bd9af7 100644
--- a/drivers/media/rc/ite-cir.h
+++ b/drivers/media/rc/ite-cir.h
@@ -16,6 +16,7 @@
 #define ITE_IRQ_TX_FIFO        1
 #define ITE_IRQ_RX_FIFO        2
 #define ITE_IRQ_RX_FIFO_OVERRUN    4
+#define ITE_IRQ_NOT_PENDING    8
 
 /* forward declaration */
 struct ite_dev;
-- 
2.38.0




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux