diff mbox series

ASoC: rt711-sdca: add the notification when volume changed

Message ID 20210422090855.2971-1-shumingf@realtek.com (mailing list archive)
State Superseded
Headers show
Series ASoC: rt711-sdca: add the notification when volume changed | expand

Commit Message

Shuming [范書銘] April 22, 2021, 9:08 a.m. UTC
From: Shuming Fan <shumingf@realtek.com>

This patch adds the return value when the volume settings were changed.
The userspace application might monitor the kcontrols to check which control changed.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
---
 sound/soc/codecs/rt711-sdca.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Jaroslav Kysela April 22, 2021, 9:45 a.m. UTC | #1
Dne 22. 04. 21 v 11:08 shumingf@realtek.com napsal(a):
> From: Shuming Fan <shumingf@realtek.com>
> 
> This patch adds the return value when the volume settings were changed.
> The userspace application might monitor the kcontrols to check which control changed.
> 
> Signed-off-by: Shuming Fan <shumingf@realtek.com>
> ---
>  sound/soc/codecs/rt711-sdca.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
> index 3ab9048b4ea3..98b26bd69e19 100644
> --- a/sound/soc/codecs/rt711-sdca.c
> +++ b/sound/soc/codecs/rt711-sdca.c
> @@ -509,12 +509,16 @@ static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
>  		(struct soc_mixer_control *)kcontrol->private_value;
>  	struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
>  	unsigned int read_l, read_r, gain_l_val, gain_r_val;
> -	unsigned int i, adc_vol_flag = 0;
> +	unsigned int i, adc_vol_flag = 0, changed = 0;
> +	unsigned int lvalue, rvalue;
>  
>  	if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
>  		strstr(ucontrol->id.name, "FU0F Capture Volume"))
>  		adc_vol_flag = 1;
>  
> +	regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
> +	regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
> +
>  	/* control value to 2's complement value */
>  	/* L Channel */
>  	gain_l_val = ucontrol->value.integer.value[0];
> @@ -560,6 +564,9 @@ static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
>  		gain_r_val &= 0xffff;
>  	}
>  
> +	if (lvalue != gain_l_val || rvalue != gain_r_val)
> +		changed = 1;

I think that it's safe to return early with the zero return value here? Why to
rewrite the identical value in the hw registers?

					Jaroslav
Shuming [范書銘] April 22, 2021, 9:53 a.m. UTC | #2
Hi Jaroslav,

> > @@ -509,12 +509,16 @@ static int rt711_sdca_set_gain_put(struct
> snd_kcontrol *kcontrol,
> >  		(struct soc_mixer_control *)kcontrol->private_value;
> >  	struct rt711_sdca_priv *rt711 =
> snd_soc_component_get_drvdata(component);
> >  	unsigned int read_l, read_r, gain_l_val, gain_r_val;
> > -	unsigned int i, adc_vol_flag = 0;
> > +	unsigned int i, adc_vol_flag = 0, changed = 0;
> > +	unsigned int lvalue, rvalue;
> >
> >  	if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
> >  		strstr(ucontrol->id.name, "FU0F Capture Volume"))
> >  		adc_vol_flag = 1;
> >
> > +	regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
> > +	regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
> > +
> >  	/* control value to 2's complement value */
> >  	/* L Channel */
> >  	gain_l_val = ucontrol->value.integer.value[0]; @@ -560,6 +564,9 @@
> > static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
> >  		gain_r_val &= 0xffff;
> >  	}
> >
> > +	if (lvalue != gain_l_val || rvalue != gain_r_val)
> > +		changed = 1;
> 
> I think that it's safe to return early with the zero return value here? Why to
> rewrite the identical value in the hw registers?

OK, will fix. Thanks.

> 
> 					Jaroslav
> 
> --
> Jaroslav Kysela <perex@perex.cz>
> Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
> ------Please consider the environment before printing this e-mail.
diff mbox series

Patch

diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
index 3ab9048b4ea3..98b26bd69e19 100644
--- a/sound/soc/codecs/rt711-sdca.c
+++ b/sound/soc/codecs/rt711-sdca.c
@@ -509,12 +509,16 @@  static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
 		(struct soc_mixer_control *)kcontrol->private_value;
 	struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
 	unsigned int read_l, read_r, gain_l_val, gain_r_val;
-	unsigned int i, adc_vol_flag = 0;
+	unsigned int i, adc_vol_flag = 0, changed = 0;
+	unsigned int lvalue, rvalue;
 
 	if (strstr(ucontrol->id.name, "FU1E Capture Volume") ||
 		strstr(ucontrol->id.name, "FU0F Capture Volume"))
 		adc_vol_flag = 1;
 
+	regmap_read(rt711->mbq_regmap, mc->reg, &lvalue);
+	regmap_read(rt711->mbq_regmap, mc->rreg, &rvalue);
+
 	/* control value to 2's complement value */
 	/* L Channel */
 	gain_l_val = ucontrol->value.integer.value[0];
@@ -560,6 +564,9 @@  static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
 		gain_r_val &= 0xffff;
 	}
 
+	if (lvalue != gain_l_val || rvalue != gain_r_val)
+		changed = 1;
+
 	for (i = 0; i < 3; i++) { /* retry 3 times at most */
 		/* Lch*/
 		regmap_write(rt711->mbq_regmap, mc->reg, gain_l_val);
@@ -573,7 +580,7 @@  static int rt711_sdca_set_gain_put(struct snd_kcontrol *kcontrol,
 			break;
 	}
 
-	return i == 3 ? -EIO : 0;
+	return i == 3 ? -EIO : changed;
 }
 
 static int rt711_sdca_set_gain_get(struct snd_kcontrol *kcontrol,