Message ID | 1417448047-15236-3-git-send-email-grygorii.strashko@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Dec 01, 2014 at 05:34:04PM +0200, Grygorii Strashko wrote: > According to I2C specification the NACK should be handled as follows: > "When SDA remains HIGH during this ninth clock pulse, this is defined as the Not > Acknowledge signal. The master can then generate either a STOP condition to > abort the transfer, or a repeated START condition to start a new transfer." > [I2C spec Rev. 6, 3.1.6: http://www.nxp.com/documents/user_manual/UM10204.pdf] > > Currently the Davinci i2c driver interrupts the transfer on receipt of a > NACK but fails to send a STOP in some situations and so makes the bus > stuck until next I2C IP reset (idle/enable). > > For example, the issue will happen during SMBus read transfer which > consists from two i2c messages write command/address and read data: > > S Slave Address Wr A Command Code A Sr Slave Address Rd A D1..Dn A P Applied to for-current, thanks!
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 25e8e25..17e1203 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c @@ -411,11 +411,9 @@ i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) if (dev->cmd_err & DAVINCI_I2C_STR_NACK) { if (msg->flags & I2C_M_IGNORE_NAK) return msg->len; - if (stop) { - w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); - w |= DAVINCI_I2C_MDR_STP; - davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); - } + w = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); + w |= DAVINCI_I2C_MDR_STP; + davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, w); return -EREMOTEIO; } return -EIO;