[U-Boot] [PATCH 3/3] mpc5200: make i2c faster

Jon Smirl jonsmirl at gmail.com
Mon Mar 23 03:59:48 CET 2009


On Sun, Mar 22, 2009 at 11:21 AM, Wolfgang Denk <wd at denx.de> wrote:
> Dear Jon,
>
> In message <9e4733910903220720l723de65fm59a7e6a7fed1eda7 at mail.gmail.com> you wrote:
>>
>> > And how much do we make I2C faster this way? Where do we save time,
>> > and how much?
>>
>> I measured the delay. It is between 40us and 52us on my hardware so I
>> adjusted the loop to 60us. The previous 1ms delay was 20x bigger than
>> necessary.  If the hardware is slower, it will  just loop and add more
>> delay.
>
> You did not answer my question in which way this actually makes I2C
> faster? Where do we save time, and how much?

I increased the retry loop to 10,000.  This definitely makes my system
faster. On my bus the actual i2c delay is 40-55us.  The original code
always delayed 1,000us so for me it a gain of 940us on each i2c
operation.  This is visible during things like probe.

mpc5200: reduce delays in i2c

From: Sascha Hauer <s.hauer at pengutronix.de>

The mpc5xxx i2c driver has great delays while waiting for the chip status.
make the delays smaller and the driver faster. 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.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 cpu/mpc5xxx/i2c.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/cpu/mpc5xxx/i2c.c b/cpu/mpc5xxx/i2c.c
index 0860ecf..58470d1 100644
--- a/cpu/mpc5xxx/i2c.c
+++ b/cpu/mpc5xxx/i2c.c
@@ -38,7 +38,7 @@ DECLARE_GLOBAL_DATA_PTR;
 #error CONFIG_SYS_I2C_MODULE is not properly configured
 #endif

-#define I2C_TIMEOUT	100
+#define I2C_TIMEOUT	10000
 #define I2C_RETRIES	3

 struct mpc5xxx_i2c_tap {
@@ -94,7 +94,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);
+		udelay(15);
 		status = mpc_reg_in(&regs->msr);
 	}

@@ -109,7 +109,7 @@ static int wait_for_pin(int *status)
 	*status = mpc_reg_in(&regs->msr);

 	while (timeout-- && !(*status & I2C_IF)) {
-		udelay(1000);
+		udelay(15);
 		*status = mpc_reg_in(&regs->msr);
 	}


-- 
Jon Smirl
jonsmirl at gmail.com


More information about the U-Boot mailing list