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: Jason P Marini <jason.marini@xxxxxxxxx> --- drivers/i2c/busses/i2c-omap.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 3c4e581..3a7b6ef 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -440,9 +440,16 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, w); if (dev->b_hw && stop) { + unsigned long delay = jiffies + OMAP_I2C_TIMEOUT; + /* H/w behavior: dont write stt and stp together.. */ 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_STT; -- 1.5.5.1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html