RE: [PATCH v2] OMAP3 : Fix I2C lockup during timeout/error cases

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

 



If there are no comments for this patch, can you please consider this patch
for upstream?

-Manjunath
 

> -----Original Message-----
> From: G, Manjunath Kondaiah 
> Sent: Friday, December 11, 2009 11:09 AM
> To: linux-omap@xxxxxxxxxxxxxxx; linux-i2c@xxxxxxxxxxxxxxx; 
> ben-linux@xxxxxxxxx
> Cc: G, Manjunath Kondaiah; Menon, Nishanth; Sonasath, Moiz; 
> Krishnamoorthy, Balaji T; Varadarajan, Charu Latha; George, Harith
> Subject: [PATCH v2] OMAP3 : Fix I2C lockup during timeout/error cases
> 
> Current OMAP3 I2C driver code does not follow the correct 
> sequence for soft
> reset. Due to this, lock up issues are reported during 
> timeout/error cases.
> 
> This patch fixes above issue by disabling I2C controller as 
> per OMAP3430 TRM
> for soft reset. As per TRM, I2C controller needs to be 
> disabled as a first
> step during soft reset.
> 
> Here is correct soft reset sequence:
> a. Ensure that the module is disabled
> (clear the I2Ci.I2C_CON[15] I2C_EN bit to 0).
> b. Set the I2Ci.I2C_SYSC[1] SRST bit to 1.
> c. Enable the module by setting I2Ci.I2C_CON[15] I2C_EN bit to 1.
> d. Check the I2Ci.I2C_SYSS[0] RDONE bit until it is set to 1 to
> indicate the software reset is complete.
> 
> 
> Tested on Zoom2, Zoom3, 3430SDP and 3630SDP
> 
> Signed-off-by: Manjunatha GK <manjugk@xxxxxx>
> Signed-off-by: George, Harith<harith@xxxxxx>
> Acked-by: Varadarajan, Charu Latha<charu@xxxxxx>
> ---
> v1 : Initital version
> v2 : Removed delay since time taken for disabling I2C 
> controller is zero
>      jiffies
> 
>  drivers/i2c/busses/i2c-omap.c |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/i2c/busses/i2c-omap.c 
> b/drivers/i2c/busses/i2c-omap.c
> index 827da08..74620c0 100644
> --- a/drivers/i2c/busses/i2c-omap.c
> +++ b/drivers/i2c/busses/i2c-omap.c
> @@ -265,6 +265,11 @@ static int omap_i2c_init(struct 
> omap_i2c_dev *dev)
>  	unsigned long internal_clk = 0;
>  
>  	if (dev->rev >= OMAP_I2C_REV_2) {
> +		/* Disable I2C controller before soft reset */
> +		omap_i2c_write_reg(dev, OMAP_I2C_CON_REG,
> +			omap_i2c_read_reg(dev, OMAP_I2C_CON_REG) &
> +				~(OMAP_I2C_CON_EN));
> +
>  		omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, 
> SYSC_SOFTRESET_MASK);
>  		/* For some reason we need to set the EN bit before the
>  		 * reset done bit gets set. */
> -- 
> 1.6.0.4
> 
> --
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux