Re: [PATCH] i2c: designware: must wait for enable

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

 



LGTM

On Wed, 2018-02-14 at 09:29 -0600, Ben Gardner wrote:
> One I2C bus on my Atom E3845 board has been broken since 4.9.
> It has two devices, both declared by ACPI and with built-in drivers.
> 
> There are two back-to-back transactions originating from the kernel,
> one
> targeting each device. The first transaction works, the second one
> locks
> up the I2C controller. The controller never recovers.
> 
> These kernel logs show up whenever an I2C transaction is attempted
> after
> this failure.
> i2c-designware-pci 0000:00:18.3: timeout in disabling adapter
> i2c-designware-pci 0000:00:18.3: timeout waiting for bus ready
> 
> Waiting for the I2C controller status to indicate that it is enabled
> before programming it fixes the issue.
> 
> I have tested this patch on 4.14 and 4.15.
> 
> Fixes: commit 2702ea7dbec5 ("i2c: designware: wait for disable/enable
> only if necessary")
> Cc: linux-stable <stable@xxxxxxxxxxxxxxx> #4.13+
> Cc: José Roberto de Souza <jose.souza@xxxxxxxxx>

Reviewed-by: José Roberto de Souza <jose.souza@xxxxxxxxx>

> Signed-off-by: Ben Gardner <gardner.ben@xxxxxxxxx>
> ---
>  drivers/i2c/busses/i2c-designware-master.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/i2c/busses/i2c-designware-master.c
> b/drivers/i2c/busses/i2c-designware-master.c
> index ae69188..55926ef 100644
> --- a/drivers/i2c/busses/i2c-designware-master.c
> +++ b/drivers/i2c/busses/i2c-designware-master.c
> @@ -209,7 +209,7 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev
> *dev)
>  	i2c_dw_disable_int(dev);
>  
>  	/* Enable the adapter */
> -	__i2c_dw_enable(dev, true);
> +	__i2c_dw_enable_and_wait(dev, true);
>  
>  	/* Clear and enable interrupts */
>  	dw_readl(dev, DW_IC_CLR_INTR);




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]