Re: [PATCH 3/4] ASoC: fsl_easrc: Use div64_u64 for 64-by-64 division
From: David Laight
Date: Fri Jul 17 2026 - 04:07:43 EST
On Fri, 17 Jul 2026 15:02:51 +0800
wangdich9700@xxxxxxx wrote:
> From: wangdicheng <wangdicheng@xxxxxxxxxx>
>
> Fix a compiler warning about do_div() truncating a 64-bit divisor:
It's not a compiler warning.
>
> sound/soc/fsl/fsl_easrc.c:2061:2-8: WARNING: do_div() does a 64-by-32 division, please consider using div64_u64 instead.
>
> do_div() truncates the divisor to 32 bits, but val1 is u64 and may
> exceed the 32-bit range after (u64)in_rate << frac_bits >> 12 with
> frac_bits up to 39. Use div64_u64() to perform a proper 64-by-64
> division and avoid potential truncation.
>
> Fixes: 955ac624058f ("ASoC: fsl_easrc: Add EASRC ASoC CPU DAI drivers")
> Cc: <stable@xxxxxxxxxxxxxxx>
> Signed-off-by: wangdicheng <wangdicheng@xxxxxxxxxx>
> ---
> sound/soc/fsl/fsl_easrc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/sound/soc/fsl/fsl_easrc.c b/sound/soc/fsl/fsl_easrc.c
> index 114a6c0b6b73..d0bbe9f71e36 100644
> --- a/sound/soc/fsl/fsl_easrc.c
> +++ b/sound/soc/fsl/fsl_easrc.c
> @@ -2058,7 +2058,7 @@ static int fsl_easrc_m2m_calc_out_len(struct fsl_asrc_pair *pair, int input_buff
> /* right shift 12 bit to make ratio in 32bit space */
> val2 = (u64)in_samples << (frac_bits - 12);
> val1 = val1 >> 12;
> - do_div(val2, val1);
> + val2 = div64_u64(val2, val1);
Are you sure the domain of val1 can exceed 32 bits?
There is a comment in the patch block that implies otherwise.
David
> out_samples = val2;
>
> out_length = out_samples * out_width * channels;