lm63/i2c-comcerto: Move check of I2C transaction time to the lm63 driver

The LM96063 temperature sensor resets its SMBus interface if SDA or SCL
are held low for more than 35ms. This happens occasionally on Comcerto
based systems. Commit 9d86835 implements a workaround in the Comcerto
I2C controller driver, however the fix causes problems with non-LM63
clients. This change moves the check for max I2C transaction time to the
lm63 driver.

Google-Bug-Id: 23689207

Change-Id: I87870dd4967b1f552fa136284838640d7fc524ca
diff --git a/drivers/hwmon/lm63.c b/drivers/hwmon/lm63.c
index 5984d54..4a15e04 100644
--- a/drivers/hwmon/lm63.c
+++ b/drivers/hwmon/lm63.c
@@ -44,6 +44,7 @@
 #include <linux/i2c.h>
 #include <linux/hwmon-sysfs.h>
 #include <linux/hwmon.h>
+#include <linux/ktime.h>
 #include <linux/err.h>
 #include <linux/mutex.h>
 #include <linux/sysfs.h>
@@ -238,9 +239,19 @@
 		u8 command, u8 value) {
 	s32 ret;
 	int retries = MAX_SMBUS_RETRIES;
+	ktime_t start_time;
+	s64 d;
 	while (retries-- > 0) {
+		start_time = ktime_get();
 		ret = i2c_smbus_write_byte_data(client, command, value);
-		if (!ret) return ret;
+		if (!ret) {
+			d = ktime_us_delta(ktime_get(), start_time);
+			if (d <= 22000) return 0;
+			dev_printk(KERN_DEBUG, &client->dev,
+				"I2C transaction took too long: %lld us.\n",
+				(long long) d);
+			ret = -ETIME;
+		}
 		dev_printk(KERN_DEBUG, &client->dev,
 			"Failed to write value 0x%02x to register 0x%02x: rc %d. Retries left: %d\n",
 			value, command, ret, retries);
@@ -256,9 +267,19 @@
 		u8 command) {
 	s32 ret;
 	int retries = MAX_SMBUS_RETRIES;
+	ktime_t start_time;
+	s64 d;
 	while (retries-- > 0) {
+		start_time = ktime_get();
 		ret = i2c_smbus_read_byte_data(client, command);
-		if (ret >= 0) return ret;
+		if (ret >= 0) {
+			d = ktime_us_delta(ktime_get(), start_time);
+			if (d <= 22000) return 0;
+			dev_printk(KERN_DEBUG, &client->dev,
+				"I2C transaction took too long: %lld us.\n",
+				(long long) d);
+			ret = -ETIME;
+		}
 		dev_printk(KERN_DEBUG, &client->dev,
 			"Failed to read from register 0x%02x: rc %d. Retries left: %d\n",
 			command, ret, retries);
diff --git a/drivers/i2c/busses/i2c-comcerto.c b/drivers/i2c/busses/i2c-comcerto.c
index 4a50cac..6492017 100644
--- a/drivers/i2c/busses/i2c-comcerto.c
+++ b/drivers/i2c/busses/i2c-comcerto.c
@@ -24,7 +24,6 @@
 #include <linux/delay.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
-#include <linux/ktime.h>
 #include <asm/io.h>
 #include <asm/sizes.h>
 #include <mach/i2c.h>
@@ -65,7 +64,6 @@
 	int			msg_status;	/* < 0: error, == 0: success, > 0: message in progress */
 	int			msg_len;
 	int			msg_retries;
-	ktime_t			msg_start_time;
 };
 
 #define REG_ADDR(i2c, offset)		((i2c)->membase + (offset))
@@ -178,20 +176,8 @@
 
 static inline void comcerto_i2c_message_complete(struct comcerto_i2c *i2c, int status)
 {
-	s64 d;
 	WR_CNTR(i2c, CNTR_STP);
-
 	i2c->msg_status = status;
-
-	if (i2c->msg_len < 10) {
-		d = ktime_us_delta(ktime_get(), i2c->msg_start_time);
-		if (d > 22000) {
-			i2c->msg_status = -ETIME;
-			dev_printk(KERN_DEBUG, i2c->dev,
-				"I2C transaction took too long: %lld us. Returning error.\n",
-				(long long) d);
-		}
-	}
 }
 
 static inline int comcerto_i2c_message_in_progress(struct comcerto_i2c *i2c)
@@ -468,7 +454,6 @@
 	i2c->msg_state = TR_IDLE;
 	i2c->msg_status = 1;
 	i2c->msg_retries = i2c->adapter->retries;
-	i2c->msg_start_time = ktime_get();
 
 polling_mode:
 	if (msg->flags & I2C_M_RD)