xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/arch_timer.c (revision 11bc75572218eeb7f9d9a5f189e98e328a8aeac9)
1*11bc7557SVitaly Andrianov /*
2*11bc7557SVitaly Andrianov  * (C) Copyright 2012-2014
3*11bc7557SVitaly Andrianov  *     Texas Instruments Incorporated, <www.ti.com>
4*11bc7557SVitaly Andrianov  *
5*11bc7557SVitaly Andrianov  * SPDX-License-Identifier:     GPL-2.0+
6*11bc7557SVitaly Andrianov  */
7*11bc7557SVitaly Andrianov 
8*11bc7557SVitaly Andrianov #include <common.h>
9*11bc7557SVitaly Andrianov #include <asm/io.h>
10*11bc7557SVitaly Andrianov #include <div64.h>
11*11bc7557SVitaly Andrianov 
12*11bc7557SVitaly Andrianov DECLARE_GLOBAL_DATA_PTR;
13*11bc7557SVitaly Andrianov 
14*11bc7557SVitaly Andrianov int timer_init(void)
15*11bc7557SVitaly Andrianov {
16*11bc7557SVitaly Andrianov 	gd->arch.tbl = 0;
17*11bc7557SVitaly Andrianov 	gd->arch.tbu = 0;
18*11bc7557SVitaly Andrianov 
19*11bc7557SVitaly Andrianov 	gd->arch.timer_rate_hz = CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ;
20*11bc7557SVitaly Andrianov 
21*11bc7557SVitaly Andrianov 	return 0;
22*11bc7557SVitaly Andrianov }
23*11bc7557SVitaly Andrianov 
24*11bc7557SVitaly Andrianov unsigned long long get_ticks(void)
25*11bc7557SVitaly Andrianov {
26*11bc7557SVitaly Andrianov 	ulong nowl, nowu;
27*11bc7557SVitaly Andrianov 
28*11bc7557SVitaly Andrianov 	asm volatile("mrrc p15, 0, %0, %1, c14" : "=r" (nowl), "=r" (nowu));
29*11bc7557SVitaly Andrianov 
30*11bc7557SVitaly Andrianov 	gd->arch.tbl = nowl;
31*11bc7557SVitaly Andrianov 	gd->arch.tbu = nowu;
32*11bc7557SVitaly Andrianov 
33*11bc7557SVitaly Andrianov 	return (((unsigned long long)gd->arch.tbu) << 32) | gd->arch.tbl;
34*11bc7557SVitaly Andrianov }
35*11bc7557SVitaly Andrianov 
36*11bc7557SVitaly Andrianov 
37*11bc7557SVitaly Andrianov ulong get_timer(ulong base)
38*11bc7557SVitaly Andrianov {
39*11bc7557SVitaly Andrianov 	return lldiv(get_ticks(), gd->arch.timer_rate_hz) - base;
40*11bc7557SVitaly Andrianov }
41*11bc7557SVitaly Andrianov 
42*11bc7557SVitaly Andrianov void __udelay(unsigned long usec)
43*11bc7557SVitaly Andrianov {
44*11bc7557SVitaly Andrianov 	unsigned long long endtime;
45*11bc7557SVitaly Andrianov 
46*11bc7557SVitaly Andrianov 	endtime = lldiv((unsigned long long)usec * gd->arch.timer_rate_hz,
47*11bc7557SVitaly Andrianov 			1000UL);
48*11bc7557SVitaly Andrianov 
49*11bc7557SVitaly Andrianov 	endtime += get_ticks();
50*11bc7557SVitaly Andrianov 
51*11bc7557SVitaly Andrianov 	while (get_ticks() < endtime)
52*11bc7557SVitaly Andrianov 		;
53*11bc7557SVitaly Andrianov }
54*11bc7557SVitaly Andrianov 
55*11bc7557SVitaly Andrianov ulong get_tbclk(void)
56*11bc7557SVitaly Andrianov {
57*11bc7557SVitaly Andrianov 	return gd->arch.timer_rate_hz;
58*11bc7557SVitaly Andrianov }
59