--- a/drivers/i2c/busses/i2c-bcm2835.c
+++ b/drivers/i2c/busses/i2c-bcm2835.c
-@@ -56,6 +56,18 @@
+@@ -61,6 +61,18 @@
#define BCM2835_I2C_CDIV_MIN 0x0002
#define BCM2835_I2C_CDIV_MAX 0xFFFE
struct bcm2835_i2c_dev {
struct device *dev;
void __iomem *regs;
-@@ -69,8 +81,78 @@ struct bcm2835_i2c_dev {
+@@ -74,8 +86,78 @@ struct bcm2835_i2c_dev {
u32 msg_err;
u8 *msg_buf;
size_t msg_buf_remaining;
static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev,
u32 reg, u32 val)
{
-@@ -189,6 +271,7 @@ static void bcm2835_i2c_start_transfer(s
+@@ -194,6 +276,7 @@ static void bcm2835_i2c_start_transfer(s
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_A, msg->addr);
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_DLEN, msg->len);
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
}
static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev)
-@@ -215,6 +298,7 @@ static irqreturn_t bcm2835_i2c_isr(int t
+@@ -220,6 +303,7 @@ static irqreturn_t bcm2835_i2c_isr(int t
u32 val, err;
val = bcm2835_i2c_readl(i2c_dev, BCM2835_I2C_S);
err = val & (BCM2835_I2C_S_CLKT | BCM2835_I2C_S_ERR);
if (err) {
-@@ -281,6 +365,13 @@ static int bcm2835_i2c_xfer(struct i2c_a
+@@ -286,6 +370,13 @@ static int bcm2835_i2c_xfer(struct i2c_a
unsigned long time_left;
int i, ret;
for (i = 0; i < (num - 1); i++)
if (msgs[i].flags & I2C_M_RD) {
dev_warn_once(i2c_dev->dev,
-@@ -301,6 +392,11 @@ static int bcm2835_i2c_xfer(struct i2c_a
+@@ -306,6 +397,11 @@ static int bcm2835_i2c_xfer(struct i2c_a
time_left = wait_for_completion_timeout(&i2c_dev->completion,
adap->timeout);
bcm2835_i2c_finish_transfer(i2c_dev);
if (!time_left) {
-@@ -313,7 +409,9 @@ static int bcm2835_i2c_xfer(struct i2c_a
+@@ -318,7 +414,9 @@ static int bcm2835_i2c_xfer(struct i2c_a
if (!i2c_dev->msg_err)
return num;