From 8b7c87253960aac0b670e606d8dbe2f64b1e5652 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Thu, 7 Nov 2013 17:52:18 +0400 Subject: designware_i2c: disable i2c controller during target address setup As it is stated in DesignWare I2C databook: writes to IC_TAR (0x4) register succeed only when IC_ENABLE[0] is set to 0. Signed-off-by: Alexey Brodkin Cc: Tom Rini cc: Armando Visconti Cc: Stefan Roese Cc: Albert ARIBAUD Cc: Heiko Schocher Cc: Vipin KUMAR Cc: Tom Rix Cc: Mischa Jonker --- drivers/i2c/designware_i2c.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'drivers/i2c/designware_i2c.c') diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index c2f06627d3e..c5c6015e995 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -151,7 +151,19 @@ void i2c_init(int speed, int slaveadd) */ static void i2c_setaddress(unsigned int i2c_addr) { + unsigned int enbl; + + /* Disable i2c */ + enbl = readl(&i2c_regs_p->ic_enable); + enbl &= ~IC_ENABLE_0B; + writel(enbl, &i2c_regs_p->ic_enable); + writel(i2c_addr, &i2c_regs_p->ic_tar); + + /* Enable i2c */ + enbl = readl(&i2c_regs_p->ic_enable); + enbl |= IC_ENABLE_0B; + writel(enbl, &i2c_regs_p->ic_enable); } /* -- cgit v1.2.3 From f9de54e9b09b4836fb3cda9d98a6dfba367b9734 Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Thu, 7 Nov 2013 17:52:33 +0400 Subject: designware_i2c: remove 10msec delay in i2c_xfer_finish This delay applies to any data transfer on I2C bus. For example 1kB data read with per-byte access (which happens if environment is stored in I2C EEPROM) takes more than 10 seconds. Moreover data bus driver has to care about bus state and data transfer, but not about internal states of attached devices. Signed-off-by: Alexey Brodkin Cc: Tom Rini cc: Armando Visconti Cc: Stefan Roese Cc: Albert ARIBAUD Cc: Heiko Schocher Cc: Vipin KUMAR Cc: Tom Rix Cc: Mischa Jonker --- drivers/i2c/designware_i2c.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'drivers/i2c/designware_i2c.c') diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index c5c6015e995..cb2ac04b609 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -249,9 +249,6 @@ static int i2c_xfer_finish(void) i2c_flush_rxfifo(); - /* Wait for read/write operation to complete on actual memory */ - udelay(10000); - return 0; } -- cgit v1.2.3