[4/4] ASoC: loongson: fix compile testing on 32-bit

Message ID 20230616090156.2347850-4-arnd@kernel.org
State New
Headers
Series [1/4] ASoC: max98388: fix unused function warnings |

Commit Message

Arnd Bergmann June 16, 2023, 9 a.m. UTC
  From: Arnd Bergmann <arnd@arndb.de>

DIV_ROUND_CLOSEST() does not work on 64-bit variables when building for
a 32-bit target:

ld.lld: error: undefined symbol: __udivdi3
>>> referenced by loongson_i2s.c
>>>               sound/soc/loongson/loongson_i2s.o:(loongson_i2s_hw_params) in archive vmlinux.a

Use DIV_ROUND_CLOSEST_ULL() instead.

Fixes: d24028606e764 ("ASoC: loongson: Add Loongson ASoC Sound Card Support")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
 sound/soc/loongson/loongson_i2s.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Randy Dunlap June 17, 2023, 4:06 a.m. UTC | #1
On 6/16/23 02:00, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> DIV_ROUND_CLOSEST() does not work on 64-bit variables when building for
> a 32-bit target:
> 
> ld.lld: error: undefined symbol: __udivdi3
>>>> referenced by loongson_i2s.c
>>>>               sound/soc/loongson/loongson_i2s.o:(loongson_i2s_hw_params) in archive vmlinux.a
> 
> Use DIV_ROUND_CLOSEST_ULL() instead.
> 
> Fixes: d24028606e764 ("ASoC: loongson: Add Loongson ASoC Sound Card Support")
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Acked-by: Randy Dunlap <rdunlap@infradead.org>
Tested-by: Randy Dunlap <rdunlap@infradead.org> # build-tested

Thanks.

> ---
>  sound/soc/loongson/loongson_i2s.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sound/soc/loongson/loongson_i2s.c b/sound/soc/loongson/loongson_i2s.c
> index f73b6d6f16c23..b919f0fe83615 100644
> --- a/sound/soc/loongson/loongson_i2s.c
> +++ b/sound/soc/loongson/loongson_i2s.c
> @@ -89,7 +89,7 @@ static int loongson_i2s_hw_params(struct snd_pcm_substream *substream,
>  		bclk_ratio = DIV_ROUND_CLOSEST(sysclk,
>  					       (bits * chans * fs * 2)) - 1;
>  		mclk_ratio = clk_rate / sysclk;
> -		mclk_ratio_frac = DIV_ROUND_CLOSEST(((u64)clk_rate << 16),
> +		mclk_ratio_frac = DIV_ROUND_CLOSEST_ULL(((u64)clk_rate << 16),
>  						    sysclk) - (mclk_ratio << 16);
>  
>  		regmap_read(i2s->regmap, LS_I2S_CFG, &val);
  

Patch

diff --git a/sound/soc/loongson/loongson_i2s.c b/sound/soc/loongson/loongson_i2s.c
index f73b6d6f16c23..b919f0fe83615 100644
--- a/sound/soc/loongson/loongson_i2s.c
+++ b/sound/soc/loongson/loongson_i2s.c
@@ -89,7 +89,7 @@  static int loongson_i2s_hw_params(struct snd_pcm_substream *substream,
 		bclk_ratio = DIV_ROUND_CLOSEST(sysclk,
 					       (bits * chans * fs * 2)) - 1;
 		mclk_ratio = clk_rate / sysclk;
-		mclk_ratio_frac = DIV_ROUND_CLOSEST(((u64)clk_rate << 16),
+		mclk_ratio_frac = DIV_ROUND_CLOSEST_ULL(((u64)clk_rate << 16),
 						    sysclk) - (mclk_ratio << 16);
 
 		regmap_read(i2s->regmap, LS_I2S_CFG, &val);