i2c-omap: Fix I2C status ACK

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>
This commit is contained in:
Nishanth Menon 2009-08-20 11:21:14 -05:00 committed by Ben Dooks
parent 64f1607ffb
commit dcc4ec2694

View file

@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
err = 0; err = 0;
complete: 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) { if (stat & OMAP_I2C_STAT_NACK) {
err |= OMAP_I2C_STAT_NACK; err |= OMAP_I2C_STAT_NACK;