diff options
-rw-r--r-- | drivers/i2c/busses/i2c-aspeed.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-aspeed.c index a7be6f24450b..b63ecc20777e 100644 --- a/drivers/i2c/busses/i2c-aspeed.c +++ b/drivers/i2c/busses/i2c-aspeed.c @@ -600,6 +600,17 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id) spin_lock(&bus->lock); irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG); + + /* + * On the AST2600, interrupts have been observed with no interrupt + * status bits set. In this case, the handler should return IRQ_NONE + * immediately to prevent driver state machine corruption. + */ + if (!irq_received) { + spin_unlock(&bus->lock); + return IRQ_NONE; + } + /* Ack all interrupts except for Rx done */ writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE, bus->base + ASPEED_I2C_INTR_STS_REG); |