fsl_i2c: Use timebase timer functions instead of get_timer()
authorKumar Gala <galak@kernel.crashing.org>
Tue, 29 Jul 2008 17:23:49 +0000 (12:23 -0500)
committerWolfgang Denk <wd@denx.de>
Tue, 29 Jul 2008 23:25:31 +0000 (01:25 +0200)
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>
drivers/i2c/fsl_i2c.c

index 9d5df8ad2ff73c26d456b3b3865b17e92946113a..3f78e2f5c84bcc60ed7e4f4f2d1f4002e1438164 100644 (file)
@@ -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;