Revert "i2c: xiic: Try re-initialization on bus busy timeout"
This reverts commit 697cea0298
.
This commit is contained in:
parent
ab0cd5df1b
commit
61b6acbdcf
1 changed files with 15 additions and 26 deletions
|
@ -540,11 +540,23 @@ static int xiic_bus_busy(struct xiic_i2c *i2c)
|
||||||
return (sr & XIIC_SR_BUS_BUSY_MASK) ? -EBUSY : 0;
|
return (sr & XIIC_SR_BUS_BUSY_MASK) ? -EBUSY : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xiic_wait_not_busy(struct xiic_i2c *i2c)
|
static int xiic_busy(struct xiic_i2c *i2c)
|
||||||
{
|
{
|
||||||
int tries = 3;
|
int tries = 3;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (i2c->tx_msg || i2c->rx_msg)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
/* In single master mode bus can only be busy, when in use by this
|
||||||
|
* driver. If the register indicates bus being busy for some reason we
|
||||||
|
* should ignore it, since bus will never be released and i2c will be
|
||||||
|
* stuck forever.
|
||||||
|
*/
|
||||||
|
if (i2c->singlemaster) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* for instance if previous transfer was terminated due to TX error
|
/* for instance if previous transfer was terminated due to TX error
|
||||||
* it might be that the bus is on it's way to become available
|
* it might be that the bus is on it's way to become available
|
||||||
* give it at most 3 ms to wake
|
* give it at most 3 ms to wake
|
||||||
|
@ -698,36 +710,13 @@ static int xiic_start_xfer(struct xiic_i2c *i2c, struct i2c_msg *msgs, int num)
|
||||||
|
|
||||||
mutex_lock(&i2c->lock);
|
mutex_lock(&i2c->lock);
|
||||||
|
|
||||||
if (i2c->tx_msg || i2c->rx_msg) {
|
ret = xiic_busy(i2c);
|
||||||
|
if (ret) {
|
||||||
dev_err(i2c->adap.dev.parent,
|
dev_err(i2c->adap.dev.parent,
|
||||||
"cannot start a transfer while busy\n");
|
"cannot start a transfer while busy\n");
|
||||||
ret = -EBUSY;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In single master mode bus can only be busy, when in use by this
|
|
||||||
* driver. If the register indicates bus being busy for some reason we
|
|
||||||
* should ignore it, since bus will never be released and i2c will be
|
|
||||||
* stuck forever.
|
|
||||||
*/
|
|
||||||
if (!i2c->singlemaster) {
|
|
||||||
ret = xiic_wait_not_busy(i2c);
|
|
||||||
if (ret) {
|
|
||||||
/* If the bus is stuck in a busy state, such as due to spurious low
|
|
||||||
* pulses on the bus causing a false start condition to be detected,
|
|
||||||
* then try to recover by re-initializing the controller and check
|
|
||||||
* again if the bus is still busy.
|
|
||||||
*/
|
|
||||||
dev_warn(i2c->adap.dev.parent, "I2C bus busy timeout, reinitializing\n");
|
|
||||||
ret = xiic_reinit(i2c);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
ret = xiic_wait_not_busy(i2c);
|
|
||||||
if (ret)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i2c->tx_msg = msgs;
|
i2c->tx_msg = msgs;
|
||||||
i2c->rx_msg = NULL;
|
i2c->rx_msg = NULL;
|
||||||
i2c->nmsgs = num;
|
i2c->nmsgs = num;
|
||||||
|
|
Loading…
Add table
Reference in a new issue