diff mbox

i2c: riic: fix restart condition

Message ID 20170306202051.3158-1-chris.brandt@renesas.com (mailing list archive)
State Accepted
Delegated to: Geert Uytterhoeven
Headers show

Commit Message

Chris Brandt March 6, 2017, 8:20 p.m. UTC
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>
---
 drivers/i2c/busses/i2c-riic.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Simon Horman March 7, 2017, 6:42 a.m. UTC | #1
On Mon, Mar 06, 2017 at 03:20:51PM -0500, Chris Brandt wrote:
> 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>

Thanks Chris,

with this patch applied on top of v4.11-rc1 Genmai once again boots
to userspace with shmobile_defconfig.

Tested-by: Simon Horman <horms+renesas@verge.net.au>

> ---
>  drivers/i2c/busses/i2c-riic.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
> index 8f11d34..c811af4 100644
> --- 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, void *data)
>  	}
>  
>  	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;
> -- 
> 2.10.1
> 
>
Wolfram Sang March 9, 2017, 2:40 p.m. UTC | #2
On Mon, Mar 06, 2017 at 03:20:51PM -0500, Chris Brandt wrote:
> 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>

Applied to for-current, thanks!
diff mbox

Patch

diff --git a/drivers/i2c/busses/i2c-riic.c b/drivers/i2c/busses/i2c-riic.c
index 8f11d34..c811af4 100644
--- 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, void *data)
 	}
 
 	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;