aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses/i2c-designware.c
diff options
context:
space:
mode:
authorShinya Kuribayashi <shinya.kuribayashi@necel.com>2009-11-06 07:51:00 -0500
committerBen Dooks <ben-linux@fluff.org>2009-12-08 19:19:12 -0500
commit69151e532c97f983b498ea03e20b1598a5487318 (patch)
tree819bf53c0d5653bb06e40f415dfeffce6f257b8f /drivers/i2c/busses/i2c-designware.c
parent201d6a70b72d1e6ca5a8e03f5f41a7741241401a (diff)
i2c-designware: Disable TX_EMPTY when all i2c_msg msgs has been processed
Currently we disable TX_EMPTY interrupt when buf_len is zero, but this is wrong. (buf_len == 0) means that all transmit data in the current i2c_msg message has been sent out, but that doesn't necessarily mean all i2c_msg messages have been processed. TX_EMPTY interrupt is used as the driving force of DW I2C transactions, so we need to keep it enabled as long as i2c_msg messages are available. Signed-off-by: Shinya Kuribayashi <shinya.kuribayashi@necel.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'drivers/i2c/busses/i2c-designware.c')
-rw-r--r--drivers/i2c/busses/i2c-designware.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/i2c/busses/i2c-designware.c b/drivers/i2c/busses/i2c-designware.c
index f184d822d3d4..6acbe846e9c6 100644
--- a/drivers/i2c/busses/i2c-designware.c
+++ b/drivers/i2c/busses/i2c-designware.c
@@ -415,12 +415,17 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
415 /* more bytes to be written */ 415 /* more bytes to be written */
416 dev->status |= STATUS_WRITE_IN_PROGRESS; 416 dev->status |= STATUS_WRITE_IN_PROGRESS;
417 break; 417 break;
418 } else { 418 } else
419 dev->status &= ~STATUS_WRITE_IN_PROGRESS; 419 dev->status &= ~STATUS_WRITE_IN_PROGRESS;
420 intr_mask &= ~DW_IC_INTR_TX_EMPTY;
421 }
422 } 420 }
423 421
422 /*
423 * If i2c_msg index search is completed, we don't need TX_EMPTY
424 * interrupt any more.
425 */
426 if (dev->msg_write_idx == dev->msgs_num)
427 intr_mask &= ~DW_IC_INTR_TX_EMPTY;
428
424 writel(intr_mask, dev->base + DW_IC_INTR_MASK); 429 writel(intr_mask, dev->base + DW_IC_INTR_MASK);
425} 430}
426 431