blob: 20a55435702330533f5927547fe16a51d84e8fbd [file] [log] [blame]
Ryan Harkin32539fc2015-03-17 14:50:05 +00001/*
Lionel Debieve94a552f2019-09-24 16:59:56 +02002 * Copyright (c) 2015-2019, ARM Limited and Contributors. All rights reserved.
3 * Copyright (c) 2019, Linaro Limited
Ryan Harkin32539fc2015-03-17 14:50:05 +00004 *
dp-armfa3cf0b2017-05-03 09:38:09 +01005 * SPDX-License-Identifier: BSD-3-Clause
Ryan Harkin32539fc2015-03-17 14:50:05 +00006 */
7
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +00008#ifndef DELAY_TIMER_H
9#define DELAY_TIMER_H
Ryan Harkin32539fc2015-03-17 14:50:05 +000010
Lionel Debieve94a552f2019-09-24 16:59:56 +020011#include <stdbool.h>
Ryan Harkin32539fc2015-03-17 14:50:05 +000012#include <stdint.h>
13
Lionel Debieve94a552f2019-09-24 16:59:56 +020014#include <arch_helpers.h>
15
Ryan Harkin32539fc2015-03-17 14:50:05 +000016/********************************************************************
17 * A simple timer driver providing synchronous delay functionality.
18 * The driver must be initialized with a structure that provides a
19 * function pointer to return the timer value and a clock
20 * multiplier/divider. The ratio of the multiplier and the divider is
Juan Castillofd383b42015-12-01 16:10:15 +000021 * the clock period in microseconds.
Ryan Harkin32539fc2015-03-17 14:50:05 +000022 ********************************************************************/
23
24typedef struct timer_ops {
25 uint32_t (*get_timer_value)(void);
26 uint32_t clk_mult;
27 uint32_t clk_div;
28} timer_ops_t;
29
Lionel Debieve94a552f2019-09-24 16:59:56 +020030static inline uint64_t timeout_cnt_us2cnt(uint32_t us)
31{
32 return ((uint64_t)us * (uint64_t)read_cntfrq_el0()) / 1000000ULL;
33}
34
35static inline uint64_t timeout_init_us(uint32_t us)
36{
37 uint64_t cnt = timeout_cnt_us2cnt(us);
38
Yann Gautieraf0c9142019-10-08 11:13:06 +020039 cnt += read_cntpct_el0();
Lionel Debieve94a552f2019-09-24 16:59:56 +020040
41 return cnt;
42}
43
44static inline bool timeout_elapsed(uint64_t expire_cnt)
45{
46 return read_cntpct_el0() > expire_cnt;
47}
48
Ryan Harkin32539fc2015-03-17 14:50:05 +000049void mdelay(uint32_t msec);
50void udelay(uint32_t usec);
Roberto Vargas777dd432018-02-12 12:36:17 +000051void timer_init(const timer_ops_t *ops_ptr);
Ryan Harkin32539fc2015-03-17 14:50:05 +000052
Antonio Nino Diaz5eb88372018-11-08 10:20:19 +000053#endif /* DELAY_TIMER_H */