Patch "i2c: rk3x: Handle a spurious start completion interrupt flag" has been added to the 4.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    i2c: rk3x: Handle a spurious start completion interrupt flag

to the 4.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     i2c-rk3x-handle-a-spurious-start-completion-interrup.patch
and it can be found in the queue-4.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 370e31d95faf8e388d89c93c659fdc3c323c2a15
Author: Ondrej Jirman <megous@xxxxxxxxxx>
Date:   Fri Sep 24 13:15:27 2021 +0200

    i2c: rk3x: Handle a spurious start completion interrupt flag
    
    [ Upstream commit 02fe0fbd8a21e183687925c3a266ae27dda9840f ]
    
    In a typical read transfer, start completion flag is being set after
    read finishes (notice ipd bit 4 being set):
    
    trasnfer poll=0
    i2c start
    rk3x-i2c fdd40000.i2c: IRQ: state 1, ipd: 10
    i2c read
    rk3x-i2c fdd40000.i2c: IRQ: state 2, ipd: 1b
    i2c stop
    rk3x-i2c fdd40000.i2c: IRQ: state 4, ipd: 33
    
    This causes I2C transfer being aborted in polled mode from a stop completion
    handler:
    
    trasnfer poll=1
    i2c start
    rk3x-i2c fdd40000.i2c: IRQ: state 1, ipd: 10
    i2c read
    rk3x-i2c fdd40000.i2c: IRQ: state 2, ipd: 0
    rk3x-i2c fdd40000.i2c: IRQ: state 2, ipd: 1b
    i2c stop
    rk3x-i2c fdd40000.i2c: IRQ: state 4, ipd: 13
    i2c stop
    rk3x-i2c fdd40000.i2c: unexpected irq in STOP: 0x10
    
    Clearing the START flag after read fixes the issue without any obvious
    side effects.
    
    This issue was dicovered on RK3566 when adding support for powering
    off the RK817 PMIC.
    
    Signed-off-by: Ondrej Jirman <megous@xxxxxxxxxx>
    Reviewed-by: John Keeping <john@xxxxxxxxxxxx>
    Signed-off-by: Wolfram Sang <wsa@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/i2c/busses/i2c-rk3x.c b/drivers/i2c/busses/i2c-rk3x.c
index 9096d17beb5bb..587f1a5a10243 100644
--- a/drivers/i2c/busses/i2c-rk3x.c
+++ b/drivers/i2c/busses/i2c-rk3x.c
@@ -325,8 +325,8 @@ static void rk3x_i2c_handle_read(struct rk3x_i2c *i2c, unsigned int ipd)
 	if (!(ipd & REG_INT_MBRF))
 		return;
 
-	/* ack interrupt */
-	i2c_writel(i2c, REG_INT_MBRF, REG_IPD);
+	/* ack interrupt (read also produces a spurious START flag, clear it too) */
+	i2c_writel(i2c, REG_INT_MBRF | REG_INT_START, REG_IPD);
 
 	/* Can only handle a maximum of 32 bytes at a time */
 	if (len > 32)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux