1
2
3
4
5
6
7
8#include <common.h>
9#include <command.h>
10#include <asm/system.h>
11
12DECLARE_GLOBAL_DATA_PTR;
13
14
15
16
17unsigned long get_tbclk(void)
18{
19 unsigned long cntfrq;
20 asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
21 return cntfrq;
22}
23
24
25
26
27unsigned long timer_read_counter(void)
28{
29 unsigned long cntpct;
30#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
31
32 unsigned long temp;
33#endif
34 isb();
35 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
36#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
37 asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
38 while (temp != cntpct) {
39 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
40 asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
41 }
42#endif
43 return cntpct;
44}
45
46uint64_t get_ticks(void)
47{
48 unsigned long ticks = timer_read_counter();
49
50 gd->arch.tbl = ticks;
51
52 return ticks;
53}
54
55unsigned long usec2ticks(unsigned long usec)
56{
57 ulong ticks;
58 if (usec < 1000)
59 ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
60 else
61 ticks = ((usec / 10) * (get_tbclk() / 100000));
62
63 return ticks;
64}
65