diff options
author | Kamal Kannan Balagopalan <kbalagopalan@nvidia.com> | 2011-09-12 14:30:46 -0700 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-09-16 17:49:06 -0700 |
commit | 14b05b44c119d172458c263bb00b6f74a0974b0d (patch) | |
tree | 933920a4a2d7f8b22333663c7c268b993c3d1e2e | |
parent | c8e014fa9d8a7cad2d78d91fad8fe056b4ea0714 (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.c | 9 |
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) |