1 /* SPDX-License-Identifier: GPL-2.0 */ !! 1 #ifdef __KERNEL__ 2 #ifndef __ASM_GENERIC_DELAY_H !! 2 #ifndef _PPC_DELAY_H 3 #define __ASM_GENERIC_DELAY_H !! 3 #define _PPC_DELAY_H 4 !! 4 5 /* Undefined functions to get compile-time err !! 5 #include <asm/param.h> 6 extern void __bad_udelay(void); !! 6 7 extern void __bad_ndelay(void); !! 7 /* 8 !! 8 * Copyright 1996, Paul Mackerras. 9 extern void __udelay(unsigned long usecs); !! 9 * 10 extern void __ndelay(unsigned long nsecs); !! 10 * This program is free software; you can redistribute it and/or 11 extern void __const_udelay(unsigned long xloop !! 11 * modify it under the terms of the GNU General Public License 12 extern void __delay(unsigned long loops); !! 12 * as published by the Free Software Foundation; either version >> 13 * 2 of the License, or (at your option) any later version. >> 14 */ >> 15 >> 16 extern unsigned long loops_per_jiffy; >> 17 >> 18 extern void __delay(unsigned int loops); 13 19 14 /* 20 /* 15 * The weird n/20000 thing suppresses a "compa !! 21 * Note that 19 * 226 == 4294 ==~ 2^32 / 10^6, so 16 * limited range of data type" warning with no !! 22 * loops = (4294 * usecs * loops_per_jiffy * HZ) / 2^32. >> 23 * >> 24 * The mulhwu instruction gives us loops = (a * b) / 2^32. >> 25 * We choose a = usecs * 19 * HZ and b = loops_per_jiffy * 226 >> 26 * because this lets us support a wide range of HZ and >> 27 * loops_per_jiffy values without either a or b overflowing 2^32. >> 28 * Thus we need usecs * HZ <= (2^32 - 1) / 19 = 226050910 and >> 29 * loops_per_jiffy <= (2^32 - 1) / 226 = 19004280 >> 30 * (which corresponds to ~3800 bogomips at HZ = 100). >> 31 * -- paulus 17 */ 32 */ >> 33 #define __MAX_UDELAY (226050910UL/HZ) /* maximum udelay argument */ >> 34 #define __MAX_NDELAY (4294967295UL/HZ) /* maximum ndelay argument */ 18 35 19 /* 0x10c7 is 2**32 / 1000000 (rounded up) */ !! 36 extern __inline__ void __udelay(unsigned int x) 20 #define udelay(n) !! 37 { 21 ({ !! 38 unsigned int loops; 22 if (__builtin_constant_p(n)) { !! 39 23 if ((n) / 20000 >= 1) !! 40 __asm__("mulhwu %0,%1,%2" : "=r" (loops) : 24 __bad_udelay( !! 41 "r" (x), "r" (loops_per_jiffy * 226)); 25 else !! 42 __delay(loops); 26 __const_udelay !! 43 } 27 } else { !! 44 28 __udelay(n); !! 45 extern __inline__ void __ndelay(unsigned int x) 29 } !! 46 { 30 }) !! 47 unsigned int loops; 31 !! 48 32 /* 0x5 is 2**32 / 1000000000 (rounded up) */ !! 49 __asm__("mulhwu %0,%1,%2" : "=r" (loops) : 33 #define ndelay(n) !! 50 "r" (x), "r" (loops_per_jiffy * 5)); 34 ({ !! 51 __delay(loops); 35 if (__builtin_constant_p(n)) { !! 52 } 36 if ((n) / 20000 >= 1) !! 53 37 __bad_ndelay() !! 54 extern void __bad_udelay(void); /* deliberately undefined */ 38 else !! 55 extern void __bad_ndelay(void); /* deliberately undefined */ 39 __const_udelay !! 56 40 } else { !! 57 #define udelay(n) (__builtin_constant_p(n)? \ 41 __ndelay(n); !! 58 ((n) > __MAX_UDELAY? __bad_udelay(): __udelay((n) * (19 * HZ))) : \ 42 } !! 59 __udelay((n) * (19 * HZ))) 43 }) !! 60 >> 61 #define ndelay(n) (__builtin_constant_p(n)? \ >> 62 ((n) > __MAX_NDELAY? __bad_ndelay(): __ndelay((n) * HZ)) : \ >> 63 __ndelay((n) * HZ)) 44 64 45 #endif /* __ASM_GENERIC_DELAY_H */ !! 65 #endif /* defined(_PPC_DELAY_H) */ >> 66 #endif /* __KERNEL__ */ 46 67
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.