|
@@ -552,6 +552,9 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id)
|
|
|
|
|
|
spin_lock(&bus->lock);
|
|
spin_lock(&bus->lock);
|
|
irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG);
|
|
irq_received = readl(bus->base + ASPEED_I2C_INTR_STS_REG);
|
|
|
|
+ /* Ack all interrupts except for Rx done */
|
|
|
|
+ writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE,
|
|
|
|
+ bus->base + ASPEED_I2C_INTR_STS_REG);
|
|
irq_remaining = irq_received;
|
|
irq_remaining = irq_received;
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_I2C_SLAVE)
|
|
#if IS_ENABLED(CONFIG_I2C_SLAVE)
|
|
@@ -584,8 +587,10 @@ static irqreturn_t aspeed_i2c_bus_irq(int irq, void *dev_id)
|
|
"irq handled != irq. expected 0x%08x, but was 0x%08x\n",
|
|
"irq handled != irq. expected 0x%08x, but was 0x%08x\n",
|
|
irq_received, irq_handled);
|
|
irq_received, irq_handled);
|
|
|
|
|
|
- /* Ack all interrupt bits. */
|
|
|
|
- writel(irq_received, bus->base + ASPEED_I2C_INTR_STS_REG);
|
|
|
|
|
|
+ /* Ack Rx done */
|
|
|
|
+ if (irq_received & ASPEED_I2CD_INTR_RX_DONE)
|
|
|
|
+ writel(ASPEED_I2CD_INTR_RX_DONE,
|
|
|
|
+ bus->base + ASPEED_I2C_INTR_STS_REG);
|
|
spin_unlock(&bus->lock);
|
|
spin_unlock(&bus->lock);
|
|
return irq_remaining ? IRQ_NONE : IRQ_HANDLED;
|
|
return irq_remaining ? IRQ_NONE : IRQ_HANDLED;
|
|
}
|
|
}
|