From b9607c9083b767eac26df1d39a030f3cba5d3ae3 Mon Sep 17 00:00:00 2001
From: Kurt Mahan <kmahan@freescale.com>
Date: Fri, 18 Jul 2008 12:40:04 -0600
Subject: [PATCH] Increase timeouts on I2C bus.

LTIBName: m547x-8x-i2c-timeout-fix
Signed-off-by: Shrek Wu <b16972@freescale.com>
---
 drivers/i2c/busses/i2c-mcf548x.c |   40 +++++++++++++++++++++++++++++--------
 1 files changed, 31 insertions(+), 9 deletions(-)

--- a/drivers/i2c/busses/i2c-mcf548x.c
+++ b/drivers/i2c/busses/i2c-mcf548x.c
@@ -43,8 +43,8 @@ static struct i2c_adapter i2c_mcf_board_
 	.id = I2C_HW_MPC107,
 	.algo_data = &i2c_mcf_board_data,
 	.class = I2C_CLASS_HWMON,
-	.timeout = 1,
-	.retries = 1
+	.timeout = 100,
+	.retries = 2
 };
 /*
  *  static void i2c_start()
@@ -105,7 +105,7 @@ wait_for_bb(
 	for (i = 0; i < adap->timeout; i++) {
 		if (!(MCF_I2SR & MCF_I2SR_IBB))
 			return 0;
-		udelay(10);
+		udelay(100);
 	}
 	printk(KERN_ERR "%s: timeout", __FUNCTION__);
 	return -ETIMEDOUT;
@@ -124,7 +124,7 @@ wait_for_not_bb(
 	for (i = 0; i < adap->timeout; i++) {
 		if (MCF_I2SR & MCF_I2SR_IBB)
 			return 0;
-		udelay(10);
+		udelay(100);
 	}
 	printk(KERN_ERR "%s: timeout", __FUNCTION__);
 	return -ETIMEDOUT;
@@ -146,7 +146,7 @@ wait_xfer_done(
 			MCF_I2SR &= ~MCF_I2SR_IIF;
 			return 0;
 		}
-		udelay(1);
+		udelay(10);
 	}
 	printk(KERN_ERR "%s: timeout", __FUNCTION__);
 	return -ETIMEDOUT;
@@ -166,7 +166,7 @@ i2c_set_addr(
 ) {
 	unsigned short flags = msg->flags;
 	unsigned char addr;
-
+	MCF_I2CR |= MCF_I2CR_MTX;
 	if ((flags & I2C_M_TEN)) {
 		/* 10 bit address not supported yet */
 		return -EIO;
@@ -269,7 +269,7 @@ mcf_sendbytes(
 		i2c_stop(adap);
 		wait_for_bb(adap);
 	} else {
-		i2c_repstart(adap);
+	/*	i2c_repstart(adap);*/
 	}
 
 	return (i);
@@ -330,7 +330,7 @@ mcf_readbytes(
 		i2c_stop(adap);
 		wait_for_bb(adap);
 	} else {
-		i2c_repstart(adap);
+	/*	i2c_repstart(adap);*/
 	}
 
 	return (i+1);
@@ -380,6 +380,27 @@ mcf_xfer(
 	wait_for_bb(adap);
 
 	for (i = 0; ret >= 0 && i < num; i++) {
+		if (MCF_I2SR & MCF_I2SR_IBB) {
+			MCF_I2ICR = 0x00;
+			MCF_I2CR  = 0x00;
+                	MCF_I2CR  = 0x0A;
+                	timeout = MCF_I2DR;
+                	MCF_I2SR  = 0x00;
+                	MCF_I2CR  = 0x00;
+			MCF_I2ICR = 0x01;
+		}
+		/* setup SCL clock */
+		MCF_I2FDR = get_clock(adap);
+		/* set slave address */
+		MCF_I2AR = get_own(adap);
+		/* enable I2C module */
+		MCF_I2CR = MCF_I2CR_IEN;
+
+		MCF_I2CR |= MCF_I2CR_TXAK;
+
+		/* Check for bus busy */
+		wait_for_bb(adap);
+
 		pmsg = &msgs[i];
 
 		printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes "
@@ -388,7 +409,7 @@ mcf_xfer(
 			pmsg->len, pmsg->addr, i + 1, num);
 
 		/* Send START */
-		if (i == 0)
+		/*if (i == 0)*/
 			i2c_start(adap);
 
 		/* Wait for Bus Busy */
@@ -440,6 +461,7 @@ mcf_xfer(
 					"%d bytes.\n", ret);
 			}
 		}
+	MCF_I2CR = 0;
 	}
 
 	/* Disable I2C module */
