From f8366dd86d97b304f6e64dde194fdf3b9f027452 Mon Sep 17 00:00:00 2001
From: hgt463 <sean.c.zhang@nokia.com>
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 <sean.c.zhang@nokia.com>
---
 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

