linux/include/asm-generic/delay.h
<<
>>
Prefs
   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 */
   6extern void __bad_udelay(void);
   7extern void __bad_ndelay(void);
   8
   9extern void __udelay(unsigned long usecs);
  10extern void __ndelay(unsigned long nsecs);
  11extern void __const_udelay(unsigned long xloops);
  12extern 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