delay.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. * include/asm-v850/delay.h -- Delay routines, using a pre-computed
  3. * "loops_per_second" value
  4. *
  5. * Copyright (C) 2001,03 NEC Corporation
  6. * Copyright (C) 2001,03 Miles Bader <miles@gnu.org>
  7. * Copyright (C) 1994 Hamish Macdonald
  8. *
  9. * This file is subject to the terms and conditions of the GNU General
  10. * Public License. See the file COPYING in the main directory of this
  11. * archive for more details.
  12. */
  13. #ifndef __V850_DELAY_H__
  14. #define __V850_DELAY_H__
  15. #include <asm/param.h>
  16. static inline void __delay(unsigned long loops)
  17. {
  18. if (loops)
  19. __asm__ __volatile__ ("1: add -1, %0; bnz 1b"
  20. : "=r" (loops) : "0" (loops));
  21. }
  22. /*
  23. * Use only for very small delays ( < 1 msec). Should probably use a
  24. * lookup table, really, as the multiplications take much too long with
  25. * short delays. This is a "reasonable" implementation, though (and the
  26. * first constant multiplications gets optimized away if the delay is
  27. * a constant)
  28. */
  29. extern unsigned long loops_per_jiffy;
  30. static inline void udelay(unsigned long usecs)
  31. {
  32. register unsigned long full_loops, part_loops;
  33. full_loops = ((usecs * HZ) / 1000000) * loops_per_jiffy;
  34. usecs %= (1000000 / HZ);
  35. part_loops = (usecs * HZ * loops_per_jiffy) / 1000000;
  36. __delay(full_loops + part_loops);
  37. }
  38. #endif /* __V850_DELAY_H__ */