[PATCH 3.16 34/83] staging: comedi: dt3000: Fix rounding up of timer divisor

From: Ben Hutchings
Date: Wed Nov 20 2019 - 10:44:25 EST

3.16.78-rc1 review patch. If anyone has any objections, please let me know.


From: Ian Abbott <abbotti@xxxxxxxxx>

commit 8e2a589a3fc36ce858d42e767c3bcd8fc62a512b upstream.

`dt3k_ns_to_timer()` determines the prescaler and divisor to use to
produce a desired timing period. It is influenced by a rounding mode
and can round the divisor up, down, or to the nearest value. However,
the code for rounding up currently does the same as rounding down! Fix
ir by using the `DIV_ROUND_UP()` macro to calculate the divisor when
rounding up.

Also, change the types of the `divider`, `base` and `prescale` variables
from `int` to `unsigned int` to avoid mixing signed and unsigned types
in the calculations.

Also fix a typo in a nearby comment: "improvment" => "improvement".

Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx>
Link: https://lore.kernel.org/r/20190812120814.21188-1-abbotti@xxxxxxxxx
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <ben@xxxxxxxxxxxxxxx>
drivers/staging/comedi/drivers/dt3000.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

--- a/drivers/staging/comedi/drivers/dt3000.c
+++ b/drivers/staging/comedi/drivers/dt3000.c
@@ -379,9 +379,9 @@ static irqreturn_t dt3k_interrupt(int ir
static int dt3k_ns_to_timer(unsigned int timer_base, unsigned int *nanosec,
unsigned int round_mode)
- int divider, base, prescale;
+ unsigned int divider, base, prescale;

- /* This function needs improvment */
+ /* This function needs improvement */
/* Don't know if divider==0 works. */

for (prescale = 0; prescale < 16; prescale++) {
@@ -395,7 +395,7 @@ static int dt3k_ns_to_timer(unsigned int
divider = (*nanosec) / base;
- divider = (*nanosec) / base;
+ divider = DIV_ROUND_UP(*nanosec, base);
if (divider < 65536) {