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 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 31*a2847172SGrzegorz Jaszczyk void plat_delay_timer_init(void) 32*a2847172SGrzegorz Jaszczyk { 33*a2847172SGrzegorz Jaszczyk timer_init(&plat_timer_ops); 34*a2847172SGrzegorz Jaszczyk } 35