| From foo@baz Sun Jun 17 12:07:33 CEST 2018 |
| From: Baolin Wang <baolin.wang@linaro.org> |
| Date: Mon, 9 Apr 2018 14:40:55 +0800 |
| Subject: i2c: sprd: Fix the i2c count issue |
| |
| From: Baolin Wang <baolin.wang@linaro.org> |
| |
| [ Upstream commit 2a010461207cc96bee5ab81748325dec1972976f ] |
| |
| We found the I2C controller count register is unreliable sometimes, |
| that will cause I2C to lose data. Thus we can read the data count |
| from 'i2c_dev->count' instead of the I2C controller count register. |
| |
| Signed-off-by: Baolin Wang <baolin.wang@linaro.org> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/i2c/busses/i2c-sprd.c | 6 ++---- |
| 1 file changed, 2 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/i2c/busses/i2c-sprd.c |
| +++ b/drivers/i2c/busses/i2c-sprd.c |
| @@ -368,13 +368,12 @@ static irqreturn_t sprd_i2c_isr_thread(i |
| struct sprd_i2c *i2c_dev = dev_id; |
| struct i2c_msg *msg = i2c_dev->msg; |
| bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); |
| - u32 i2c_count = readl(i2c_dev->base + I2C_COUNT); |
| u32 i2c_tran; |
| |
| if (msg->flags & I2C_M_RD) |
| i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD; |
| else |
| - i2c_tran = i2c_count; |
| + i2c_tran = i2c_dev->count; |
| |
| /* |
| * If we got one ACK from slave when writing data, and we did not |
| @@ -412,14 +411,13 @@ static irqreturn_t sprd_i2c_isr(int irq, |
| { |
| struct sprd_i2c *i2c_dev = dev_id; |
| struct i2c_msg *msg = i2c_dev->msg; |
| - u32 i2c_count = readl(i2c_dev->base + I2C_COUNT); |
| bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); |
| u32 i2c_tran; |
| |
| if (msg->flags & I2C_M_RD) |
| i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD; |
| else |
| - i2c_tran = i2c_count; |
| + i2c_tran = i2c_dev->count; |
| |
| /* |
| * If we did not get one ACK from slave when writing data, then we |