summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Glauber <jglauber@cavium.com>2016-06-08 08:51:17 +0200
committerWolfram Sang <wsa@the-dreams.de>2016-06-09 22:05:32 +0200
commit908cf12bbca0f18a23085a5a35301509e034f0a9 (patch)
treec44ae9c764fa6129db2b998e7d27f9ab21b6a1f2
parenta7ae81952cdab56a1277bd2f9ed7284c0f575120 (diff)
downloadop-kernel-dev-908cf12bbca0f18a23085a5a35301509e034f0a9.zip
op-kernel-dev-908cf12bbca0f18a23085a5a35301509e034f0a9.tar.gz
i2c: octeon: Missing AAK flag in case of I2C_M_RECV_LEN
During receive the controller requires the AAK flag for all bytes but the final one. This was wrong in case of I2C_M_RECV_LEN, where the decision if the final byte is to be transmitted happened before adding the additional received length byte. Set the AAK flag if additional bytes are to be received. Signed-off-by: Jan Glauber <jglauber@cavium.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/i2c/busses/i2c-octeon.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-octeon.c b/drivers/i2c/busses/i2c-octeon.c
index aa5f01e..1922e4a 100644
--- a/drivers/i2c/busses/i2c-octeon.c
+++ b/drivers/i2c/busses/i2c-octeon.c
@@ -934,8 +934,15 @@ static int octeon_i2c_read(struct octeon_i2c *i2c, int target,
return result;
for (i = 0; i < length; i++) {
- /* for the last byte TWSI_CTL_AAK must not be set */
- if (i + 1 == length)
+ /*
+ * For the last byte to receive TWSI_CTL_AAK must not be set.
+ *
+ * A special case is I2C_M_RECV_LEN where we don't know the
+ * additional length yet. If recv_len is set we assume we're
+ * not reading the final byte and therefore need to set
+ * TWSI_CTL_AAK.
+ */
+ if ((i + 1 == length) && !(recv_len && i == 0))
final_read = true;
/* clear iflg to allow next event */
OpenPOWER on IntegriCloud