Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
90199457
Commit
90199457
authored
Nov 14, 2019
by
Soby Mathew
Committed by
TrustedFirmware Code Review
Nov 14, 2019
Browse files
Merge "TF-A: Fix non-standard frequency issue in udelay" into integration
parents
5d0bdd57
f2976bdd
Changes
1
Hide whitespace changes
Inline
Side-by-side
drivers/delay_timer/delay_timer.c
View file @
90199457
/*
* Copyright (c) 2015-201
8
, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-201
9
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
...
...
@@ -27,23 +27,32 @@ void udelay(uint32_t usec)
(
timer_ops
->
clk_div
!=
0U
)
&&
(
timer_ops
->
get_timer_value
!=
NULL
));
uint32_t
start
,
delta
,
total_delta
;
uint32_t
start
,
delta
;
uint64_t
total_delta
;
assert
(
usec
<
(
UINT
32
_MAX
/
timer_ops
->
clk_div
));
assert
(
usec
<
(
UINT
64
_MAX
/
timer_ops
->
clk_div
));
start
=
timer_ops
->
get_timer_value
();
/* Add an extra tick to avoid delaying less than requested. */
total_delta
=
div_round_up
(
usec
*
timer_ops
->
clk_div
,
div_round_up
(
(
uint64_t
)
usec
*
timer_ops
->
clk_div
,
timer_ops
->
clk_mult
)
+
1U
;
/*
* Precaution for the total_delta ~ UINT32_MAX and the fact that we
* cannot catch every tick of the timer.
* For example 100MHz timer over 25MHz APB will miss at least 4 ticks.
* 1000U is an arbitrary big number which is believed to be sufficient.
*/
assert
(
total_delta
<
(
UINT32_MAX
-
1000U
));
do
{
/*
* If the timer value wraps around, the subtraction will
* overflow and it will still give the correct result.
* delta is decreasing counter
*/
delta
=
start
-
timer_ops
->
get_timer_value
();
/* Decreasing counter */
delta
=
start
-
timer_ops
->
get_timer_value
();
}
while
(
delta
<
total_delta
);
}
...
...
@@ -54,6 +63,7 @@ void udelay(uint32_t usec)
***********************************************************/
void
mdelay
(
uint32_t
msec
)
{
assert
((
msec
*
1000UL
)
<
UINT32_MAX
);
udelay
(
msec
*
1000U
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment