[PATCH v3] ASoC: rt711-sdca: change capture switch controls

Jaroslav Kysela perex at perex.cz
Thu Apr 22 11:39:42 CEST 2021


Dne 22. 04. 21 v 11:08 shumingf at realtek.com napsal(a):
> From: Shuming Fan <shumingf at realtek.com>
> 
> The DAPM event and mixer control could mute/unmute the capture directly.
> That will be confused that capture still works if the user settings is unmute before the capture.
> Therefore, this patch uses the variables to record the capture switch status of DAPM and mixer.
> 
> Signed-off-by: Shuming Fan <shumingf at realtek.com>
> ---
>  sound/soc/codecs/rt711-sdca.c | 208 +++++++++++++++++++++++++++-------
>  sound/soc/codecs/rt711-sdca.h |   2 +
>  2 files changed, 167 insertions(+), 43 deletions(-)
> 
> diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
> index bfb7f1c8ec8f..3ab9048b4ea3 100644
> --- a/sound/soc/codecs/rt711-sdca.c
> +++ b/sound/soc/codecs/rt711-sdca.c
> @@ -642,6 +642,154 @@ static int rt711_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
>  	return 0;
>  }
>  
> +static int rt711_sdca_set_fu0f_capture_ctl(struct rt711_sdca_priv *rt711)
> +{
> +	int err;
> +
> +	if (rt711->fu0f_dapm_mute) {
> +		err = regmap_write(rt711->regmap,
> +			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
> +			RT711_SDCA_CTL_FU_MUTE, CH_L), 0x01);
> +		if (err < 0)
> +			return err;
> +		err = regmap_write(rt711->regmap,
> +			SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
> +			RT711_SDCA_CTL_FU_MUTE, CH_R), 0x01);
> +		if (err < 0)
> +			return err;

Is possible to set both channels RT711_SDCA_CTL_FU_MUTE in one write ?

Something like:

  regmap_write(rt711->regmap,
		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
			RT711_SDCA_CTL_FU_MUTE, CH_R|CH_L), 0x01);

Anyway, this function can be recoded like (far more readable):

  ch_l = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_l_mute) ? 0x01 : 0x00;
  ch_r = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_r_mute) ? 0x01 : 0x00:
  regmap_write(rt711->regmap,
		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
			RT711_SDCA_CTL_FU_MUTE, CH_L), ch_l);
  regmap_write(rt711->regmap,
		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
			RT711_SDCA_CTL_FU_MUTE, CH_R), ch_r);

... just add error checking ...

Or ideally, if both mute bits can be set together (one regmap_write):

  ch_l = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_l_mute) ? 0x01 : 0x00;
  ch_r = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_r_mute) ? 0x01 : 0x00:
  regmap_write(rt711->regmap,
		SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
		  RT711_SDCA_CTL_FU_MUTE, CH_L|CH_R), ch_l | (ch_r << 1));

> +
> +static int rt711_sdca_set_fu1e_capture_ctl(struct rt711_sdca_priv *rt711)

Same comments as for rt711_sdca_set_fu0f_capture_ctl().

						Jaroslav

-- 
Jaroslav Kysela <perex at perex.cz>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.


More information about the Alsa-devel mailing list