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/arm925t/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/arm925t/interrupts.c')
| -rw-r--r-- | cpu/arm925t/interrupts.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/cpu/arm925t/interrupts.c b/cpu/arm925t/interrupts.c index ea4aa3b3b..57bb4eab6 100644 --- a/cpu/arm925t/interrupts.c +++ b/cpu/arm925t/interrupts.c @@ -275,20 +275,24 @@ void udelay_masked (unsigned long usec)  #else  	ulong tmo; +	ulong endtime; +	signed long diff; -	if(usec >= 1000){		/* if "big" number, spread normalization to seconds */ +	if (usec >= 1000) {		/* if "big" number, spread normalization to seconds */  		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */  		tmo *= CFG_HZ;		/* find number of "ticks" to wait to achieve target */  		tmo /= 1000;		/* finish normalize. */ -	}else{				/* else small number, don't kill it prior to HZ multiply */ +	} else {			/* else small number, don't kill it prior to HZ multiply */  		tmo = usec * CFG_HZ;  		tmo /= (1000*1000);  	} -	reset_timer_masked ();	/* set "advancing" timestamp to 0, set lastdec vaule */ +	endtime = get_timer_masked () + tmo; -	while (get_timer_masked () < tmo) /* wait for time stamp to overtake tick number.*/ -		/*NOP*/; +	do { +		ulong now = get_timer_masked (); +		diff = endtime - now; +	} while (diff >= 0);  #endif  }  |