Merge branch 'master' of git://git.denx.de/u-boot-mips
[oweals/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 }