Carry out NACK and AL handling to main event loop as it should be.

The change affects omap3530 and early boards.
Tested and simulated on omap3730 (Beagleboard XM C).

Signed-off-by: Alexander Kochetkov <[email protected]>
---
 drivers/i2c/busses/i2c-omap.c |   39 ++++++---------------------------------
 1 file changed, 6 insertions(+), 33 deletions(-)

diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
index 53b4234..8591c0c 100644
--- a/drivers/i2c/busses/i2c-omap.c
+++ b/drivers/i2c/busses/i2c-omap.c
@@ -907,22 +907,8 @@ static int errata_omap3_i462(struct omap_i2c_dev *dev)
                if (stat & OMAP_I2C_STAT_XUDF)
                        break;
 
-               if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
-                       omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_XRDY |
-                                                       OMAP_I2C_STAT_XDR));
-                       if (stat & OMAP_I2C_STAT_NACK) {
-                               dev->cmd_err |= OMAP_I2C_STAT_NACK;
-                               omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK);
-                       }
-
-                       if (stat & OMAP_I2C_STAT_AL) {
-                               dev_err(dev->dev, "Arbitration lost\n");
-                               dev->cmd_err |= OMAP_I2C_STAT_AL;
-                               omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL);
-                       }
-
+               if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL))
                        return -EIO;
-               }
 
                cpu_relax();
        } while (--timeout);
@@ -956,7 +942,7 @@ static void omap_i2c_receive_data(struct omap_i2c_dev *dev, 
u8 num_bytes,
        }
 }
 
-static int omap_i2c_transmit_data(struct omap_i2c_dev *dev, u8 num_bytes,
+static void omap_i2c_transmit_data(struct omap_i2c_dev *dev, u8 num_bytes,
                bool is_xdr)
 {
        u16             w;
@@ -975,17 +961,12 @@ static int omap_i2c_transmit_data(struct omap_i2c_dev 
*dev, u8 num_bytes,
                }
 
                if (dev->errata & I2C_OMAP_ERRATA_I462) {
-                       int ret;
-
-                       ret = errata_omap3_i462(dev);
-                       if (ret < 0)
-                               return ret;
+                       if (errata_omap3_i462(dev))
+                               break;
                }
 
                omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
        }
-
-       return 0;
 }
 
 static irqreturn_t
@@ -1101,30 +1082,22 @@ omap_i2c_isr_thread(int this_irq, void *dev_id)
 
                if (stat & OMAP_I2C_STAT_XDR) {
                        u8 num_bytes = 1;
-                       int ret;
 
                        if (dev->fifo_size)
                                num_bytes = dev->buf_len;
 
-                       ret = omap_i2c_transmit_data(dev, num_bytes, true);
-                       if (ret < 0)
-                               break;
-
+                       omap_i2c_transmit_data(dev, num_bytes, true);
                        omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR);
                        continue;
                }
 
                if (stat & OMAP_I2C_STAT_XRDY) {
                        u8 num_bytes = 1;
-                       int ret;
 
                        if (dev->threshold)
                                num_bytes = dev->threshold;
 
-                       ret = omap_i2c_transmit_data(dev, num_bytes, false);
-                       if (ret < 0)
-                               break;
-
+                       omap_i2c_transmit_data(dev, num_bytes, false);
                        omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY);
                        continue;
                }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to