delay.c 721 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /*
  2. * Precise Delay Loops for SuperH
  3. *
  4. * Copyright (C) 1999 Niibe Yutaka & Kaz Kojima
  5. */
  6. #include <linux/sched.h>
  7. #include <linux/delay.h>
  8. void __delay(unsigned long loops)
  9. {
  10. __asm__ __volatile__(
  11. "tst %0, %0\n\t"
  12. "1:\t"
  13. "bf/s 1b\n\t"
  14. " dt %0"
  15. : "=r" (loops)
  16. : "0" (loops)
  17. : "t");
  18. }
  19. inline void __const_udelay(unsigned long xloops)
  20. {
  21. __asm__("dmulu.l %0, %2\n\t"
  22. "sts mach, %0"
  23. : "=r" (xloops)
  24. : "0" (xloops),
  25. "r" (HZ * cpu_data[raw_smp_processor_id()].loops_per_jiffy)
  26. : "macl", "mach");
  27. __delay(xloops);
  28. }
  29. void __udelay(unsigned long usecs)
  30. {
  31. __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */
  32. }
  33. void __ndelay(unsigned long nsecs)
  34. {
  35. __const_udelay(nsecs * 0x00000005);
  36. }