summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamal Kannan Balagopalan <kbalagopalan@nvidia.com>2011-09-12 14:30:46 -0700
committerVarun Colbert <vcolbert@nvidia.com>2011-09-16 17:49:06 -0700
commit14b05b44c119d172458c263bb00b6f74a0974b0d (patch)
tree933920a4a2d7f8b22333663c7c268b993c3d1e2e
parentc8e014fa9d8a7cad2d78d91fad8fe056b4ea0714 (diff)
i2c: tegra: Fixed incorrect 10-bit I2C addressing
The I2C driver incorrectly manipulated the 10-bit address of corresponding slave devices when initiating protocol based transactions. This caused NACK errors from the slave devices that only support 10-bit addressing. Fixed by skipping address shifting when the slave devices support 10-bit addresses. Bug 874193 Change-Id: Idf69e434fd7e68c22047474169f7c6a8145721e2 Reviewed-on: http://git-master/r/51866 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com>
-rw-r--r--drivers/i2c/busses/i2c-tegra.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index e39136e6da57..2adb07026332 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -571,6 +571,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_bus *i2c_bus,
i2c_dev->msg_read = (msg->flags & I2C_M_RD);
INIT_COMPLETION(i2c_dev->msg_complete);
i2c_dev->msg_add = msg->addr;
+ i2c_dev->io_header = 0;
i2c_dev->packet_header = (0 << PACKET_HEADER0_HEADER_SIZE_SHIFT) |
PACKET_HEADER0_PROTOCOL_I2C |
@@ -581,12 +582,16 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_bus *i2c_bus,
i2c_dev->payload_size = msg->len - 1;
i2c_writel(i2c_dev, i2c_dev->payload_size, I2C_TX_FIFO);
- i2c_dev->io_header = msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT;
i2c_dev->io_header |= I2C_HEADER_IE_ENABLE;
if (!stop)
i2c_dev->io_header |= I2C_HEADER_REPEAT_START;
- if (msg->flags & I2C_M_TEN)
+ if (msg->flags & I2C_M_TEN) {
+ i2c_dev->io_header |= msg->addr;
i2c_dev->io_header |= I2C_HEADER_10BIT_ADDR;
+ }
+ else {
+ i2c_dev->io_header |= msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT;
+ }
if (msg->flags & I2C_M_IGNORE_NAK)
i2c_dev->io_header |= I2C_HEADER_CONT_ON_NAK;
if (msg->flags & I2C_M_RD)