PXA: timer use do_div and simplify it
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Tue, 24 Feb 2009 05:13:10 +0000 (06:13 +0100)
committerJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Mon, 9 Mar 2009 11:01:32 +0000 (12:01 +0100)
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
cpu/pxa/interrupts.c

index 40d8bf251faed579ecc4dfaafa61fb320cfe4f2c..2bc5c50a9171f433ddd254bae568dd144475a0ad 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <common.h>
 #include <asm/arch/pxa-regs.h>
+#include <div64.h>
 
 #ifdef CONFIG_USE_IRQ
 #error: interrupts not implemented yet
 #error "Timer frequency unknown - please config PXA CPU type"
 #endif
 
+static inline unsigned long long tick_to_time(unsigned long long tick)
+{
+       tick *= CONFIG_SYS_HZ;
+       do_div(tick, TIMER_FREQ_HZ);
+       return tick;
+}
+
+static inline unsigned long long us_to_tick(unsigned long long us)
+{
+       us = us * TIMER_FREQ_HZ + 999999;
+       do_div(us, 1000000);
+       return us;
+}
+
 int interrupt_init (void)
 {
        /* nothing happens here - we don't setup any IRQs */
@@ -75,33 +90,20 @@ void reset_timer_masked (void)
 
 ulong get_timer_masked (void)
 {
-       unsigned long long ticks = get_ticks();
-
-       return (((ticks / TIMER_FREQ_HZ) * 1000) +
-               ((ticks % TIMER_FREQ_HZ) * 1000) / TIMER_FREQ_HZ);
+       return tick_to_time(get_ticks());
 }
 
 void udelay_masked (unsigned long usec)
 {
+       unsigned long long tmp;
        ulong tmo;
-       ulong endtime;
-       signed long diff;
-
-       if (usec >= 1000) {
-               tmo = usec / 1000;
-               tmo *= TIMER_FREQ_HZ;
-               tmo /= 1000;
-       } else {
-               tmo = usec * TIMER_FREQ_HZ;
-               tmo /= (1000*1000);
-       }
-
-       endtime = get_ticks() + tmo;
-
-       do {
-               ulong now = get_ticks();
-               diff = endtime - now;
-       } while (diff >= 0);
+
+       tmo = us_to_tick(usec);
+       tmp = get_ticks() + tmo;        /* get current timestamp */
+
+       while (get_ticks() < tmp)       /* loop till event */
+                /*NOP*/;
+
 }
 
 /*