@@ -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;
@@ -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;
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@mess.org> --- drivers/media/rc/ite-cir.c | 26 ++++++++++++++++---------- drivers/media/rc/ite-cir.h | 1 + 2 files changed, 17 insertions(+), 10 deletions(-)