delay.c 717 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  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), "r" (cpu_data[raw_smp_processor_id()].loops_per_jiffy)
  25. : "macl", "mach");
  26. __delay(xloops * HZ);
  27. }
  28. void __udelay(unsigned long usecs)
  29. {
  30. __const_udelay(usecs * 0x000010c6); /* 2**32 / 1000000 */
  31. }
  32. void __ndelay(unsigned long nsecs)
  33. {
  34. __const_udelay(nsecs * 0x00000005);
  35. }