]> git.ipfire.org Git - people/ms/u-boot.git/blob - arch/arm/cpu/armv8/generic_timer.c
Merge branch 'master' of git://www.denx.de/git/u-boot-imx
[people/ms/u-boot.git] / arch / arm / cpu / armv8 / generic_timer.c
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 /*
13 * Generic timer implementation of get_tbclk()
14 */
15 unsigned long get_tbclk(void)
16 {
17 unsigned long cntfrq;
18 asm volatile("mrs %0, cntfrq_el0" : "=r" (cntfrq));
19 return cntfrq;
20 }
21
22 /*
23 * Generic timer implementation of timer_read_counter()
24 */
25 unsigned long timer_read_counter(void)
26 {
27 unsigned long cntpct;
28 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
29 /* This erratum number needs to be confirmed to match ARM document */
30 unsigned long temp;
31 #endif
32 isb();
33 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
34 #ifdef CONFIG_SYS_FSL_ERRATUM_A008585
35 asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
36 while (temp != cntpct) {
37 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
38 asm volatile("mrs %0, cntpct_el0" : "=r" (temp));
39 }
40 #endif
41 return cntpct;
42 }
43
44 unsigned long usec2ticks(unsigned long usec)
45 {
46 ulong ticks;
47 if (usec < 1000)
48 ticks = ((usec * (get_tbclk()/1000)) + 500) / 1000;
49 else
50 ticks = ((usec / 10) * (get_tbclk() / 100000));
51
52 return ticks;
53 }