| From ef8bf60b6afb42f0eccfa6b175fb5fda5f1a98ad Mon Sep 17 00:00:00 2001 |
| From: Chris Brandt <chris.brandt@renesas.com> |
| Date: Mon, 6 Mar 2017 15:20:51 -0500 |
| Subject: [PATCH 053/255] i2c: riic: fix restart condition |
| |
| While modifying the driver to use the STOP interrupt, the completion of the |
| intermediate transfers need to wake the driver back up in order to initiate |
| the next transfer (restart condition). Otherwise you get never ending |
| interrupts and only the first transfer sent. |
| |
| Fixes: 71ccea095ea1 ("i2c: riic: correctly finish transfers") |
| Reported-by: Simon Horman <horms@verge.net.au> |
| Signed-off-by: Chris Brandt <chris.brandt@renesas.com> |
| Tested-by: Simon Horman <horms+renesas@verge.net.au> |
| Signed-off-by: Wolfram Sang <wsa@the-dreams.de> |
| (cherry picked from commit 2501c1bb054290679baad0ff7f4f07c714251f4c) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/i2c/busses/i2c-riic.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/i2c/busses/i2c-riic.c |
| +++ b/drivers/i2c/busses/i2c-riic.c |
| @@ -218,8 +218,12 @@ static irqreturn_t riic_tend_isr(int irq |
| } |
| |
| if (riic->is_last || riic->err) { |
| - riic_clear_set_bit(riic, 0, ICIER_SPIE, RIIC_ICIER); |
| + riic_clear_set_bit(riic, ICIER_TEIE, ICIER_SPIE, RIIC_ICIER); |
| writeb(ICCR2_SP, riic->base + RIIC_ICCR2); |
| + } else { |
| + /* Transfer is complete, but do not send STOP */ |
| + riic_clear_set_bit(riic, ICIER_TEIE, 0, RIIC_ICIER); |
| + complete(&riic->msg_done); |
| } |
| |
| return IRQ_HANDLED; |