On Wed, Jul 11, 2012 at 10:22 PM, Shubhrajyoti <[email protected]> wrote:
> On Wednesday 11 July 2012 09:53 PM, Yegor Yefremov wrote:
[...]
Yegor I have made a patch to ignore the NACK in the ISR let me know if
that helps you.


diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 9895fa7..e13061f 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -476,6 +476,8 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,

        if (msg->len == 0)
                return -EINVAL;
+       if (msg->flags & I2C_M_IGNORE_NAK)
+               dev->flags |= OMAP_I2C_FLAG_NO_NAK;

        omap_i2c_write_reg(dev, OMAP_I2C_SA_REG, msg->addr);

@@ -776,18 +778,26 @@ complete:
                                ~(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 &&
+                               !(dev->flags & OMAP_I2C_FLAG_NO_NAK)) {
                        err |= OMAP_I2C_STAT_NACK;
+                       omap_i2c_ack_stat(dev, stat &
+                               (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
+                               OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR |
+                               OMAP_I2C_STAT_ARDY));
+                       omap_i2c_complete_cmd(dev, err);
+                       return IRQ_HANDLED;
+               }

                if (stat & OMAP_I2C_STAT_AL) {
                        dev_err(dev->dev, "Arbitration lost\n");
                        err |= OMAP_I2C_STAT_AL;
                }
+
                /*
                 * ProDB0017052: Clear ARDY bit twice
                 */
-               if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
-                                       OMAP_I2C_STAT_AL)) {
+               if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_AL)) {
                        omap_i2c_ack_stat(dev, stat &
                                (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR |
                                OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR |
diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h
index 92a0dc7..f386150 100644
--- a/include/linux/i2c-omap.h
+++ b/include/linux/i2c-omap.h
@@ -29,6 +29,7 @@
 #define OMAP_I2C_FLAG_BUS_SHIFT_1              BIT(7)
 #define OMAP_I2C_FLAG_BUS_SHIFT_2              BIT(8)
 #define OMAP_I2C_FLAG_BUS_SHIFT__SHIFT 7
+#define OMAP_I2C_FLAG_NO_NAK                   BIT(9)

 struct omap_i2c_bus_platform_data {
        u32             clkrate;
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to