Re: [PATCH] ASoC: sophgo: return 1 on volume change in cv1800b_adc_volume_set()

Inochi Amaoto <[email protected]>
Newsgroups org.kernel.vger.linux-sound,dev.linux.lists.sophgo,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Mon, Jul 27, 2026 at 11:08:04AM +0530, [email protected] wrote:
> From: Surendra Singh Chouhan <[email protected]>
> 
> cv1800b_adc_volume_set() serves as the .put callback for the "Internal
> I2S Capture Volume" control.
> 
> ALSA mixer control callbacks must return 1 when the register value is
> modified, 0 if unchanged, or a negative error code on failure. Returning
> 0 unconditionally causes ALSA core to assume the value was unchanged,
> suppressing SNDRV_CTL_EVENT_MASK_VALUE change notifications to userspace
> sound servers (e.g. PipeWire/PulseAudio).
> 
> Fix this by comparing the new register value with the existing register
> value. If unchanged, return 0; otherwise, write the updated value and
> return 1.
> 
> Fixes: 4cf8752a03e6 ("ASoC: sophgo: add CV1800B internal ADC codec driver")
> Signed-off-by: Surendra Singh Chouhan <[email protected]>
> ---

LGTM

Reviewed-by: Inochi Amaoto <[email protected]>

>  sound/soc/sophgo/cv1800b-sound-adc.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/sophgo/cv1800b-sound-adc.c b/sound/soc/sophgo/cv1800b-sound-adc.c
> index b66761156b99..bd93e261bdd1 100644
> --- a/sound/soc/sophgo/cv1800b-sound-adc.c
> +++ b/sound/soc/sophgo/cv1800b-sound-adc.c
> @@ -251,16 +251,22 @@ static int cv1800b_adc_volume_set(struct snd_kcontrol *kcontrol,
>  
>  	u32 v_left = clamp_t(u32, ucontrol->value.integer.value[0], 0, 24);
>  	u32 v_right = clamp_t(u32, ucontrol->value.integer.value[1], 0, 24);
> -	u32 val;
> +	u32 val, old_val;
>  
>  	val = readl(priv->regs + CV1800B_RXADC_ANA0);
> +	old_val = val;
> +
>  	val = u32_replace_bits(val, cv1800b_gains[v_left],
>  			       REG_COMB_LEFT_VOLUME);
>  	val = u32_replace_bits(val, cv1800b_gains[v_right],
>  			       REG_COMB_RIGHT_VOLUME);
> +
> +	if (val == old_val)
> +		return 0;
> +
>  	writel(val, priv->regs + CV1800B_RXADC_ANA0);
>  
> -	return 0;
> +	return 1;
>  }
>  
>  static DECLARE_TLV_DB_SCALE(cv1800b_volume_tlv, 0, 200, 0);
> -- 
> 2.55.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.