diff options
| author | wdenk <wdenk> | 2005-04-04 12:08:28 +0000 | 
|---|---|---|
| committer | wdenk <wdenk> | 2005-04-04 12:08:28 +0000 | 
| commit | 101e8dfa2a8b045c6655bf2b3d6fba8d378453cd (patch) | |
| tree | 1c39acefbaf435ddc2e9f42540eb64ea267cb530 /cpu/s3c44b0/interrupts.c | |
| parent | 50712ba16e7e469e90952a7f197efa46e2f8e311 (diff) | |
| download | olio-uboot-2014.01-101e8dfa2a8b045c6655bf2b3d6fba8d378453cd.tar.xz olio-uboot-2014.01-101e8dfa2a8b045c6655bf2b3d6fba8d378453cd.zip  | |
Fix timer code for ARM systems: make sure that udelay() does not
reset timers so it's save to use udelay() in timeout code.
Diffstat (limited to 'cpu/s3c44b0/interrupts.c')
| -rw-r--r-- | cpu/s3c44b0/interrupts.c | 23 | 
1 files changed, 15 insertions, 8 deletions
diff --git a/cpu/s3c44b0/interrupts.c b/cpu/s3c44b0/interrupts.c index dea8118dd..5d2c13d97 100644 --- a/cpu/s3c44b0/interrupts.c +++ b/cpu/s3c44b0/interrupts.c @@ -219,15 +219,22 @@ ulong get_timer_masked (void)  void udelay_masked (unsigned long usec)  {  	ulong tmo; +	ulong endtime; +	signed long diff; -	tmo = usec / 1000; -	tmo *= CFG_HZ; -	tmo /= 8; - -	tmo += get_timer (0); +	if (usec >= 1000) { +		tmo = usec / 1000; +		tmo *= CFG_HZ; +		tmo /= 8; +	} else { +		tmo = usec * CFG_HZ; +		tmo /= (1000*8); +	} -	reset_timer_masked (); +	endtime = get_timer(0) + tmo; -	while (get_timer_masked () < tmo) -		/*NOP*/; +	do { +		ulong now = get_timer_masked (); +		diff = endtime - now; +	} while (diff >= 0);  }  |