• Geert Uytterhoeven's avatar
    clk: renesas: cpg-mssr: Fix reset control race condition · ca5b26a8
    Geert Uytterhoeven authored
    [ Upstream commit e1f1ae80 ]
    
    The module reset code in the Renesas CPG/MSSR driver uses
    read-modify-write (RMW) operations to write to a Software Reset Register
    (SRCRn), and simple writes to write to a Software Reset Clearing
    Register (SRSTCLRn), as was mandated by the R-Car Gen2 and Gen3 Hardware
    User's Manuals.
    
    However, this may cause a race condition when two devices are reset in
    parallel: if the reset for device A completes in the middle of the RMW
    operation for device B, device A may be reset again, causing subtle
    failures (e.g. i2c timeouts):
    
    	thread A			thread B
    	--------			--------
    
    	val = SRCRn
    	val |= bit A
    	SRCRn = val
    
    	delay
    
    					val = SRCRn (bit A is set)
    
    	SRSTCLRn = bit A
    	(bit A in SRCRn is cleared)
    
    					val |= bit B
    					SRCRn = val (bit A and B are set)
    
    This can be reproduced on e.g. Salvator-XS using:
    
        $ while true; do i2cdump -f -y 4 0x6A b > /dev/null; done &
        $ while true; do i2cdump -f -y 2 0x10 b > /dev/null; done &
    
        i2c-rcar e6510000.i2c: error -110 : 40000002
        i2c-rcar e66d8000.i2c: error -110 : 40000002
    
    According to the R-Car Gen3 Hardware Manual Errata for Rev.
    0.80 of Feb 28, 2018, reflected in Rev. 1.00 of the R-Car Gen3 Hardware
    User's Manual, writes to SRCRn do not require read-modify-write cycles.
    
    Note that the R-Car Gen2 Hardware User's Manual has not been updated
    yet, and still says a read-modify-write sequence is required.  According
    to the hardware team, the reset hardware block is the same on both R-Car
    Gen2 and Gen3, though.
    
    Hence fix the issue by replacing the read-modify-write operations on
    SRCRn by simple writes.
    Reported-by: default avatarYao Lihua <Lihua.Yao@desay-svautomotive.com>
    Fixes: 6197aa65 ("clk: renesas: cpg-mssr: Add support for reset control")
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Tested-by: default avatarLinh Phung <linh.phung.jy@renesas.com>
    Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    ca5b26a8
renesas-cpg-mssr.c 21.7 KB