1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved. 3*54fd6939SJiyong Park * Copyright (c) 2019, Linaro Limited 4*54fd6939SJiyong Park * 5*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 6*54fd6939SJiyong Park */ 7*54fd6939SJiyong Park 8*54fd6939SJiyong Park #ifndef DELAY_TIMER_H 9*54fd6939SJiyong Park #define DELAY_TIMER_H 10*54fd6939SJiyong Park 11*54fd6939SJiyong Park #include <stdbool.h> 12*54fd6939SJiyong Park #include <stdint.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park #include <arch_helpers.h> 15*54fd6939SJiyong Park 16*54fd6939SJiyong Park /******************************************************************** 17*54fd6939SJiyong Park * A simple timer driver providing synchronous delay functionality. 18*54fd6939SJiyong Park * The driver must be initialized with a structure that provides a 19*54fd6939SJiyong Park * function pointer to return the timer value and a clock 20*54fd6939SJiyong Park * multiplier/divider. The ratio of the multiplier and the divider is 21*54fd6939SJiyong Park * the clock period in microseconds. 22*54fd6939SJiyong Park ********************************************************************/ 23*54fd6939SJiyong Park 24*54fd6939SJiyong Park typedef struct timer_ops { 25*54fd6939SJiyong Park uint32_t (*get_timer_value)(void); 26*54fd6939SJiyong Park uint32_t clk_mult; 27*54fd6939SJiyong Park uint32_t clk_div; 28*54fd6939SJiyong Park } timer_ops_t; 29*54fd6939SJiyong Park timeout_cnt_us2cnt(uint32_t us)30*54fd6939SJiyong Parkstatic inline uint64_t timeout_cnt_us2cnt(uint32_t us) 31*54fd6939SJiyong Park { 32*54fd6939SJiyong Park return ((uint64_t)us * (uint64_t)read_cntfrq_el0()) / 1000000ULL; 33*54fd6939SJiyong Park } 34*54fd6939SJiyong Park timeout_init_us(uint32_t us)35*54fd6939SJiyong Parkstatic inline uint64_t timeout_init_us(uint32_t us) 36*54fd6939SJiyong Park { 37*54fd6939SJiyong Park uint64_t cnt = timeout_cnt_us2cnt(us); 38*54fd6939SJiyong Park 39*54fd6939SJiyong Park cnt += read_cntpct_el0(); 40*54fd6939SJiyong Park 41*54fd6939SJiyong Park return cnt; 42*54fd6939SJiyong Park } 43*54fd6939SJiyong Park timeout_elapsed(uint64_t expire_cnt)44*54fd6939SJiyong Parkstatic inline bool timeout_elapsed(uint64_t expire_cnt) 45*54fd6939SJiyong Park { 46*54fd6939SJiyong Park return read_cntpct_el0() > expire_cnt; 47*54fd6939SJiyong Park } 48*54fd6939SJiyong Park 49*54fd6939SJiyong Park void mdelay(uint32_t msec); 50*54fd6939SJiyong Park void udelay(uint32_t usec); 51*54fd6939SJiyong Park void timer_init(const timer_ops_t *ops_ptr); 52*54fd6939SJiyong Park 53*54fd6939SJiyong Park #endif /* DELAY_TIMER_H */ 54