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,