From: kfx Date: Fri, 31 Aug 2012 02:45:32 +0000 (+0800) Subject: i2c transfer: udelay(instead of wait_event_timeout) if system is in atomic state X-Git-Tag: firefly_0821_release~8765^2~12 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=259b1a311e2845631b837533fa71ea405a507765;p=firefly-linux-kernel-4.4.55.git i2c transfer: udelay(instead of wait_event_timeout) if system is in atomic state --- 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;