@@ -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+
645753static const DECLARE_TLV_DB_SCALE (out_vol_tlv , -6525 , 75 , 0 ) ;
646754static const DECLARE_TLV_DB_SCALE (in_vol_tlv , -1725 , 75 , 0 ) ;
647755static 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 ;
0 commit comments