diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-pxa.c')
-rw-r--r-- | drivers/i2c/busses/i2c-pxa.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index 14e83d0aac8..2fc3bcec24d 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
@@ -539,6 +539,18 @@ static inline void i2c_pxa_start_message(struct pxa_i2c *i2c) | |||
539 | writel(icr | ICR_START | ICR_TB, _ICR(i2c)); | 539 | writel(icr | ICR_START | ICR_TB, _ICR(i2c)); |
540 | } | 540 | } |
541 | 541 | ||
542 | static inline void i2c_pxa_stop_message(struct pxa_i2c *i2c) | ||
543 | { | ||
544 | u32 icr; | ||
545 | |||
546 | /* | ||
547 | * Clear the STOP and ACK flags | ||
548 | */ | ||
549 | icr = readl(_ICR(i2c)); | ||
550 | icr &= ~(ICR_STOP | ICR_ACKNAK); | ||
551 | writel(icr, _IRC(i2c)); | ||
552 | } | ||
553 | |||
542 | /* | 554 | /* |
543 | * We are protected by the adapter bus mutex. | 555 | * We are protected by the adapter bus mutex. |
544 | */ | 556 | */ |
@@ -581,6 +593,7 @@ static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) | |||
581 | * The rest of the processing occurs in the interrupt handler. | 593 | * The rest of the processing occurs in the interrupt handler. |
582 | */ | 594 | */ |
583 | timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); | 595 | timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); |
596 | i2c_pxa_stop_message(i2c); | ||
584 | 597 | ||
585 | /* | 598 | /* |
586 | * We place the return code in i2c->msg_idx. | 599 | * We place the return code in i2c->msg_idx. |