diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2008-07-29 12:23:49 -0500 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2008-07-30 01:25:31 +0200 |
commit | 09d318a8bb1444ec92e31cafcdba877eb9409e58 (patch) | |
tree | f7d859fa1667ec910953d96055522c4b8e1681f9 | |
parent | 1ca9950b46c0aded14c80f728f6238625d723a19 (diff) | |
download | u-boot-imx-09d318a8bb1444ec92e31cafcdba877eb9409e58.zip u-boot-imx-09d318a8bb1444ec92e31cafcdba877eb9409e58.tar.gz u-boot-imx-09d318a8bb1444ec92e31cafcdba877eb9409e58.tar.bz2 |
fsl_i2c: Use timebase timer functions instead of get_timer()
The current implementation of get_timer() is only really useful after we
have relocated u-boot to memory. The i2c code is used before that as part
of the SPD DDR setup.
We actually have a bug when using the get_timer() code before relocation
because the .bss hasn't been setup and thus we could be reading/writing
a random location (probably in flash).
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
-rw-r--r-- | drivers/i2c/fsl_i2c.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/i2c/fsl_i2c.c b/drivers/i2c/fsl_i2c.c index 9d5df8a..3f78e2f 100644 --- a/drivers/i2c/fsl_i2c.c +++ b/drivers/i2c/fsl_i2c.c @@ -173,12 +173,11 @@ i2c_init(int speed, int slaveadd) static __inline__ int i2c_wait4bus(void) { - ulong timeval = get_timer(0); + unsigned long long timeval = get_ticks(); while (readb(&i2c_dev[i2c_bus_num]->sr) & I2C_SR_MBB) { - if (get_timer(timeval) > I2C_TIMEOUT) { + if ((get_ticks() - timeval) > usec2ticks(I2C_TIMEOUT)) return -1; - } } return 0; @@ -188,7 +187,7 @@ static __inline__ int i2c_wait(int write) { u32 csr; - ulong timeval = get_timer(0); + unsigned long long timeval = get_ticks(); do { csr = readb(&i2c_dev[i2c_bus_num]->sr); @@ -213,7 +212,7 @@ i2c_wait(int write) } return 0; - } while (get_timer (timeval) < I2C_TIMEOUT); + } while ((get_ticks() - timeval) < usec2ticks(I2C_TIMEOUT)); debug("i2c_wait: timed out\n"); return -1; |