diff mbox

I2C:OMAP: fix status ack

Message ID 1245915601-6575-1-git-send-email-nm@ti.com (mailing list archive)
State Awaiting Upstream, archived
Headers show

Commit Message

Nishanth Menon June 25, 2009, 7:40 a.m. UTC
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.

Issue identified by Jagadeesh Pakaravoor
and Ulrik Bech Hald.

Signed-off-by: Nishanth Menon <nm@ti.com>
---
 drivers/i2c/busses/i2c-omap.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index ece0125..0db0051 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -651,7 +651,14 @@  omap_i2c_isr(int this_irq, void *dev_id)
 			break;
 		}
 
-		omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat);
+		/*
+		 * Ack the stat in one go, but [rx]dr and [rx]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));
 
 		err = 0;
 		if (stat & OMAP_I2C_STAT_NACK) {