diff options
author | Chaitanya Bandi <bandik@nvidia.com> | 2014-03-19 16:01:20 +0530 |
---|---|---|
committer | Laxman Dewangan <ldewangan@nvidia.com> | 2014-03-20 00:09:56 -0700 |
commit | 40e85fd6df6ebc0ee5b26dcf7b79c18c59cc2547 (patch) | |
tree | 7b575927416209e7f6f76c69c2e4c9723206a311 /drivers/i2c | |
parent | 2b2b72785a4f41c10107d2c0d49bfbf00bd31441 (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.c | 15 |
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); |