i2c: omap: bus: add a receiver flag
authorFelipe Balbi <balbi@ti.com>
Wed, 12 Sep 2012 10:58:06 +0000 (16:28 +0530)
committerWolfram Sang <w.sang@pengutronix.de>
Wed, 12 Sep 2012 13:03:05 +0000 (15:03 +0200)
that way we can ignore TX IRQs while in receiver
mode and ignore RX IRQs while in transmitter mode.

Signed-off-by: Felipe Balbi <balbi@ti.com>
[Remove unnecessary braces]
Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
drivers/i2c/busses/i2c-omap.c

index 0da8169ca5b4902505b972a2585d4ee95844c0a4..3be147ab4eb9809b168fa8c5f4c247e8b68ab31f 100644 (file)
@@ -199,6 +199,7 @@ struct omap_i2c_dev {
                                                 */
        u8                      rev;
        unsigned                b_hw:1;         /* bad h/w fixes */
+       unsigned                receiver:1;     /* true when we're in receiver mode */
        u16                     iestate;        /* Saved interrupt register */
        u16                     pscstate;
        u16                     scllstate;
@@ -492,6 +493,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
 
        INIT_COMPLETION(dev->cmd_complete);
        dev->cmd_err = 0;
+       dev->receiver = !!(msg->flags & I2C_M_RD);
 
        w = OMAP_I2C_CON_EN | OMAP_I2C_CON_MST | OMAP_I2C_CON_STT;
 
@@ -837,6 +839,12 @@ omap_i2c_isr(int this_irq, void *dev_id)
                stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
                stat &= bits;
 
+               /* If we're in receiver mode, ignore XDR/XRDY */
+               if (dev->receiver)
+                       stat &= ~(OMAP_I2C_STAT_XDR | OMAP_I2C_STAT_XRDY);
+               else
+                       stat &= ~(OMAP_I2C_STAT_RDR | OMAP_I2C_STAT_RRDY);
+
                if (!stat) {
                        /* my work here is done */
                        return IRQ_HANDLED;