blob: cd92b2c7617dcc1f4fb7531a08b9eb19d63ca008 [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
Andre Przywarade223fd2016-11-03 00:56:25 +000046unsigned long long get_ticks(void)
47{
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}