i2c transfer: udelay(instead of wait_event_timeout) if system is in atomic state
authorkfx <kfx@rock-chips.com>
Fri, 31 Aug 2012 02:45:32 +0000 (10:45 +0800)
committerkfx <kfx@rock-chips.com>
Fri, 31 Aug 2012 02:45:32 +0000 (10:45 +0800)
drivers/i2c/busses/i2c-rk30-adapter.c

index d55eede52145c3752f8b7b2bafe00f4484697172..7149d35ca44ae5ef3a4f71eae28d71ee5e17eddb 100755 (executable)
@@ -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;