~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/include/asm/delay.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*
  3  * Copyright (C) 1995-2004 Russell King
  4  *
  5  * Delay routines, using a pre-computed "loops_per_second" value.
  6  */
  7 #ifndef __ASM_ARM_DELAY_H
  8 #define __ASM_ARM_DELAY_H
  9 
 10 #include <asm/page.h>
 11 #include <asm/param.h>  /* HZ */
 12 
 13 /*
 14  * Loop (or tick) based delay:
 15  *
 16  * loops = loops_per_jiffy * jiffies_per_sec * delay_us / us_per_sec
 17  *
 18  * where:
 19  *
 20  * jiffies_per_sec = HZ
 21  * us_per_sec = 1000000
 22  *
 23  * Therefore the constant part is HZ / 1000000 which is a small
 24  * fractional number. To make this usable with integer math, we
 25  * scale up this constant by 2^31, perform the actual multiplication,
 26  * and scale the result back down by 2^31 with a simple shift:
 27  *
 28  * loops = (loops_per_jiffy * delay_us * UDELAY_MULT) >> 31
 29  *
 30  * where:
 31  *
 32  * UDELAY_MULT = 2^31 * HZ / 1000000
 33  *             = (2^31 / 1000000) * HZ
 34  *             = 2147.483648 * HZ
 35  *             = 2147 * HZ + 483648 * HZ / 1000000
 36  *
 37  * 31 is the biggest scale shift value that won't overflow 32 bits for
 38  * delay_us * UDELAY_MULT assuming HZ <= 1000 and delay_us <= 2000.
 39  */
 40 #define MAX_UDELAY_MS   2
 41 #define UDELAY_MULT     UL(2147 * HZ + 483648 * HZ / 1000000)
 42 #define UDELAY_SHIFT    31
 43 
 44 #ifndef __ASSEMBLY__
 45 
 46 struct delay_timer {
 47         unsigned long (*read_current_timer)(void);
 48         unsigned long freq;
 49 };
 50 
 51 extern struct arm_delay_ops {
 52         void (*delay)(unsigned long);
 53         void (*const_udelay)(unsigned long);
 54         void (*udelay)(unsigned long);
 55         unsigned long ticks_per_jiffy;
 56 } arm_delay_ops;
 57 
 58 #define __delay(n)              arm_delay_ops.delay(n)
 59 
 60 /*
 61  * This function intentionally does not exist; if you see references to
 62  * it, it means that you're calling udelay() with an out of range value.
 63  *
 64  * With currently imposed limits, this means that we support a max delay
 65  * of 2000us. Further limits: HZ<=1000
 66  */
 67 extern void __bad_udelay(void);
 68 
 69 /*
 70  * division by multiplication: you don't have to worry about
 71  * loss of precision.
 72  *
 73  * Use only for very small delays ( < 2 msec).  Should probably use a
 74  * lookup table, really, as the multiplications take much too long with
 75  * short delays.  This is a "reasonable" implementation, though (and the
 76  * first constant multiplications gets optimized away if the delay is
 77  * a constant)
 78  */
 79 #define __udelay(n)             arm_delay_ops.udelay(n)
 80 #define __const_udelay(n)       arm_delay_ops.const_udelay(n)
 81 
 82 #define udelay(n)                                                       \
 83         (__builtin_constant_p(n) ?                                      \
 84           ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() :              \
 85                         __const_udelay((n) * UDELAY_MULT)) :            \
 86           __udelay(n))
 87 
 88 /* Loop-based definitions for assembly code. */
 89 extern void __loop_delay(unsigned long loops);
 90 extern void __loop_udelay(unsigned long usecs);
 91 extern void __loop_const_udelay(unsigned long);
 92 
 93 /* Delay-loop timer registration. */
 94 #define ARCH_HAS_READ_CURRENT_TIMER
 95 extern void register_current_timer_delay(const struct delay_timer *timer);
 96 
 97 #endif /* __ASSEMBLY__ */
 98 
 99 #endif /* defined(_ARM_DELAY_H) */
100 
101 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php