diff options
| author | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2009-02-24 06:13:10 +0100 | 
|---|---|---|
| committer | Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> | 2009-03-09 12:01:32 +0100 | 
| commit | a922fdb87af25c25c032424908dcf60fbf3250ea (patch) | |
| tree | 2bfb26a67c32c4a336d0596e38785776faa9b08c | |
| parent | 014c595f12d4f7e14cb10188f856465b2d41718f (diff) | |
| download | olio-uboot-2014.01-a922fdb87af25c25c032424908dcf60fbf3250ea.tar.xz olio-uboot-2014.01-a922fdb87af25c25c032424908dcf60fbf3250ea.zip | |
PXA: timer use do_div and simplify it
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
| -rw-r--r-- | cpu/pxa/interrupts.c | 40 | 
1 files changed, 21 insertions, 19 deletions
| diff --git a/cpu/pxa/interrupts.c b/cpu/pxa/interrupts.c index 40d8bf251..2bc5c50a9 100644 --- a/cpu/pxa/interrupts.c +++ b/cpu/pxa/interrupts.c @@ -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 @@ -41,6 +42,20 @@  #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); -	} +	tmo = us_to_tick(usec); +	tmp = get_ticks() + tmo;	/* get current timestamp */ -	endtime = get_ticks() + tmo; +	while (get_ticks() < tmp)	/* loop till event */ +		 /*NOP*/; -	do { -		ulong now = get_ticks(); -		diff = endtime - now; -	} while (diff >= 0);  }  /* |