From 62cd232bc55aba47b37538143266cbfd08caa2eb Mon Sep 17 00:00:00 2001 From: Jason Marini Date: Thu, 28 Aug 2008 15:30:58 -0400 Subject: [PATCH] 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: Jason P Marini Signed-off-by: Tony Lindgren --- drivers/i2c/busses/i2c-omap.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 5058a47e982..0f7cbe8f5ce 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; -- 2.41.1