home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-ppc / delay.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  1.9 KB  |  67 lines

  1. #ifdef __KERNEL__
  2. #ifndef _PPC_DELAY_H
  3. #define _PPC_DELAY_H
  4.  
  5. #include <asm/param.h>
  6.  
  7. /*
  8.  * Copyright 1996, Paul Mackerras.
  9.  *
  10.  * This program is free software; you can redistribute it and/or
  11.  * modify it under the terms of the GNU General Public License
  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);
  19.  
  20. /*
  21.  * Note that 19 * 226 == 4294 ==~ 2^32 / 10^6, so
  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
  32.  */
  33. #define __MAX_UDELAY    (226050910UL/HZ)    /* maximum udelay argument */
  34. #define __MAX_NDELAY    (4294967295UL/HZ)    /* maximum ndelay argument */
  35.  
  36. extern __inline__ void __udelay(unsigned int x)
  37. {
  38.     unsigned int loops;
  39.  
  40.     __asm__("mulhwu %0,%1,%2" : "=r" (loops) :
  41.         "r" (x), "r" (loops_per_jiffy * 226));
  42.     __delay(loops);
  43. }
  44.  
  45. extern __inline__ void __ndelay(unsigned int x)
  46. {
  47.     unsigned int loops;
  48.  
  49.     __asm__("mulhwu %0,%1,%2" : "=r" (loops) :
  50.         "r" (x), "r" (loops_per_jiffy * 5));
  51.     __delay(loops);
  52. }
  53.  
  54. extern void __bad_udelay(void);        /* deliberately undefined */
  55. extern void __bad_ndelay(void);        /* deliberately undefined */
  56.  
  57. #define udelay(n) (__builtin_constant_p(n)? \
  58.     ((n) > __MAX_UDELAY? __bad_udelay(): __udelay((n) * (19 * HZ))) : \
  59.     __udelay((n) * (19 * HZ)))
  60.  
  61. #define ndelay(n) (__builtin_constant_p(n)? \
  62.     ((n) > __MAX_NDELAY? __bad_ndelay(): __ndelay((n) * HZ)) : \
  63.     __ndelay((n) * HZ))
  64.  
  65. #endif /* defined(_PPC_DELAY_H) */
  66. #endif /* __KERNEL__ */
  67.