diff options
author | Shinya Kuribayashi <shinya.kuribayashi@necel.com> | 2009-11-06 07:51:00 -0500 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-12-08 19:19:12 -0500 |
commit | 69151e532c97f983b498ea03e20b1598a5487318 (patch) | |
tree | 819bf53c0d5653bb06e40f415dfeffce6f257b8f /drivers/i2c | |
parent | 201d6a70b72d1e6ca5a8e03f5f41a7741241401a (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')
-rw-r--r-- | drivers/i2c/busses/i2c-designware.c | 11 |
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 | ||