[PATCH v2] ASoC: rt711-sdca: change capture switch controls
Shuming [范書銘]
shumingf at realtek.com
Wed Apr 21 12:11:24 CEST 2021
> >
> > +static void rt711_sdca_set_fu0f_capture_ctl(struct rt711_sdca_priv
> > +*rt711) {
> > + if (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_mute) {
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU0F,
> > + RT711_SDCA_CTL_FU_MUTE, CH_L), 0x01);
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU0F,
> > + RT711_SDCA_CTL_FU_MUTE, CH_R), 0x01);
> > + } else {
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU0F,
> > + RT711_SDCA_CTL_FU_MUTE, CH_L), 0x00);
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU0F,
> > + RT711_SDCA_CTL_FU_MUTE, CH_R), 0x00);
> > + }
> > +}
> > +
>
> Please, keep the idependent mute functionality for left and right channel. Use
> bitmap instead bool for kcontrol put/get . I appologize, if my example code
> confused you. I just wanted to describe the logic.
>
> Also, perhaps, you may change the register with one regmap_write() ?
I see. I think the kcontrol could use 'SOC_DOUBLE_EXT' macro to create it.
The put callback function checks the bitmap to mute/unmute the left/right channel.
> > +static void rt711_sdca_set_fu1e_capture_ctl(struct rt711_sdca_priv
> > +*rt711) {
> > + if (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_mute) {
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU1E,
> > + RT711_SDCA_CTL_FU_MUTE, CH_L), 0x01);
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU1E,
> > + RT711_SDCA_CTL_FU_MUTE, CH_R), 0x01);
> > + } else {
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU1E,
> > + RT711_SDCA_CTL_FU_MUTE, CH_L), 0x00);
> > + regmap_write(rt711->regmap,
> > + SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC,
> RT711_SDCA_ENT_USER_FU1E,
> > + RT711_SDCA_CTL_FU_MUTE, CH_R), 0x00);
> > + }
> > +}
> > +
> > +static int rt711_sdca_capture_switch_get(struct snd_kcontrol *kcontrol,
> > + struct snd_ctl_elem_value *ucontrol) {
> > + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> > + struct rt711_sdca_priv *rt711 =
> > +snd_soc_component_get_drvdata(component);
> > +
> > + if (strstr(ucontrol->id.name, "FU1E Capture Switch"))
> > + ucontrol->value.integer.value[0] = !rt711->fu1e_mixer_mute;
> > + else if (strstr(ucontrol->id.name, "FU0F Capture Switch"))
> > + ucontrol->value.integer.value[0] = !rt711->fu0f_mixer_mute;
> > + return 0;
> > +}
>
> It's not so nice (strstr). Please, use diferent functions to set/get FU1E and FU0F
> controls.
OK, I will create the different functions for FU1E and FU0F.
> > +
> > +static int rt711_sdca_capture_switch_put(struct snd_kcontrol *kcontrol,
> > + struct snd_ctl_elem_value *ucontrol) {
> > + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> > + struct rt711_sdca_priv *rt711 =
> > +snd_soc_component_get_drvdata(component);
> > +
> > + if (strstr(ucontrol->id.name, "FU1E Capture Switch")) {
> > + rt711->fu1e_mixer_mute = !ucontrol->value.integer.value[0];
> > + rt711_sdca_set_fu1e_capture_ctl(rt711);
> > + } else if (strstr(ucontrol->id.name, "FU0F Capture Switch")) {
> > + rt711->fu0f_mixer_mute = !ucontrol->value.integer.value[0];
> > + rt711_sdca_set_fu0f_capture_ctl(rt711);
> > + }
> > + return 0;
> > +}
>
> The return value for the kcontrol put callback should be:
>
> a) a negative error code
> b) 0 - no change
> c) 1 - the value was changed
>
> If you don't return 1 on change, the other user space applications which are
> monitoring the given kcontrol won't be notified about changes.
>
> Perhaps, other put callbacks (functions) in this driver require this cleanup, too.
Ok, I will add the return value and test that. Thanks.
> Jaroslav
>
> --
> Jaroslav Kysela <perex at perex.cz>
> Linux Sound Maintainer; ALSA Project; Red Hat, Inc.
> ------Please consider the environment before printing this e-mail.
More information about the Alsa-devel
mailing list