i2c-omap: Bug in reading the RXSTAT/TXSTAT values from the I2C_BUFFSTAT register
authorSonasath, Moiz <m-sonasath@ti.com>
Tue, 21 Jul 2009 15:14:06 +0000 (10:14 -0500)
committerBen Dooks <ben-linux@fluff.org>
Thu, 30 Jul 2009 00:03:23 +0000 (01:03 +0100)
Fix bug in reading the I2C_BUFFSTAT register for getting byte count on RX/TX interrupt.

On Interrupt: I2C_STAT[RDR],
read 'RXSTAT' from I2C_BUFFSTAT[8-13]
On Interrupt: I2C_STAT[XDR]
read 'TXSTAT' from I2C_BUFFSTAT[0-5]

Signed-off-by: Jagadeesh Pakaravoor <j-pakaravoor@ti.com>
Signed-off-by: Moiz Sonasath <m-sonasath@ti.com>
Signed-off-by: Vikram pandita <vikram.pandita@ti.com>
[ben-linux@fluff.org: fixed mail format and added i2c-omap to subject]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
drivers/i2c/busses/i2c-omap.c

index f2b82ee39adf0c11ca4bce231539c841a47e32c3..a69665788513023f6bea92fc934e6092c500c313 100644 (file)
@@ -692,9 +692,10 @@ omap_i2c_isr(int this_irq, void *dev_id)
                        if (dev->fifo_size) {
                                if (stat & OMAP_I2C_STAT_RRDY)
                                        num_bytes = dev->fifo_size;
-                               else
-                                       num_bytes = omap_i2c_read_reg(dev,
-                                                       OMAP_I2C_BUFSTAT_REG);
+                               else    /* read RXSTAT on RDR interrupt */
+                                       num_bytes = (omap_i2c_read_reg(dev,
+                                                       OMAP_I2C_BUFSTAT_REG)
+                                                       >> 8) & 0x3F;
                        }
                        while (num_bytes) {
                                num_bytes--;
@@ -731,9 +732,10 @@ omap_i2c_isr(int this_irq, void *dev_id)
                        if (dev->fifo_size) {
                                if (stat & OMAP_I2C_STAT_XRDY)
                                        num_bytes = dev->fifo_size;
-                               else
+                               else    /* read TXSTAT on XDR interrupt */
                                        num_bytes = omap_i2c_read_reg(dev,
-                                                       OMAP_I2C_BUFSTAT_REG);
+                                                       OMAP_I2C_BUFSTAT_REG)
+                                                       & 0x3F;
                        }
                        while (num_bytes) {
                                num_bytes--;