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>] [day] [month] [year] [list]
Message-ID: <20251201030354.961-1-vulab@iscas.ac.cn>
Date: Mon,  1 Dec 2025 11:03:54 +0800
From: Haotian Zhang <vulab@...as.ac.cn>
To: Liam Girdwood <lgirdwood@...il.com>,
	Mark Brown <broonie@...nel.org>,
	Jaroslav Kysela <perex@...ex.cz>,
	Takashi Iwai <tiwai@...e.com>
Cc: Ivaylo Dimitrov <ivo.g.dimitrov.75@...il.com>,
	linux-sound@...r.kernel.org,
	linux-kernel@...r.kernel.org,
	Haotian Zhang <vulab@...as.ac.cn>
Subject: [PATCH] ASoC: cpcap: Fix event generation for mux controls

The mux put callbacks unconditionally return 0, failing to
notify the ALSA core when control values change. This prevents
userspace applications from receiving events.

Use regmap_update_bits_check() instead of regmap_update_bits()
to detect actual register changes, and return 1 when the mux value
has changed to generate proper events for userspace applications.

Fixes: f6cdf2d3445d ("ASoC: cpcap: new codec")
Signed-off-by: Haotian Zhang <vulab@...as.ac.cn>
---
 sound/soc/codecs/cpcap.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/sound/soc/codecs/cpcap.c b/sound/soc/codecs/cpcap.c
index 3eb862643b53..40b33a0acc52 100644
--- a/sound/soc/codecs/cpcap.c
+++ b/sound/soc/codecs/cpcap.c
@@ -432,6 +432,7 @@ static int cpcap_output_mux_put_enum(struct snd_kcontrol *kcontrol,
 	unsigned int mask = BIT(e->shift_l);
 	u16 reg_voice = 0x00, reg_hifi = 0x00, reg_ext = 0x00;
 	int err;
+	bool change = false;
 
 	switch (muxval) {
 	case 1:
@@ -447,22 +448,22 @@ static int cpcap_output_mux_put_enum(struct snd_kcontrol *kcontrol,
 		break;
 	}
 
-	err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXCOA,
-				 mask, reg_voice);
+	err = regmap_update_bits_check(cpcap->regmap, CPCAP_REG_RXCOA,
+				 mask, reg_voice, &change);
 	if (err)
 		return err;
-	err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXSDOA,
-				 mask, reg_hifi);
+	err = regmap_update_bits_check(cpcap->regmap, CPCAP_REG_RXSDOA,
+				 mask, reg_hifi, &change);
 	if (err)
 		return err;
-	err = regmap_update_bits(cpcap->regmap, CPCAP_REG_RXEPOA,
-				 mask, reg_ext);
+	err = regmap_update_bits_check(cpcap->regmap, CPCAP_REG_RXEPOA,
+				 mask, reg_ext, &change);
 	if (err)
 		return err;
 
 	snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL);
 
-	return 0;
+	return change ? 1 : 0;
 }
 
 static int cpcap_input_right_mux_get_enum(struct snd_kcontrol *kcontrol,
@@ -515,6 +516,7 @@ static int cpcap_input_right_mux_put_enum(struct snd_kcontrol *kcontrol,
 	unsigned int muxval = ucontrol->value.enumerated.item[0];
 	int regval = 0, mask;
 	int err;
+	bool change = false;
 
 	mask = 0;
 	mask |= BIT(CPCAP_BIT_MIC1_MUX);
@@ -539,14 +541,14 @@ static int cpcap_input_right_mux_put_enum(struct snd_kcontrol *kcontrol,
 		break;
 	}
 
-	err = regmap_update_bits(cpcap->regmap, CPCAP_REG_TXI,
-				 mask, regval);
+	err = regmap_update_bits_check(cpcap->regmap, CPCAP_REG_TXI,
+				 mask, regval, &change);
 	if (err)
 		return err;
 
 	snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL);
 
-	return 0;
+	return change ? 1 : 0;
 }
 
 static int cpcap_input_left_mux_get_enum(struct snd_kcontrol *kcontrol,
@@ -591,6 +593,7 @@ static int cpcap_input_left_mux_put_enum(struct snd_kcontrol *kcontrol,
 	unsigned int muxval = ucontrol->value.enumerated.item[0];
 	int regval = 0, mask;
 	int err;
+	bool change = false;
 
 	mask = 0;
 	mask |= BIT(CPCAP_BIT_MIC2_MUX);
@@ -607,14 +610,14 @@ static int cpcap_input_left_mux_put_enum(struct snd_kcontrol *kcontrol,
 		break;
 	}
 
-	err = regmap_update_bits(cpcap->regmap, CPCAP_REG_TXI,
-				 mask, regval);
+	err = regmap_update_bits_check(cpcap->regmap, CPCAP_REG_TXI,
+				 mask, regval, &change);
 	if (err)
 		return err;
 
 	snd_soc_dapm_mux_update_power(dapm, kcontrol, muxval, e, NULL);
 
-	return 0;
+	return change ? 1 : 0;
 }
 
 static const struct snd_kcontrol_new cpcap_input_left_mux =
-- 
2.50.1.windows.1


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ