1 /*
2  * (C) Copyright 2013
3  * David Feng <fenghua@phytium.com.cn>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 
8 #include <common.h>
9 #include <command.h>
10 #include <asm/system.h>
11 
12 DECLARE_GLOBAL_DATA_PTR;
13 
14 /*
15  * Generic timer implementation of get_tbclk()
16  */
17 unsigned 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  * Generic timer implementation of timer_read_counter()
26  */
27 unsigned long timer_read_counter(void)
28 {
29 	unsigned long cntpct;
30 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
31 	/* This erratum number needs to be confirmed to match ARM document */
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 
46 uint64_t get_ticks(void)
47 {
48 	unsigned long ticks = timer_read_counter();
49 
50 	gd->arch.tbl = ticks;
51 
52 	return ticks;
53 }
54 
55 unsigned 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