--- sys/arch/arm/xscale/pxa2x0_clock.c | 44 +++++++++++++---------------------- 1 files changed, 16 insertions(+), 28 deletions(-)
diff --git a/sys/arch/arm/xscale/pxa2x0_clock.c b/sys/arch/arm/xscale/pxa2x0_clock.c index b781edf..8ea5072 100644 --- a/sys/arch/arm/xscale/pxa2x0_clock.c +++ b/sys/arch/arm/xscale/pxa2x0_clock.c @@ -241,26 +241,10 @@ cpu_initclocks() } void -delay(usecs) - u_int usecs; +delay(u_int usecs) { - u_int32_t clock, oclock, delta, delaycnt; + u_int32_t ost, i; volatile int j; - int csec, usec; - - if (usecs > (0x80000000 / (pxaost_sc->sc_clock_hz))) { - csec = usecs / 10000; - usec = usecs % 10000; - - delaycnt = (pxaost_sc->sc_clock_hz / 100) * csec + - (pxaost_sc->sc_clock_hz / 100) * usec / 10000; - } else { - delaycnt = pxaost_sc->sc_clock_hz * usecs / 1000000; - } - - if (delaycnt <= 1) - for (j = 100; j > 0; j--) - ; if (!pxaost_sc) { /* clock isn't initialized yet */ @@ -270,16 +254,20 @@ delay(usecs) return; } - oclock = bus_space_read_4(pxaost_sc->sc_iot, pxaost_sc->sc_ioh, - OST_OSCR0); + /* 1us == 3.25 ticks on pxa27x */ + /* 1us == 3.6864 ticks on pxa25x and 26x */ + i = usecs / 1000000; + usecs %= 1000000; - while (1) { - for (j = 100; j > 0; j--) - ; - clock = bus_space_read_4(pxaost_sc->sc_iot, pxaost_sc->sc_ioh, - OST_OSCR0); - delta = clock - oclock; - if (delta > delaycnt) - break; + while (i--) { + ost = bus_space_read_4(pxaost_sc->sc_iot, pxaost_sc->sc_ioh, + OST_OSCR0) + pxaost_sc->sc_clock_hz; /* 1s ahead */ + while((signed)(ost - bus_space_read_4(pxaost_sc->sc_iot, + pxaost_sc->sc_ioh, OST_OSCR0)) > 0); } + + ost = bus_space_read_4(pxaost_sc->sc_iot, pxaost_sc->sc_ioh, + OST_OSCR0) + ((pxaost_sc->sc_clock_hz * usecs) / 1000000); + while((signed)(ost - bus_space_read_4(pxaost_sc->sc_iot, + pxaost_sc->sc_ioh, OST_OSCR0)) > 0); } -- 1.7.0.5