|
@@ -725,27 +725,30 @@ omap_i2c_omap1_isr(int this_irq, void *dev_id)
|
|
|
* data to DATA_REG. Otherwise some data bytes can be lost while transferring
|
|
|
* them from the memory to the I2C interface.
|
|
|
*/
|
|
|
-static int errata_omap3_i462(struct omap_i2c_dev *dev, u16 *stat, int *err)
|
|
|
+static int errata_omap3_i462(struct omap_i2c_dev *dev)
|
|
|
{
|
|
|
unsigned long timeout = 10000;
|
|
|
+ u16 stat;
|
|
|
|
|
|
- while (--timeout && !(*stat & OMAP_I2C_STAT_XUDF)) {
|
|
|
- if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) {
|
|
|
+ do {
|
|
|
+ stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
|
|
|
+ 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));
|
|
|
- return -ETIMEDOUT;
|
|
|
+ return -EIO;
|
|
|
}
|
|
|
|
|
|
cpu_relax();
|
|
|
- *stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG);
|
|
|
- }
|
|
|
+ } while (--timeout);
|
|
|
|
|
|
if (!timeout) {
|
|
|
dev_err(dev->dev, "timeout waiting on XUDF bit\n");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- *err |= OMAP_I2C_STAT_XUDF;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -903,9 +906,16 @@ complete:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ((dev->errata & I2C_OMAP_ERRATA_I462) &&
|
|
|
- errata_omap3_i462(dev, &stat, &err))
|
|
|
- goto complete;
|
|
|
+ if (dev->errata & I2C_OMAP_ERRATA_I462) {
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = errata_omap3_i462(dev);
|
|
|
+ stat = omap_i2c_read_reg(dev,
|
|
|
+ OMAP_I2C_STAT_REG);
|
|
|
+
|
|
|
+ if (ret < 0)
|
|
|
+ goto complete;
|
|
|
+ }
|
|
|
|
|
|
omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
|
|
|
}
|
|
@@ -943,9 +953,16 @@ complete:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if ((dev->errata & I2C_OMAP_ERRATA_I462) &&
|
|
|
- errata_omap3_i462(dev, &stat, &err))
|
|
|
- goto complete;
|
|
|
+ if (dev->errata & I2C_OMAP_ERRATA_I462) {
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = errata_omap3_i462(dev);
|
|
|
+ stat = omap_i2c_read_reg(dev,
|
|
|
+ OMAP_I2C_STAT_REG);
|
|
|
+
|
|
|
+ if (ret < 0)
|
|
|
+ goto complete;
|
|
|
+ }
|
|
|
|
|
|
omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w);
|
|
|
}
|