arch_timer.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2012-2014
  4. * Texas Instruments Incorporated, <www.ti.com>
  5. */
  6. #include <common.h>
  7. #include <time.h>
  8. #include <asm/io.h>
  9. #include <div64.h>
  10. #include <bootstage.h>
  11. DECLARE_GLOBAL_DATA_PTR;
  12. #ifndef CONFIG_SYS_HZ_CLOCK
  13. static inline u32 read_cntfrq(void)
  14. {
  15. u32 frq;
  16. asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (frq));
  17. return frq;
  18. }
  19. #endif
  20. int timer_init(void)
  21. {
  22. gd->arch.tbl = 0;
  23. gd->arch.tbu = 0;
  24. #ifdef CONFIG_SYS_HZ_CLOCK
  25. gd->arch.timer_rate_hz = CONFIG_SYS_HZ_CLOCK;
  26. #else
  27. gd->arch.timer_rate_hz = read_cntfrq();
  28. #endif
  29. return 0;
  30. }
  31. unsigned long long get_ticks(void)
  32. {
  33. ulong nowl, nowu;
  34. asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl), "=r" (nowu));
  35. gd->arch.tbl = nowl;
  36. gd->arch.tbu = nowu;
  37. return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
  38. }
  39. ulong timer_get_boot_us(void)
  40. {
  41. if (!gd->arch.timer_rate_hz)
  42. timer_init();
  43. return lldiv(get_ticks(), gd->arch.timer_rate_hz / 1000000);
  44. }
  45. ulong get_tbclk(void)
  46. {
  47. return gd->arch.timer_rate_hz;
  48. }