xref: /rk3399_ARM-atf/drivers/renesas/common/delay/micro_delay.c (revision 65d227c3a20c80bb70f796e5839dc96014f0f9cf)
1*cdcf1f14SBiju Das /*
2*cdcf1f14SBiju Das  * Copyright (c) 2018-2020, Renesas Electronics Corporation. All rights reserved.
3*cdcf1f14SBiju Das  *
4*cdcf1f14SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*cdcf1f14SBiju Das  */
6*cdcf1f14SBiju Das 
7*cdcf1f14SBiju Das #include <arch.h>
8*cdcf1f14SBiju Das #include <arch_helpers.h>
9*cdcf1f14SBiju Das 
10*cdcf1f14SBiju Das #include "micro_delay.h"
11*cdcf1f14SBiju Das 
12*cdcf1f14SBiju Das #define RCAR_CONV_MICROSEC		1000000U
13*cdcf1f14SBiju Das 
14*cdcf1f14SBiju Das void
15*cdcf1f14SBiju Das #if IMAGE_BL31
16*cdcf1f14SBiju Das 	__attribute__ ((section(".system_ram")))
17*cdcf1f14SBiju Das #endif
rcar_micro_delay(uint64_t micro_sec)18*cdcf1f14SBiju Das 	rcar_micro_delay(uint64_t micro_sec)
19*cdcf1f14SBiju Das {
20*cdcf1f14SBiju Das 	uint64_t freq;
21*cdcf1f14SBiju Das 	uint64_t base_count;
22*cdcf1f14SBiju Das 	uint64_t get_count;
23*cdcf1f14SBiju Das 	uint64_t wait_time = 0U;
24*cdcf1f14SBiju Das 
25*cdcf1f14SBiju Das 	freq = read_cntfrq_el0();
26*cdcf1f14SBiju Das 	base_count = read_cntpct_el0();
27*cdcf1f14SBiju Das 	while (micro_sec > wait_time) {
28*cdcf1f14SBiju Das 		get_count = read_cntpct_el0();
29*cdcf1f14SBiju Das 		wait_time = ((get_count - base_count) * RCAR_CONV_MICROSEC) / freq;
30*cdcf1f14SBiju Das 	}
31*cdcf1f14SBiju Das }
32