Commit 2a010461 authored by Baolin Wang's avatar Baolin Wang Committed by Wolfram Sang

i2c: sprd: Fix the i2c count issue

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: default avatarBaolin Wang <baolin.wang@linaro.org>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent da33aa03
...@@ -368,13 +368,12 @@ static irqreturn_t sprd_i2c_isr_thread(int irq, void *dev_id) ...@@ -368,13 +368,12 @@ static irqreturn_t sprd_i2c_isr_thread(int irq, void *dev_id)
struct sprd_i2c *i2c_dev = dev_id; struct sprd_i2c *i2c_dev = dev_id;
struct i2c_msg *msg = i2c_dev->msg; struct i2c_msg *msg = i2c_dev->msg;
bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK); bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK);
u32 i2c_count = readl(i2c_dev->base + I2C_COUNT);
u32 i2c_tran; u32 i2c_tran;
if (msg->flags & I2C_M_RD) if (msg->flags & I2C_M_RD)
i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD; i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD;
else else
i2c_tran = i2c_count; i2c_tran = i2c_dev->count;
/* /*
* If we got one ACK from slave when writing data, and we did not * 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, void *dev_id) ...@@ -412,14 +411,13 @@ static irqreturn_t sprd_i2c_isr(int irq, void *dev_id)
{ {
struct sprd_i2c *i2c_dev = dev_id; struct sprd_i2c *i2c_dev = dev_id;
struct i2c_msg *msg = i2c_dev->msg; 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); bool ack = !(readl(i2c_dev->base + I2C_STATUS) & I2C_RX_ACK);
u32 i2c_tran; u32 i2c_tran;
if (msg->flags & I2C_M_RD) if (msg->flags & I2C_M_RD)
i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD; i2c_tran = i2c_dev->count >= I2C_FIFO_FULL_THLD;
else else
i2c_tran = i2c_count; i2c_tran = i2c_dev->count;
/* /*
* If we did not get one ACK from slave when writing data, then we * If we did not get one ACK from slave when writing data, then we
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment