i2c-c2k: Initialize the controller only once upon the first transfer

Change-Id: Ibfea3938e68656f2be9b8c064cd21f9bb9d56f3c
diff --git a/drivers/i2c/busses/i2c-c2k.c b/drivers/i2c/busses/i2c-c2k.c
index 3716864..7091ddb 100644
--- a/drivers/i2c/busses/i2c-c2k.c
+++ b/drivers/i2c/busses/i2c-c2k.c
@@ -8,16 +8,23 @@
 #include <mach/comcerto-2000.h>
 #include <mach/i2c.h>
 
+#define DEFAULT_BUS_FREQ	100000
+
+static bool is_initialized = false;
+
 /* Assuming that there is only one master on the bus (us) */
 
-void i2c_init (struct device_d *pdev, int speed, int slaveaddr)
+static void i2c_init (struct device_d *pdev)
 {
 	unsigned int n, m, freq, margin, power;
 	unsigned int actualN = 0, actualM = 0;
 	unsigned int minMargin = 0xffffffff;
 	unsigned int control, status;
 	unsigned int tclk = CFG_TCLK;
-	unsigned int i2cFreq = speed;	/* 100000 max. Fast mode not supported */
+	unsigned int i2cFreq = DEFAULT_BUS_FREQ;
+	struct i2c_platform_data *pdata = pdev->platform_data;
+	if (pdata && pdata->bitrate)
+		i2cFreq = pdata->bitrate;
 
 	dev_dbg(pdev, "i2c_init\n");
 
@@ -57,6 +64,8 @@
 
 	status = readl(pdev->map_base + I2C_STAT);
 	control = readl(pdev->map_base + I2C_CNTR);
+
+	is_initialized = true;
 }
 
 static uchar i2c_start (struct device_d *pdev)
@@ -220,14 +229,6 @@
 uchar i2c_read (struct device_d *pdev, uchar dev_addr, uchar * data, int len)
 {
 	uchar status = 0;
-	struct i2c_platform_data *pdata;
-	int i2cFreq;
-
-	pdata = pdev->platform_data;
-	if (pdata && pdata->bitrate)
-		i2cFreq = pdata->bitrate;
-
-	i2c_init (pdev, i2cFreq, 0);	/* set the i2c frequency */
 
 	status = i2c_start (pdev);
 
@@ -267,14 +268,6 @@
 uchar i2c_write (struct device_d *pdev, uchar dev_addr, uchar * data, int len)
 {
 	uchar status = 0;
-        struct i2c_platform_data *pdata;
-	int i2cFreq;
-
-	pdata = pdev->platform_data;
-	if (pdata && pdata->bitrate)
-		i2cFreq = pdata->bitrate;
-
-	i2c_init (pdev, i2cFreq, 0);	/* set the i2c frequency */
 
 	status = i2c_start (pdev);	/* send a start bit */
 
@@ -304,6 +297,10 @@
         int i;
         int result;
 
+	if (!is_initialized) {
+		i2c_init(adapter->dev);
+	}
+
 	for (i = 0; i < num; i++) {
 		if (msgs[i].flags & I2C_M_RD)
 			result = i2c_read(adapter->dev, msgs[i].addr,