summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorChaitanya Bandi <bandik@nvidia.com>2014-03-19 16:01:20 +0530
committerLaxman Dewangan <ldewangan@nvidia.com>2014-03-20 00:09:56 -0700
commit40e85fd6df6ebc0ee5b26dcf7b79c18c59cc2547 (patch)
tree7b575927416209e7f6f76c69c2e4c9723206a311 /drivers/i2c
parent2b2b72785a4f41c10107d2c0d49bfbf00bd31441 (diff)
i2c: tegra: Make TX_FIFO filling un-interruptible
While programming an I2C transaction, no significant delay should be present between packet headers and data in case of write transactions. Any significant delay between them may cause clock-stretching with the controller waiting for the data to be written to TX_FIFO. Hence made the programming of these two happen in an uninterruptible fashion. Bug 1474556 Change-Id: Ife1afe9b9e3d4c571309a2e4dae4e0662c99c72e Signed-off-by: Chaitanya Bandi <bandik@nvidia.com> Reviewed-on: http://git-master/r/383807 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-tegra.c15
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 64a58366d3b6..64ad72cd940d 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -816,13 +816,11 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
if (!i2c_dev->msg_read && (status & I2C_INT_TX_FIFO_DATA_REQ)) {
if (i2c_dev->msg_buf_remaining) {
- if (!i2c_dev->chipdata->has_xfer_complete_interrupt)
- spin_lock_irqsave(&i2c_dev->fifo_lock, flags);
+ spin_lock_irqsave(&i2c_dev->fifo_lock, flags);
tegra_i2c_fill_tx_fifo(i2c_dev);
- if (!i2c_dev->chipdata->has_xfer_complete_interrupt)
- spin_unlock_irqrestore(&i2c_dev->fifo_lock, flags);
+ spin_unlock_irqrestore(&i2c_dev->fifo_lock, flags);
}
else
@@ -965,8 +963,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
i2c_dev->msg_read = (msg->flags & I2C_M_RD);
INIT_COMPLETION(i2c_dev->msg_complete);
- if (!i2c_dev->chipdata->has_xfer_complete_interrupt)
- spin_lock_irqsave(&i2c_dev->fifo_lock, flags);
+ spin_lock_irqsave(&i2c_dev->fifo_lock, flags);
cnfg = I2C_CNFG_NEW_MASTER_FSM | I2C_CNFG_PACKET_MODE_EN
| (0x2 << I2C_CNFG_DEBOUNCE_CNT_SHIFT);
@@ -1058,8 +1055,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev,
i2c_dev->chipdata->has_xfer_complete_interrupt))
int_mask |= I2C_INT_ALL_PACKETS_XFER_COMPLETE;
- if (!i2c_dev->chipdata->has_xfer_complete_interrupt)
- spin_unlock_irqrestore(&i2c_dev->fifo_lock, flags);
+ spin_unlock_irqrestore(&i2c_dev->fifo_lock, flags);
tegra_i2c_unmask_irq(i2c_dev, int_mask);
@@ -1573,8 +1569,7 @@ static int tegra_i2c_probe(struct platform_device *pdev)
pdata->bit_banging_xfer_after_shutdown;
init_completion(&i2c_dev->msg_complete);
- if (!i2c_dev->chipdata->has_xfer_complete_interrupt)
- spin_lock_init(&i2c_dev->fifo_lock);
+ spin_lock_init(&i2c_dev->fifo_lock);
spin_lock_init(&i2c_dev->mem_lock);