update i2c: no ack interrupt do not return -ETIMEDOUT
authorkfx <kfx@rock-chips.com>
Sun, 23 Jan 2011 10:32:12 +0000 (18:32 +0800)
committerkfx <kfx@rock-chips.com>
Sun, 23 Jan 2011 10:32:12 +0000 (18:32 +0800)
drivers/i2c/busses/i2c-rk29.c

index 3a7eff5350756adb317492e66a7feb6dee2f841a..9912446c7e5ca059a684e9483e63646320c49c8c 100755 (executable)
@@ -269,7 +269,7 @@ static int rk29_wait_event(struct rk29_i2c_data *i2c,
        {
                init_completion(&i2c->cmd_complete);
                ret = wait_for_completion_interruptible_timeout(&i2c->cmd_complete,
-                                                               RK29_I2C_TIMEOUT(40000 * 1000/i2c->scl_rate));
+                                                               RK29_I2C_TIMEOUT(4000 * 1000/i2c->scl_rate));
        }
        else
        {
@@ -283,7 +283,9 @@ static int rk29_wait_event(struct rk29_i2c_data *i2c,
        }
        if(ret == 0)
        {
-               return -ETIMEDOUT;
+               i2c_err(i2c->dev, "i2c wait for envent timeout, but not return -ETIMEDOUT\n");
+               return 0;
+               //return -ETIMEDOUT;
        }
        return 0;
 }
@@ -332,7 +334,7 @@ static int rk29_send_2nd_addr(struct rk29_i2c_data *i2c,
                return ret;
        }
        lsr = readl(i2c->regs + I2C_LSR);
-       if(lsr & I2C_LSR_RCV_NAK)
+       if((lsr & I2C_LSR_RCV_NAK) && !(msg->flags & I2C_M_IGNORE_NAK))
                return -EINVAL;
        return ret;
 }
@@ -373,8 +375,11 @@ static int rk29_send_address(struct rk29_i2c_data *i2c,
                return ret;
        }
        lsr = readl(i2c->regs + I2C_LSR);
-       if(lsr & I2C_LSR_RCV_NAK)
+       if((lsr & I2C_LSR_RCV_NAK) && !(msg->flags & I2C_M_IGNORE_NAK))
+       {
+               dev_info(i2c->dev, "addr: 0x%x receive no ack\n", msg->addr);
                return -EINVAL;
+       }
        if(start && (msg->flags & I2C_M_TEN))
                ret = rk29_send_2nd_addr(i2c, msg, start);
        return ret;
@@ -400,7 +405,7 @@ static int rk29_i2c_send_msg(struct rk29_i2c_data *i2c, struct i2c_msg *msg)
                if((ret = rk29_wait_event(i2c, RK29_EVENT_MTX_RCVD_ACK)) != 0)
                        return ret;
                lsr = readl(i2c->regs + I2C_LSR);
-               if((lsr & I2C_LSR_RCV_NAK) && (i != msg->len -1))
+               if((lsr & I2C_LSR_RCV_NAK) && (i != msg->len -1) && !(msg->flags & I2C_M_IGNORE_NAK))
                        return -EINVAL;
 
        }