Re: [PATCH] iio: frequency: ad983x: replace do_div() with div64_ul().
From: David Laight
Date: Thu Apr 09 2026 - 13:28:09 EST
On Thu, 9 Apr 2026 13:18:23 +0000
Joshua Crofts <joshua.crofts1@xxxxxxxxx> wrote:
> Coccinelle reported the following in both ad983x drivers:
> do_div() does a 64-by-32 division, please consider using
> div64_ul instead.
>
> Fix this by replacing do_div() with div64_ul(), which
> safely handles 64-bit dividends and unsigned long
> divisors across all architectures.
Except here you have clock frequencies.
Either they fit in 32bits or they don't.
So the value shouldn't be 'unsigned long', but either u32 or u64.
You need to check the domain of the values, coccinelle is just looking
at the types.
Even with mclk being 'unsigned long' the code is fine provided the
frequency is below 4.2GHz.
So you are probably fixing nothing.
David
>
> Signed-off-by: Joshua Crofts <joshua.crofts1@xxxxxxxxx>
> ---
> drivers/staging/iio/frequency/ad9832.c | 3 ++-
> drivers/staging/iio/frequency/ad9834.c | 3 ++-
> 2 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/staging/iio/frequency/ad9832.c b/drivers/staging/iio/frequency/ad9832.c
> index b87ea1781b..61ee93263a 100644
> --- a/drivers/staging/iio/frequency/ad9832.c
> +++ b/drivers/staging/iio/frequency/ad9832.c
> @@ -13,6 +13,7 @@
> #include <linux/device.h>
> #include <linux/err.h>
> #include <linux/kernel.h>
> +#include <linux/math64.h>
> #include <linux/module.h>
> #include <linux/regulator/consumer.h>
> #include <linux/slab.h>
> @@ -115,7 +116,7 @@ static unsigned long ad9832_calc_freqreg(unsigned long mclk, unsigned long fout)
> {
> unsigned long long freqreg = (u64)fout *
> (u64)((u64)1L << AD9832_FREQ_BITS);
> - do_div(freqreg, mclk);
> + freqreg = div64_ul(freqreg, mclk);
> return freqreg;
> }
>
> diff --git a/drivers/staging/iio/frequency/ad9834.c b/drivers/staging/iio/frequency/ad9834.c
> index d339d5e8e0..83d0e1360c 100644
> --- a/drivers/staging/iio/frequency/ad9834.c
> +++ b/drivers/staging/iio/frequency/ad9834.c
> @@ -10,6 +10,7 @@
> #include <linux/workqueue.h>
> #include <linux/device.h>
> #include <linux/kernel.h>
> +#include <linux/math64.h>
> #include <linux/slab.h>
> #include <linux/sysfs.h>
> #include <linux/list.h>
> @@ -101,7 +102,7 @@ static unsigned int ad9834_calc_freqreg(unsigned long mclk, unsigned long fout)
> {
> unsigned long long freqreg = (u64)fout * (u64)BIT(AD9834_FREQ_BITS);
>
> - do_div(freqreg, mclk);
> + freqreg = div64_ul(freqreg, mclk);
> return freqreg;
> }
>