lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20251223215259.677762-1-arnd@kernel.org>
Date: Tue, 23 Dec 2025 22:52:53 +0100
From: Arnd Bergmann <arnd@...nel.org>
To: Oder Chiou <oder_chiou@...ltek.com>,
	Liam Girdwood <lgirdwood@...il.com>,
	Mark Brown <broonie@...nel.org>,
	Jaroslav Kysela <perex@...ex.cz>,
	Takashi Iwai <tiwai@...e.com>,
	Shuming Fan <shumingf@...ltek.com>
Cc: Arnd Bergmann <arnd@...db.de>,
	Bard Liao <yung-chuan.liao@...ux.intel.com>,
	Sakari Ailus <sakari.ailus@...ux.intel.com>,
	linux-sound@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: [PATCH] ASoC: rt1320: fix 32-bit link failure

From: Arnd Bergmann <arnd@...db.de>

A plain 64-bit division causes a link failure in some configurations:

ERROR: modpost: "__aeabi_uldivmod" [sound/soc/codecs/snd-soc-rt1320-sdw.ko] undefined!

Since this divides by a constant, using the div_u64() macro ends up
turning this into an efficient multiply/shift operation where possible.

In rt1320_calc_r0(), the open-coded shift seems a litle simpler.

Fixes: da1682d5e8b5 ("ASoC: rt1320: support calibration and temperature/r0 loading")
Signed-off-by: Arnd Bergmann <arnd@...db.de>
---
 sound/soc/codecs/rt1320-sdw.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/sound/soc/codecs/rt1320-sdw.c b/sound/soc/codecs/rt1320-sdw.c
index 342494e0fc5a..245b9d9980f9 100644
--- a/sound/soc/codecs/rt1320-sdw.c
+++ b/sound/soc/codecs/rt1320-sdw.c
@@ -1065,8 +1065,8 @@ static int rt1320_invrs_load(struct rt1320_sdw_priv *rt1320)
 	r_rsratio = rt1320_rsgain_to_rsratio(rt1320, r_rsgain);
 	dev_dbg(dev, "%s, LR rsratio=%lld, %lld\n", __func__, l_rsratio, r_rsratio);
 
-	l_invrs = (l_rsratio * factor) / 1000000000U;
-	r_invrs = (r_rsratio * factor) / 1000000000U;
+	l_invrs = div_u64(l_rsratio * factor, 1000000000U);
+	r_invrs = div_u64(r_rsratio * factor, 1000000000U);
 
 	rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 6, &r0_data[0], sizeof(struct rt1320_datafixpoint));
 	rt1320_fw_param_protocol(rt1320, RT1320_GET_PARAM, 7, &r0_data[1], sizeof(struct rt1320_datafixpoint));
@@ -1087,15 +1087,15 @@ static int rt1320_invrs_load(struct rt1320_sdw_priv *rt1320)
 static void rt1320_calc_r0(struct rt1320_sdw_priv *rt1320)
 {
 	struct device *dev = &rt1320->sdw_slave->dev;
-	unsigned long long l_calir0, r_calir0;
-	const unsigned int factor = (1 << 27);
+	unsigned long long l_calir0, r_calir0, l_calir0_lo, r_calir0_lo;
 
-	l_calir0 = (rt1320->r0_l_reg * 1000) / factor;
-	r_calir0 = (rt1320->r0_r_reg * 1000) / factor;
+	l_calir0 = rt1320->r0_l_reg >> 27;
+	r_calir0 = rt1320->r0_r_reg >> 27;
+	l_calir0_lo = (rt1320->r0_l_reg & ((1ull << 27) - 1) * 1000) >> 27;
+	r_calir0_lo = (rt1320->r0_r_reg & ((1ull << 27) - 1) * 1000) >> 27;
 
 	dev_dbg(dev, "%s, l_calir0=%lld.%03lld ohm, r_calir0=%lld.%03lld ohm\n", __func__,
-		l_calir0 / 1000, l_calir0 % 1000,
-		r_calir0 / 1000, r_calir0 % 1000);
+		l_calir0, l_calir0_lo, r_calir0, r_calir0_lo);
 }
 
 static void rt1320_calibrate(struct rt1320_sdw_priv *rt1320)
-- 
2.39.5


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ