From f8366dd86d97b304f6e64dde194fdf3b9f027452 Mon Sep 17 00:00:00 2001 From: hgt463 Date: Wed, 6 Dec 2017 17:05:48 +0800 Subject: [PATCH] i2c-octeon driver improvement: - extend i2c bus recovery from octeon_i2c_start() to octeon_i2c_xfer(), for some case octeon TWSI high level control may fail. Signed-off-by: hgt463 --- drivers/i2c/busses/i2c-octeon-core.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c index 1d87757..4bbaa01 100644 --- a/drivers/i2c/busses/i2c-octeon-core.c +++ b/drivers/i2c/busses/i2c-octeon-core.c @@ -271,17 +271,13 @@ static int octeon_i2c_start(struct octeon_i2c *i2c) octeon_i2c_ctl_write(i2c, TWSI_CTL_ENAB | TWSI_CTL_STA); ret = octeon_i2c_wait(i2c); if (ret) - goto error; + return ret; stat = octeon_i2c_stat_read(i2c); if (stat == STAT_START || stat == STAT_REP_START) /* START successful, bail out */ return 0; - -error: - /* START failed, try to recover */ - ret = octeon_i2c_recovery(i2c); - return (ret) ? ret : -EAGAIN; + return -EIO; } /* send STOP to the bus */ @@ -639,7 +635,7 @@ int octeon_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) ret = octeon_i2c_start(i2c); if (ret) - return ret; + goto out; if (pmsg->flags & I2C_M_RD) ret = octeon_i2c_read(i2c, pmsg->addr, pmsg->buf, @@ -650,7 +646,12 @@ int octeon_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) } octeon_i2c_stop(i2c); out: - return (ret != 0) ? ret : num; + if (ret != 0) { + ret = octeon_i2c_recovery(i2c); + return (ret) ? ret : -EAGAIN; + } + + return num; } /* calculate and set clock divisors */ -- 1.7.1