blob: a2dda333fe5f63979f5b4d4fbf4d40b18ff9934d [file] [log] [blame]
David Feng85fd5f12013-12-14 11:47:35 +08001/*
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
Andre Przywarade223fd2016-11-03 00:56:25 +000012DECLARE_GLOBAL_DATA_PTR;
13
David Feng85fd5f12013-12-14 11:47:35 +080014/*
15 * Generic timer implementation of get_tbclk()
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 * Generic timer implementation of timer_read_counter()
26 */
27unsigned long timer_read_counter(void)
28{
29 unsigned long cntpct;
York Suna7686cf2015-03-20 19:28:05 -070030#ifdef CONFIG_SYS_FSL_ERRATUM_A008585
31 /* This erratum number needs to be confirmed to match ARM document */
32 unsigned long temp;
33#endif
David Feng85fd5f12013-12-14 11:47:35 +080034 isb();
35 asm volatile("mrs %0, cntpct_el0" : "=r" (cntpct));
York Suna7686cf2015-03-20 19:28:05 -070036#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
David Feng85fd5f12013-12-14 11:47:35 +080043 return cntpct;
44}
Aneesh Bansald1074b42015-12-08 13:54:26 +053045
Simon Glasse9873932017-04-05 17:53:17 -060046uint64_t get_ticks(void)
Andre Przywarade223fd2016-11-03 00:56:25 +000047{
48 unsigned long ticks = timer_read_counter();
49
50 gd->arch.tbl = ticks;
51
52 return ticks;
53}
54
Aneesh Bansald1074b42015-12-08 13:54:26 +053055unsigned 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}