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