delay.h 1.1 KB

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