linux/arch/parisc/include/asm/delay.h
Helge Deller f6d12eefcd parisc: make udelay() SMP-safe
Each CPU has it's own Control Register 16 (CR16) which is used as time source
for the udelay() function. But since the CR16 registers across different CPUs
are not synced, we need to recalculate the loop count if we get switched away
to ensure that we really delay as much time as requested.

Signed-off-by: Helge Deller <deller@gmx.de>
2013-11-07 22:28:26 +01:00

23 lines
494 B
C

#ifndef _ASM_PARISC_DELAY_H
#define _ASM_PARISC_DELAY_H
static __inline__ void __delay(unsigned long loops) {
asm volatile(
" .balignl 64,0x34000034\n"
" addib,UV -1,%0,.\n"
" nop\n"
: "=r" (loops) : "0" (loops));
}
extern void __udelay(unsigned long usecs);
extern void __udelay_bad(unsigned long usecs);
static inline void udelay(unsigned long usecs)
{
if (__builtin_constant_p(usecs) && (usecs) > 20000)
__udelay_bad(usecs);
__udelay(usecs);
}
#endif /* _ASM_PARISC_DELAY_H */