blob: c214b1083ec5df7ab490306be889091db0f2535b [file] [log] [blame]
/*
* linux/include/asm-arm/delay.h
*
* Copyright (C) 1995-2003 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Delay routines, using a pre-computed "loops_per_second" value.
*/
#ifndef __ASM_ARM_DELAY_H
#define __ASM_ARM_DELAY_H
/*
* Division by multiplication and shifts.
*
* We want the number of loops to complete, where loops is:
* (us * (HZ * loops_per_jiffy)) / 10^6
* or
* (ns * (HZ * loops_per_jiffy)) / 10^9
*
* Since we don't want to do long division, we multiply both numerator
* and denominator by (2^28 / 10^6):
*
* (us * (2^28 / 10^6) * HZ * loops_per_jiffy) / 2^28
*
* => (us * (2^28 * HZ / 10^6) * loops_per_jiffy) / 2^28
*
* ~> (((us * (2^28 * HZ / 10^6)) / 2^11) * (loops_per_jiffy / 2^12)) / 2^5
* (for large loops_per_jiffy >> 2^12)
*
* Note: maximum loops_per_jiffy = 67108863 (bogomips = 1342.18)
* minimum loops_per_jiffy = 20000 (bogomips = 0.4)
*
* Note: we rely on HZ = 100.
*/
#define UDELAY_FACTOR 26843
#define NDELAY_FACTOR 27
#ifndef __ASSEMBLY__
extern void __bad_udelay(void); /* intentional errors */
extern void __bad_ndelay(void); /* intentional errors */
extern void __delay(unsigned long loops);
extern void __udelay(unsigned long usecs);
extern void __ndelay(unsigned long nsecs);
extern void __const_delay(unsigned long units);
#define udelay(n) \
(__builtin_constant_p(n) ? \
((n) > 20000 ? __bad_udelay() \
: __const_delay((n) * UDELAY_FACTOR)) \
: __udelay(n))
#define ndelay(n) \
(__builtin_constant_p(n) ? \
((n) > 20000 ? __bad_ndelay() \
: __const_delay((n) * NDELAY_FACTOR)) \
: __ndelay(n))
#endif
#endif /* defined(_ARM_DELAY_H) */