From 259b1a311e2845631b837533fa71ea405a507765 Mon Sep 17 00:00:00 2001 From: kfx Date: Fri, 31 Aug 2012 10:45:32 +0800 Subject: [PATCH] i2c transfer: udelay(instead of wait_event_timeout) if system is in atomic state --- drivers/i2c/busses/i2c-rk30-adapter.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/i2c/busses/i2c-rk30-adapter.c b/drivers/i2c/busses/i2c-rk30-adapter.c index d55eede52145..7149d35ca44a 100755 --- a/drivers/i2c/busses/i2c-rk30-adapter.c +++ b/drivers/i2c/busses/i2c-rk30-adapter.c @@ -490,7 +490,13 @@ static int rk30_i2c_doxfer(struct rk30_i2c *i2c, rk30_i2c_enable(i2c, (i2c->count > 32)?0:1); //if count > 32, byte(32) send ack - timeout = wait_event_timeout(i2c->wait, (i2c->is_busy == 0), msecs_to_jiffies(I2C_WAIT_TIMEOUT)); + if (in_atomic()){ + int tmo = I2C_WAIT_TIMEOUT * USEC_PER_MSEC; + while(tmo-- && i2c->is_busy != 0) + udelay(1); + timeout = (tmo <= 0)?0:1; + }else + timeout = wait_event_timeout(i2c->wait, (i2c->is_busy == 0), msecs_to_jiffies(I2C_WAIT_TIMEOUT)); spin_lock_irqsave(&i2c->lock, flags); i2c->state = STATE_IDLE; -- 2.34.1