udelay.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/config.h>
  2. #include <linux/sched.h> /* for udelay's use of smp_processor_id */
  3. #include <asm/param.h>
  4. #include <asm/smp.h>
  5. #include <linux/delay.h>
  6. /*
  7.  * Copyright (C) 1993, 2000 Linus Torvalds
  8.  *
  9.  * Delay routines, using a pre-computed "loops_per_jiffy" value.
  10.  */
  11. /*
  12.  * Use only for very small delays (< 1 msec). 
  13.  *
  14.  * The active part of our cycle counter is only 32-bits wide, and
  15.  * we're treating the difference between two marks as signed.  On
  16.  * a 1GHz box, that's about 2 seconds.
  17.  */
  18. void __delay(int loops)
  19. {
  20. int tmp;
  21. __asm__ __volatile__(
  22. " rpcc %0n"
  23. " addl %1,%0,%1n"
  24. "1: rpcc %0n"
  25. " subl %1,%0,%0n"
  26. " bgt %0,1b"
  27. : "=&r" (tmp), "=r" (loops) : "1"(loops));
  28. }
  29. void __udelay(unsigned long usecs, unsigned long lpj)
  30. {
  31. usecs *= (((unsigned long)HZ << 32) / 1000000) * lpj;
  32. __delay((long)usecs >> 32);
  33. }
  34. void udelay(unsigned long usecs)
  35. {
  36. #ifdef CONFIG_SMP
  37. __udelay(usecs, cpu_data[smp_processor_id()].loops_per_jiffy);
  38. #else
  39. __udelay(usecs, loops_per_jiffy);
  40. #endif
  41. }