delay.c 741 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. xloops *= 4;
  22. __asm__("dmulu.l %0, %2\n\t"
  23. "sts mach, %0"
  24. : "=r" (xloops)
  25. : "0" (xloops),
  26. "r" (cpu_data[raw_smp_processor_id()].loops_per_jiffy * (HZ/4))
  27. : "macl", "mach");
  28. __delay(++xloops);
  29. }
  30. void __udelay(unsigned long usecs)
  31. {
  32. __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */
  33. }
  34. void __ndelay(unsigned long nsecs)
  35. {
  36. __const_udelay(nsecs * 0x00000005);
  37. }