|
|
@@ -191,6 +191,15 @@ static void bcm2835_i2c_start_transfer(struct bcm2835_i2c_dev *i2c_dev)
|
|
|
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C, c);
|
|
|
}
|
|
|
|
|
|
+static void bcm2835_i2c_finish_transfer(struct bcm2835_i2c_dev *i2c_dev)
|
|
|
+{
|
|
|
+ i2c_dev->curr_msg = NULL;
|
|
|
+ i2c_dev->num_msgs = 0;
|
|
|
+
|
|
|
+ i2c_dev->msg_buf = NULL;
|
|
|
+ i2c_dev->msg_buf_remaining = 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Note about I2C_C_CLEAR on error:
|
|
|
* The I2C_C_CLEAR on errors will take some time to resolve -- if you were in
|
|
|
@@ -291,6 +300,9 @@ static int bcm2835_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
|
|
|
|
|
|
time_left = wait_for_completion_timeout(&i2c_dev->completion,
|
|
|
adap->timeout);
|
|
|
+
|
|
|
+ bcm2835_i2c_finish_transfer(i2c_dev);
|
|
|
+
|
|
|
if (!time_left) {
|
|
|
bcm2835_i2c_writel(i2c_dev, BCM2835_I2C_C,
|
|
|
BCM2835_I2C_C_CLEAR);
|