@@ -796,6 +796,19 @@ complete:
}
if (stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) {
u8 num_bytes = 1;
+
+ /*
+ * OMAP3 I2C Errata ID: i207
+ * Under certain rare conditions, RDR could be set again
+ * when the bus is busy, then clear and ignore the interrupt
+ */
+ if (!(stat & OMAP_I2C_STAT_RRDY) && (stat &
+ OMAP_I2C_STAT_BB)) {
+ /* clear RDR */
+ omap_i2c_ack_stat(dev, stat & OMAP_I2C_STAT_RDR);
+ dev_err(dev->dev, "I2C: RDR when bus is busy.\n");
+ return IRQ_HANDLED;
+ }
if (dev->fifo_size) {
if (stat & OMAP_I2C_STAT_RRDY)
num_bytes = dev->fifo_size;