
loop based udelay without multiplication
By: a guest on
Jun 18th, 2010 | syntax:
C | size: 0.71 KB | hits: 142 | expires: Never
static inline void udelay(unsigned usecs)
{
unsigned cycles_per_usec;
unsigned loops_per_usec;
if (cpu_frequency == CPUFREQ_MAX) {
cycles_per_usec = (CPUFREQ_MAX + 999999) / 1000000;
} else {
cycles_per_usec = (CPUFREQ_NORMAL + 999999) / 1000000;
}
/*
* One iteration of the inner loop takes 4 cycles,
* sustract 1 to account for the outer loop.
*/
loops_per_usec = (cycles_per_usec+3)/4 - 1;
asm volatile(
"2: mov r0, %1 \n"
"1: subs r0, r0, #1 \n"
" bne 1b \n"
" subs %0, %0, #1 \n"
" bne 2b \n"
: : "r"(usecs), "r"(loops_per_usec) : "r0"
);
}