delay.c 581 B

123456789101112131415161718192021222324252627
  1. #include <asm/delay.h>
  2. #include <asm/timex.h>
  3. #include <asm/io.h>
  4. #include <variant/hardware.h>
  5. #define LOOPS 10
  6. void platform_calibrate_ccount(void)
  7. {
  8. u32 uninitialized_var(a);
  9. u32 uninitialized_var(u);
  10. u32 b;
  11. u32 tstamp = S6_REG_GREG1 + S6_GREG1_GLOBAL_TIMER;
  12. int i = LOOPS+1;
  13. do {
  14. u32 t = u;
  15. asm volatile(
  16. "1: l32i %0, %2, 0 ;"
  17. " beq %0, %1, 1b ;"
  18. : "=&a"(u) : "a"(t), "a"(tstamp));
  19. b = xtensa_get_ccount();
  20. if (i == LOOPS)
  21. a = b;
  22. } while (--i >= 0);
  23. b -= a;
  24. nsec_per_ccount = (LOOPS * 10000) / b;
  25. ccount_per_jiffy = b * (100000UL / (LOOPS * HZ));
  26. }