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 <al.kochet@xxxxxxxxx> --- 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-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html