1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __ASM_GENERIC_DELAY_H 3 #define __ASM_GENERIC_DELAY_H 4 5 /* Undefined functions to get compile-time errors */ 6 extern void __bad_udelay(void); 7 extern void __bad_ndelay(void); 8 9 extern void __udelay(unsigned long usecs); 10 extern void __ndelay(unsigned long nsecs); 11 extern void __const_udelay(unsigned long xloops); 12 extern void __delay(unsigned long loops); 13 14 /* 15 * The weird n/20000 thing suppresses a "comparison is always false due to 16 * limited range of data type" warning with non-const 8-bit arguments. 17 */ 18 19 /* 0x10c7 is 2**32 / 1000000 (rounded up) */ 20 #define udelay(n) \ 21 ({ \ 22 if (__builtin_constant_p(n)) { \ 23 if ((n) / 20000 >= 1) \ 24 __bad_udelay(); \ 25 else \ 26 __const_udelay((n) * 0x10c7ul); \ 27 } else { \ 28 __udelay(n); \ 29 } \ 30 }) 31 32 /* 0x5 is 2**32 / 1000000000 (rounded up) */ 33 #define ndelay(n) \ 34 ({ \ 35 if (__builtin_constant_p(n)) { \ 36 if ((n) / 20000 >= 1) \ 37 __bad_ndelay(); \ 38 else \ 39 __const_udelay((n) * 5ul); \ 40 } else { \ 41 __ndelay(n); \ 42 } \ 43 }) 44 45 #endif /* __ASM_GENERIC_DELAY_H */ 46