Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
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
5 years ago
by
Soby Mathew
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "TF-A: Fix non-standard frequency issue in udelay" into integration
parents
5d0bdd57
f2976bdd
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
drivers/delay_timer/delay_timer.c
+15
-5
drivers/delay_timer/delay_timer.c
with
15 additions
and
5 deletions
+15
-5
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
);
}
...
...
This diff is collapsed.
Click to expand it.
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
Menu
Projects
Groups
Snippets
Help