* [U-Boot] [PATCH V3] mpc5200: reduce delays in i2c
@ 2009-03-31 21:37 Jon Smirl
2009-04-04 21:17 ` Wolfgang Denk
0 siblings, 1 reply; 2+ messages in thread
From: Jon Smirl @ 2009-03-31 21:37 UTC (permalink / raw)
To: u-boot
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(®s->msr);
@@ -94,7 +95,7 @@ static int wait_for_bb(void)
mpc_reg_out(®s->mcr, 0, 0);
mpc_reg_out(®s->mcr, I2C_EN, 0);
#endif
- udelay(1000);
+ timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
status = mpc_reg_in(®s->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(®s->msr);
while (timeout-- && !(*status & I2C_IF)) {
- udelay(1000);
+ timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
*status = mpc_reg_in(®s->msr);
}
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [U-Boot] [PATCH V3] mpc5200: reduce delays in i2c
2009-03-31 21:37 [U-Boot] [PATCH V3] mpc5200: reduce delays in i2c Jon Smirl
@ 2009-04-04 21:17 ` Wolfgang Denk
0 siblings, 0 replies; 2+ messages in thread
From: Wolfgang Denk @ 2009-04-04 21:17 UTC (permalink / raw)
To: u-boot
Dear Jon Smirl,
In message <20090331213728.17969.91950.stgit@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(®s->msr);
> @@ -94,7 +95,7 @@ static int wait_for_bb(void)
> mpc_reg_out(®s->mcr, 0, 0);
> mpc_reg_out(®s->mcr, I2C_EN, 0);
> #endif
> - udelay(1000);
> + timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
> status = mpc_reg_in(®s->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(®s->msr);
>
> while (timeout-- && !(*status & I2C_IF)) {
> - udelay(1000);
> + timeout > I2C_TIMEOUT ? udelay(15) : udelay(1000);
> *status = mpc_reg_in(®s->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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-04-04 21:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-31 21:37 [U-Boot] [PATCH V3] mpc5200: reduce delays in i2c Jon Smirl
2009-04-04 21:17 ` Wolfgang Denk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox