xref: /rk3399_ARM-atf/plat/marvell/armada/common/plat_delay_timer.c (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
1*a2847172SGrzegorz Jaszczyk /*
2*a2847172SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
3*a2847172SGrzegorz Jaszczyk  *
4*a2847172SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*a2847172SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*a2847172SGrzegorz Jaszczyk  */
7*a2847172SGrzegorz Jaszczyk 
8*a2847172SGrzegorz Jaszczyk #include <arch_helpers.h>
9*a2847172SGrzegorz Jaszczyk #include <drivers/delay_timer.h>
10*a2847172SGrzegorz Jaszczyk 
11*a2847172SGrzegorz Jaszczyk #include <mvebu_def.h>
12*a2847172SGrzegorz Jaszczyk 
13*a2847172SGrzegorz Jaszczyk #define SYS_COUNTER_FREQ_IN_MHZ	(COUNTER_FREQUENCY/1000000)
14*a2847172SGrzegorz Jaszczyk 
plat_get_timer_value(void)15*a2847172SGrzegorz Jaszczyk static uint32_t plat_get_timer_value(void)
16*a2847172SGrzegorz Jaszczyk {
17*a2847172SGrzegorz Jaszczyk 	/*
18*a2847172SGrzegorz Jaszczyk 	 * Generic delay timer implementation expects the timer to be a down
19*a2847172SGrzegorz Jaszczyk 	 * counter. We apply bitwise NOT operator to the tick values returned
20*a2847172SGrzegorz Jaszczyk 	 * by read_cntpct_el0() to simulate the down counter.
21*a2847172SGrzegorz Jaszczyk 	 */
22*a2847172SGrzegorz Jaszczyk 	return (uint32_t)(~read_cntpct_el0());
23*a2847172SGrzegorz Jaszczyk }
24*a2847172SGrzegorz Jaszczyk 
25*a2847172SGrzegorz Jaszczyk static const timer_ops_t plat_timer_ops = {
26*a2847172SGrzegorz Jaszczyk 	.get_timer_value	= plat_get_timer_value,
27*a2847172SGrzegorz Jaszczyk 	.clk_mult		= 1,
28*a2847172SGrzegorz Jaszczyk 	.clk_div		= SYS_COUNTER_FREQ_IN_MHZ
29*a2847172SGrzegorz Jaszczyk };
30*a2847172SGrzegorz Jaszczyk 
plat_delay_timer_init(void)31*a2847172SGrzegorz Jaszczyk void plat_delay_timer_init(void)
32*a2847172SGrzegorz Jaszczyk {
33*a2847172SGrzegorz Jaszczyk 	timer_init(&plat_timer_ops);
34*a2847172SGrzegorz Jaszczyk }
35