From db1aa73bf84692a968a50237e26fc6eef8f99cb5 Mon Sep 17 00:00:00 2001 From: Shardar Shariff Md Date: Wed, 1 Nov 2017 17:24:09 +0530 Subject: [PATCH] i2c: tegra-vi: bypass the wait for pkt transfer done Read back the transfer status register right after the writes to TX FIFO register to bypass the wait for packet transfer done. Bug 200343747 Based on commit: 3a71308 i2c: tegra-vi: bypass the wait for pkt transfer done Change-Id: I6069a25d90ae07cee5d3849f6d84bd32dd350078 Signed-off-by: Shardar Shariff Md Reviewed-on: https://git-master.nvidia.com/r/1589995 GVS: Gerrit_Virtual_Submit Reviewed-by: Shan Neng Chen Reviewed-by: Laxman Dewangan Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/i2c/busses/i2c-tegra-vi.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/i2c/busses/i2c-tegra-vi.c b/drivers/i2c/busses/i2c-tegra-vi.c index f816170..5e4dd29 100644 --- a/drivers/i2c/busses/i2c-tegra-vi.c +++ b/drivers/i2c/busses/i2c-tegra-vi.c @@ -361,6 +361,9 @@ static void i2c_writel(struct tegra_i2c_dev *i2c_dev, u32 val, if (i2c_dev->hw->has_reg_write_buffering) { if (reg != I2C_TX_FIFO) readl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); + else + readl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, + I2C_PACKET_TRANSFER_STATUS)); } } @@ -369,10 +372,11 @@ static u32 i2c_readl(struct tegra_i2c_dev *i2c_dev, unsigned long reg) return readl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); } -static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, void *data, +static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, u32 *data, unsigned long reg, int len) { - writesl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len); + while (len--) + i2c_writel(i2c_dev, *data++, reg); } static void i2c_readsl(struct tegra_i2c_dev *i2c_dev, void *data, @@ -735,7 +739,8 @@ static int tegra_i2c_fill_tx_fifo(struct tegra_i2c_dev *i2c_dev) words_to_transfer * BYTES_PER_FIFO_WORD; barrier(); - i2c_writesl(i2c_dev, buf, I2C_TX_FIFO, words_to_transfer); + i2c_writesl(i2c_dev, (u32 *)buf, I2C_TX_FIFO, + words_to_transfer); buf += words_to_transfer * BYTES_PER_FIFO_WORD; } -- 2.1.4