[U-Boot] [PATCH V3] mpc5200: reduce delays in i2c

Wolfgang Denk wd at denx.de
Sat Apr 4 23:17:44 CEST 2009


Dear Jon Smirl,

In message <20090331213728.17969.91950.stgit at localhost> you wrote:
> Make the i2c delays smaller. The measured delay is 55us at
> 100Khz. Set the delay to 15us which should work for 400Khz.
> 100Khz will loop four times and get a 60us delay. Try four
> times at a 15us delay and then revert to the previous behavior
> of 1ms delays.
> ---
>  cpu/mpc5xxx/i2c.c |    9 +++++----
>  1 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/cpu/mpc5xxx/i2c.c b/cpu/mpc5xxx/i2c.c
> index e2506d8..dba9071 100644
> --- a/cpu/mpc5xxx/i2c.c
> +++ b/cpu/mpc5xxx/i2c.c
> @@ -39,6 +39,7 @@ DECLARE_GLOBAL_DATA_PTR;
>  #endif
>  
>  #define I2C_TIMEOUT	100
> +#define I2C_TIMEOUT_QUICK 4
>  #define I2C_RETRIES	3
>  
>  struct mpc5xxx_i2c_tap {
> @@ -80,7 +81,7 @@ static void mpc_reg_out(volatile u32 *reg, int val, int mask)
>  static int wait_for_bb(void)
>  {
>  	struct mpc5xxx_i2c *regs    = (struct mpc5xxx_i2c *)I2C_BASE;
> -	int                 timeout = I2C_TIMEOUT;
> +	int                 timeout = I2C_TIMEOUT + I2C_TIMEOUT_QUICK;
>  	int                 status;
>  
>  	status = mpc_reg_in(&regs->msr);
> @@ -94,7 +95,7 @@ static int wait_for_bb(void)
>  		mpc_reg_out(&regs->mcr, 0, 0);
>  		mpc_reg_out(&regs->mcr, I2C_EN, 0);
>  #endif
> -		udelay(1000);
> +		timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
>  		status = mpc_reg_in(&regs->msr);
>  	}
>  
> @@ -104,12 +105,12 @@ static int wait_for_bb(void)
>  static int wait_for_pin(int *status)
>  {
>  	struct mpc5xxx_i2c *regs    = (struct mpc5xxx_i2c *)I2C_BASE;
> -	int                 timeout = I2C_TIMEOUT;
> +	int                 timeout = I2C_TIMEOUT + I2C_TIMEOUT_QUICK;
>  
>  	*status = mpc_reg_in(&regs->msr);
>  
>  	while (timeout-- && !(*status & I2C_IF)) {
> -		udelay(1000);
> +		timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
>  		*status = mpc_reg_in(&regs->msr);
>  	}

Urgh... Why are you making this so complicated. This is definitely not
needed. Why don't you just stick with the last (or before last?)
version and adjut the total timeouts to the original values?

Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Remember, there's a big difference between kneeling down and  bending
over.                                                   - Frank Zappa


More information about the U-Boot mailing list