Skip to content

Commit ca5118c

Browse files
shumingfanbroonie
authored andcommitted
ASoC: rt711-sdca: change capture switch controls
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@realtek.com> Link: https://lore.kernel.org/r/20210422103220.21987-1-shumingf@realtek.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 12f8127 commit ca5118c

2 files changed

Lines changed: 127 additions & 43 deletions

File tree

‎sound/soc/codecs/rt711-sdca.c‎

Lines changed: 125 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,114 @@ static int rt711_sdca_set_gain_get(struct snd_kcontrol *kcontrol,
642642
return 0;
643643
}
644644

645+
static int rt711_sdca_set_fu0f_capture_ctl(struct rt711_sdca_priv *rt711)
646+
{
647+
int err;
648+
unsigned int ch_l, ch_r;
649+
650+
ch_l = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_l_mute) ? 0x01 : 0x00;
651+
ch_r = (rt711->fu0f_dapm_mute || rt711->fu0f_mixer_r_mute) ? 0x01 : 0x00;
652+
653+
err = regmap_write(rt711->regmap,
654+
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
655+
RT711_SDCA_CTL_FU_MUTE, CH_L), ch_l);
656+
if (err < 0)
657+
return err;
658+
659+
err = regmap_write(rt711->regmap,
660+
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
661+
RT711_SDCA_CTL_FU_MUTE, CH_R), ch_r);
662+
if (err < 0)
663+
return err;
664+
665+
return 0;
666+
}
667+
668+
static int rt711_sdca_set_fu1e_capture_ctl(struct rt711_sdca_priv *rt711)
669+
{
670+
int err;
671+
unsigned int ch_l, ch_r;
672+
673+
ch_l = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_l_mute) ? 0x01 : 0x00;
674+
ch_r = (rt711->fu1e_dapm_mute || rt711->fu1e_mixer_r_mute) ? 0x01 : 0x00;
675+
676+
err = regmap_write(rt711->regmap,
677+
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU1E,
678+
RT711_SDCA_CTL_FU_MUTE, CH_L), ch_l);
679+
if (err < 0)
680+
return err;
681+
682+
err = regmap_write(rt711->regmap,
683+
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU1E,
684+
RT711_SDCA_CTL_FU_MUTE, CH_R), ch_r);
685+
if (err < 0)
686+
return err;
687+
688+
return 0;
689+
}
690+
691+
static int rt711_sdca_fu1e_capture_get(struct snd_kcontrol *kcontrol,
692+
struct snd_ctl_elem_value *ucontrol)
693+
{
694+
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
695+
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
696+
697+
ucontrol->value.integer.value[0] = !rt711->fu1e_mixer_l_mute;
698+
ucontrol->value.integer.value[1] = !rt711->fu1e_mixer_r_mute;
699+
return 0;
700+
}
701+
702+
static int rt711_sdca_fu1e_capture_put(struct snd_kcontrol *kcontrol,
703+
struct snd_ctl_elem_value *ucontrol)
704+
{
705+
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
706+
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
707+
int err, changed = 0;
708+
709+
if (rt711->fu1e_mixer_l_mute != !ucontrol->value.integer.value[0] ||
710+
rt711->fu1e_mixer_r_mute != !ucontrol->value.integer.value[1])
711+
changed = 1;
712+
713+
rt711->fu1e_mixer_l_mute = !ucontrol->value.integer.value[0];
714+
rt711->fu1e_mixer_r_mute = !ucontrol->value.integer.value[1];
715+
err = rt711_sdca_set_fu1e_capture_ctl(rt711);
716+
if (err < 0)
717+
return err;
718+
719+
return changed;
720+
}
721+
722+
static int rt711_sdca_fu0f_capture_get(struct snd_kcontrol *kcontrol,
723+
struct snd_ctl_elem_value *ucontrol)
724+
{
725+
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
726+
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
727+
728+
ucontrol->value.integer.value[0] = !rt711->fu0f_mixer_l_mute;
729+
ucontrol->value.integer.value[1] = !rt711->fu0f_mixer_r_mute;
730+
return 0;
731+
}
732+
733+
static int rt711_sdca_fu0f_capture_put(struct snd_kcontrol *kcontrol,
734+
struct snd_ctl_elem_value *ucontrol)
735+
{
736+
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
737+
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
738+
int err, changed = 0;
739+
740+
if (rt711->fu0f_mixer_l_mute != !ucontrol->value.integer.value[0] ||
741+
rt711->fu0f_mixer_r_mute != !ucontrol->value.integer.value[1])
742+
changed = 1;
743+
744+
rt711->fu0f_mixer_l_mute = !ucontrol->value.integer.value[0];
745+
rt711->fu0f_mixer_r_mute = !ucontrol->value.integer.value[1];
746+
err = rt711_sdca_set_fu0f_capture_ctl(rt711);
747+
if (err < 0)
748+
return err;
749+
750+
return changed;
751+
}
752+
645753
static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -6525, 75, 0);
646754
static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -1725, 75, 0);
647755
static const DECLARE_TLV_DB_SCALE(mic_vol_tlv, 0, 1000, 0);
@@ -652,14 +760,10 @@ static const struct snd_kcontrol_new rt711_sdca_snd_controls[] = {
652760
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU05, RT711_SDCA_CTL_FU_VOLUME, CH_R),
653761
0x57, 0x57, 0,
654762
rt711_sdca_set_gain_get, rt711_sdca_set_gain_put, out_vol_tlv),
655-
SOC_DOUBLE_R("FU1E Capture Switch",
656-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_MUTE, CH_L),
657-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_MUTE, CH_R),
658-
0, 1, 1),
659-
SOC_DOUBLE_R("FU0F Capture Switch",
660-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F, RT711_SDCA_CTL_FU_MUTE, CH_L),
661-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F, RT711_SDCA_CTL_FU_MUTE, CH_R),
662-
0, 1, 1),
763+
SOC_DOUBLE_EXT("FU1E Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
764+
rt711_sdca_fu1e_capture_get, rt711_sdca_fu1e_capture_put),
765+
SOC_DOUBLE_EXT("FU0F Capture Switch", SND_SOC_NOPM, 0, 1, 1, 0,
766+
rt711_sdca_fu0f_capture_get, rt711_sdca_fu0f_capture_put),
663767
SOC_DOUBLE_R_EXT_TLV("FU1E Capture Volume",
664768
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_VOLUME, CH_L),
665769
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E, RT711_SDCA_CTL_FU_VOLUME, CH_R),
@@ -809,28 +913,15 @@ static int rt711_sdca_fu0f_event(struct snd_soc_dapm_widget *w,
809913
struct snd_soc_component *component =
810914
snd_soc_dapm_to_component(w->dapm);
811915
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
812-
unsigned char unmute = 0x0, mute = 0x1;
813916

814917
switch (event) {
815918
case SND_SOC_DAPM_POST_PMU:
816-
regmap_write(rt711->regmap,
817-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
818-
RT711_SDCA_CTL_FU_MUTE, CH_L),
819-
unmute);
820-
regmap_write(rt711->regmap,
821-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
822-
RT711_SDCA_CTL_FU_MUTE, CH_R),
823-
unmute);
919+
rt711->fu0f_dapm_mute = false;
920+
rt711_sdca_set_fu0f_capture_ctl(rt711);
824921
break;
825922
case SND_SOC_DAPM_PRE_PMD:
826-
regmap_write(rt711->regmap,
827-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
828-
RT711_SDCA_CTL_FU_MUTE, CH_L),
829-
mute);
830-
regmap_write(rt711->regmap,
831-
SDW_SDCA_CTL(FUNC_NUM_JACK_CODEC, RT711_SDCA_ENT_USER_FU0F,
832-
RT711_SDCA_CTL_FU_MUTE, CH_R),
833-
mute);
923+
rt711->fu0f_dapm_mute = true;
924+
rt711_sdca_set_fu0f_capture_ctl(rt711);
834925
break;
835926
}
836927
return 0;
@@ -842,29 +933,16 @@ static int rt711_sdca_fu1e_event(struct snd_soc_dapm_widget *w,
842933
struct snd_soc_component *component =
843934
snd_soc_dapm_to_component(w->dapm);
844935
struct rt711_sdca_priv *rt711 = snd_soc_component_get_drvdata(component);
845-
unsigned char unmute = 0x0, mute = 0x1;
846936

847937
switch (event) {
848938
case SND_SOC_DAPM_POST_PMU:
849-
regmap_write(rt711->regmap,
850-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
851-
RT711_SDCA_CTL_FU_MUTE, CH_L),
852-
unmute);
853-
regmap_write(rt711->regmap,
854-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
855-
RT711_SDCA_CTL_FU_MUTE, CH_R),
856-
unmute);
939+
rt711->fu1e_dapm_mute = false;
940+
rt711_sdca_set_fu1e_capture_ctl(rt711);
857941
break;
858942
case SND_SOC_DAPM_PRE_PMD:
859-
regmap_write(rt711->regmap,
860-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
861-
RT711_SDCA_CTL_FU_MUTE, CH_L),
862-
mute);
863-
regmap_write(rt711->regmap,
864-
SDW_SDCA_CTL(FUNC_NUM_MIC_ARRAY, RT711_SDCA_ENT_USER_FU1E,
865-
RT711_SDCA_CTL_FU_MUTE, CH_R),
866-
mute);
867-
break;
943+
rt711->fu1e_dapm_mute = true;
944+
rt711_sdca_set_fu1e_capture_ctl(rt711);
945+
break;
868946
}
869947
return 0;
870948
}
@@ -1330,6 +1408,10 @@ int rt711_sdca_init(struct device *dev, struct regmap *regmap,
13301408
*/
13311409
rt711->hw_init = false;
13321410
rt711->first_hw_init = false;
1411+
rt711->fu0f_dapm_mute = true;
1412+
rt711->fu1e_dapm_mute = true;
1413+
rt711->fu0f_mixer_l_mute = rt711->fu0f_mixer_r_mute = true;
1414+
rt711->fu1e_mixer_l_mute = rt711->fu1e_mixer_r_mute = true;
13331415

13341416
/* JD source uses JD2 in default */
13351417
rt711->jd_src = RT711_JD2;

‎sound/soc/codecs/rt711-sdca.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ struct rt711_sdca_priv {
3030
int jack_type, jd_src;
3131
unsigned int scp_sdca_stat1, scp_sdca_stat2;
3232
int hw_ver;
33+
bool fu0f_dapm_mute, fu0f_mixer_l_mute, fu0f_mixer_r_mute;
34+
bool fu1e_dapm_mute, fu1e_mixer_l_mute, fu1e_mixer_r_mute;
3335
};
3436

3537
struct sdw_stream_data {

0 commit comments

Comments
 (0)