diff --git a/drivers/delay_timer/delay_timer.c b/drivers/delay_timer/delay_timer.c index 43f5af7..c9f84d7 100644 --- a/drivers/delay_timer/delay_timer.c +++ b/drivers/delay_timer/delay_timer.c @@ -7,6 +7,7 @@ #include #include #include +#include /*********************************************************** * The delay timer implementation @@ -30,7 +31,8 @@ start = ops->get_timer_value(); - total_delta = (usec * ops->clk_div) / ops->clk_mult; + /* Add an extra tick to avoid delaying less than requested. */ + total_delta = div_round_up(usec * ops->clk_div, ops->clk_mult) + 1; do { /* diff --git a/include/lib/utils_def.h b/include/lib/utils_def.h index bda3b07..ecb261a 100644 --- a/include/lib/utils_def.h +++ b/include/lib/utils_def.h @@ -24,6 +24,11 @@ */ #define DIV_ROUND_UP_2EVAL(n, d) (((n) + (d) - 1) / (d)) +#define div_round_up(val, div) __extension__ ({ \ + __typeof__(div) _div = (div); \ + ((val) + _div - 1) / _div; \ +}) + #define MIN(x, y) __extension__ ({ \ __typeof__(x) _x = (x); \ __typeof__(y) _y = (y); \ @@ -55,11 +60,6 @@ #define round_down(value, boundary) \ ((value) & ~round_boundary(value, boundary)) -#define div_round_up(val, div) __extension__ ({ \ - __typeof__(div) _div = (div); \ - round_up((val), _div)/_div; \ -}) - /* * Evaluates to 1 if (ptr + inc) overflows, 0 otherwise. * Both arguments must be unsigned pointer values (i.e. uintptr_t).