Commit 62cd232b authored by Jason Marini's avatar Jason Marini Committed by Tony Lindgren

ARM: OMAP: Fix occasional i2c driver hang

The i2c driver contains a while loop that has no timeout.  If i2c is in a
funky state and OMAP_I2C_CON_STT remains asserted, the kernel hangs.  Insert
the standard i2c timeout into the loop.
Signed-off-by: default avatarJason P Marini <jason.marini@gmail.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 4139f42e
...@@ -440,9 +440,16 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, ...@@ -440,9 +440,16 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap,
omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w); omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w);
if (dev->b_hw && stop) { if (dev->b_hw && stop) {
unsigned long delay = jiffies + OMAP_I2C_TIMEOUT;
/* H/w behavior: dont write stt and stp together.. */ /* H/w behavior: dont write stt and stp together.. */
while (omap_i2c_read_reg(dev, OMAP_I2C_CON_REG) & OMAP_I2C_CON_STT) { while (omap_i2c_read_reg(dev, OMAP_I2C_CON_REG) & OMAP_I2C_CON_STT) {
/* Dont do anything - this will come in a couple of loops at max*/ /* Let the user know if i2c is in a bad state */
if (time_after (jiffies, delay)) {
dev_err(dev->dev, "controller timed out "
"waiting for start condition to finish\n");
return -ETIMEDOUT;
}
} }
w |= OMAP_I2C_CON_STP; w |= OMAP_I2C_CON_STP;
w &= ~OMAP_I2C_CON_STT; w &= ~OMAP_I2C_CON_STT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment