{
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
{
}
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;
}
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;
}
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;
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;
}