i2c-omap: Fix I2C status ACK
authorNishanth Menon <nm@ti.com>
Thu, 20 Aug 2009 16:21:14 +0000 (11:21 -0500)
committerBen Dooks <ben-linux@fluff.org>
Thu, 20 Aug 2009 21:27:57 +0000 (22:27 +0100)
I2C status ack for [RX]RDR and [RX]RDY could
cause race conditions of clearing the event
twice and a violation of the programing
sequence as defined in TRM This patch fixes
the same.

Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
drivers/i2c/busses/i2c-omap.c

index d258b02aef44c4ef99c38d58b5da84a2d943b3c6..94639d0aabd58b936a1406dfabc47213dc43e6c7 100644 (file)
@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
 
                err = 0;
 complete:
-               omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat);
+               /*
+                * Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
+                * acked after the data operation is complete.
+                * Ref: TRM SWPU114Q Figure 18-31
+                */
+               omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat &
+                               ~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
+                               OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR));
 
                if (stat & OMAP_I2C_STAT_NACK) {
                        err |= OMAP_I2C_STAT_NACK;