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