@@ -981,6 +981,8 @@ add_control(struct hda_gen_spec *spec, int type, const char *name,
981
981
knew -> index = cidx ;
982
982
if (get_amp_nid_ (val ))
983
983
knew -> subdevice = HDA_SUBDEV_AMP_FLAG ;
984
+ if (knew -> access == 0 )
985
+ knew -> access = SNDRV_CTL_ELEM_ACCESS_READWRITE ;
984
986
knew -> private_value = val ;
985
987
return knew ;
986
988
}
@@ -3618,8 +3620,11 @@ static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
3618
3620
amp_val_replace_channels (ctl , chs ));
3619
3621
if (!knew )
3620
3622
return - ENOMEM ;
3621
- if (is_switch )
3623
+ if (is_switch ) {
3622
3624
knew -> put = cap_single_sw_put ;
3625
+ if (spec -> mic_mute_led )
3626
+ knew -> access |= SNDRV_CTL_ELEM_ACCESS_MIC_LED ;
3627
+ }
3623
3628
if (!inv_dmic )
3624
3629
return 0 ;
3625
3630
@@ -3634,8 +3639,11 @@ static int add_single_cap_ctl(struct hda_codec *codec, const char *label,
3634
3639
amp_val_replace_channels (ctl , 2 ));
3635
3640
if (!knew )
3636
3641
return - ENOMEM ;
3637
- if (is_switch )
3642
+ if (is_switch ) {
3638
3643
knew -> put = cap_single_sw_put ;
3644
+ if (spec -> mic_mute_led )
3645
+ knew -> access |= SNDRV_CTL_ELEM_ACCESS_MIC_LED ;
3646
+ }
3639
3647
return 0 ;
3640
3648
}
3641
3649
@@ -3676,6 +3684,8 @@ static int create_bind_cap_vol_ctl(struct hda_codec *codec, int idx,
3676
3684
knew -> index = idx ;
3677
3685
knew -> private_value = sw_ctl ;
3678
3686
knew -> subdevice = HDA_SUBDEV_AMP_FLAG ;
3687
+ if (spec -> mic_mute_led )
3688
+ knew -> access |= SNDRV_CTL_ELEM_ACCESS_MIC_LED ;
3679
3689
}
3680
3690
return 0 ;
3681
3691
}
@@ -3917,11 +3927,6 @@ static int create_mute_led_cdev(struct hda_codec *codec,
3917
3927
return devm_led_classdev_register (& codec -> core .dev , cdev );
3918
3928
}
3919
3929
3920
- static void vmaster_update_mute_led (void * private_data , int enabled )
3921
- {
3922
- ledtrig_audio_set (LED_AUDIO_MUTE , enabled ? LED_OFF : LED_ON );
3923
- }
3924
-
3925
3930
/**
3926
3931
* snd_hda_gen_add_mute_led_cdev - Create a LED classdev and enable as vmaster mute LED
3927
3932
* @codec: the HDA codec
@@ -3945,134 +3950,11 @@ int snd_hda_gen_add_mute_led_cdev(struct hda_codec *codec,
3945
3950
if (spec -> vmaster_mute .hook )
3946
3951
codec_err (codec , "vmaster hook already present before cdev!\n" );
3947
3952
3948
- spec -> vmaster_mute .hook = vmaster_update_mute_led ;
3949
- spec -> vmaster_mute_enum = 1 ;
3953
+ spec -> vmaster_mute_led = 1 ;
3950
3954
return 0 ;
3951
3955
}
3952
3956
EXPORT_SYMBOL_GPL (snd_hda_gen_add_mute_led_cdev );
3953
3957
3954
- /*
3955
- * mic mute LED hook helpers
3956
- */
3957
- enum {
3958
- MICMUTE_LED_ON ,
3959
- MICMUTE_LED_OFF ,
3960
- MICMUTE_LED_FOLLOW_CAPTURE ,
3961
- MICMUTE_LED_FOLLOW_MUTE ,
3962
- };
3963
-
3964
- static void call_micmute_led_update (struct hda_codec * codec )
3965
- {
3966
- struct hda_gen_spec * spec = codec -> spec ;
3967
- unsigned int val ;
3968
-
3969
- switch (spec -> micmute_led .led_mode ) {
3970
- case MICMUTE_LED_ON :
3971
- val = 1 ;
3972
- break ;
3973
- case MICMUTE_LED_OFF :
3974
- val = 0 ;
3975
- break ;
3976
- case MICMUTE_LED_FOLLOW_CAPTURE :
3977
- val = !!spec -> micmute_led .capture ;
3978
- break ;
3979
- case MICMUTE_LED_FOLLOW_MUTE :
3980
- default :
3981
- val = !spec -> micmute_led .capture ;
3982
- break ;
3983
- }
3984
-
3985
- if (val == spec -> micmute_led .led_value )
3986
- return ;
3987
- spec -> micmute_led .led_value = val ;
3988
- ledtrig_audio_set (LED_AUDIO_MICMUTE ,
3989
- spec -> micmute_led .led_value ? LED_ON : LED_OFF );
3990
- }
3991
-
3992
- static void update_micmute_led (struct hda_codec * codec ,
3993
- struct snd_kcontrol * kcontrol ,
3994
- struct snd_ctl_elem_value * ucontrol )
3995
- {
3996
- struct hda_gen_spec * spec = codec -> spec ;
3997
- unsigned int mask ;
3998
-
3999
- if (spec -> micmute_led .old_hook )
4000
- spec -> micmute_led .old_hook (codec , kcontrol , ucontrol );
4001
-
4002
- if (!ucontrol )
4003
- return ;
4004
- mask = 1U << snd_ctl_get_ioffidx (kcontrol , & ucontrol -> id );
4005
- if (!strcmp ("Capture Switch" , ucontrol -> id .name )) {
4006
- /* TODO: How do I verify if it's a mono or stereo here? */
4007
- if (ucontrol -> value .integer .value [0 ] ||
4008
- ucontrol -> value .integer .value [1 ])
4009
- spec -> micmute_led .capture |= mask ;
4010
- else
4011
- spec -> micmute_led .capture &= ~mask ;
4012
- call_micmute_led_update (codec );
4013
- }
4014
- }
4015
-
4016
- static int micmute_led_mode_info (struct snd_kcontrol * kcontrol ,
4017
- struct snd_ctl_elem_info * uinfo )
4018
- {
4019
- static const char * const texts [] = {
4020
- "On" , "Off" , "Follow Capture" , "Follow Mute" ,
4021
- };
4022
-
4023
- return snd_ctl_enum_info (uinfo , 1 , ARRAY_SIZE (texts ), texts );
4024
- }
4025
-
4026
- static int micmute_led_mode_get (struct snd_kcontrol * kcontrol ,
4027
- struct snd_ctl_elem_value * ucontrol )
4028
- {
4029
- struct hda_codec * codec = snd_kcontrol_chip (kcontrol );
4030
- struct hda_gen_spec * spec = codec -> spec ;
4031
-
4032
- ucontrol -> value .enumerated .item [0 ] = spec -> micmute_led .led_mode ;
4033
- return 0 ;
4034
- }
4035
-
4036
- static int micmute_led_mode_put (struct snd_kcontrol * kcontrol ,
4037
- struct snd_ctl_elem_value * ucontrol )
4038
- {
4039
- struct hda_codec * codec = snd_kcontrol_chip (kcontrol );
4040
- struct hda_gen_spec * spec = codec -> spec ;
4041
- unsigned int mode ;
4042
-
4043
- mode = ucontrol -> value .enumerated .item [0 ];
4044
- if (mode > MICMUTE_LED_FOLLOW_MUTE )
4045
- mode = MICMUTE_LED_FOLLOW_MUTE ;
4046
- if (mode == spec -> micmute_led .led_mode )
4047
- return 0 ;
4048
- spec -> micmute_led .led_mode = mode ;
4049
- call_micmute_led_update (codec );
4050
- return 1 ;
4051
- }
4052
-
4053
- static const struct snd_kcontrol_new micmute_led_mode_ctl = {
4054
- .iface = SNDRV_CTL_ELEM_IFACE_MIXER ,
4055
- .name = "Mic Mute-LED Mode" ,
4056
- .info = micmute_led_mode_info ,
4057
- .get = micmute_led_mode_get ,
4058
- .put = micmute_led_mode_put ,
4059
- };
4060
-
4061
- /* Set up the capture sync hook for controlling the mic-mute LED */
4062
- static int add_micmute_led_hook (struct hda_codec * codec )
4063
- {
4064
- struct hda_gen_spec * spec = codec -> spec ;
4065
-
4066
- spec -> micmute_led .led_mode = MICMUTE_LED_FOLLOW_MUTE ;
4067
- spec -> micmute_led .capture = 0 ;
4068
- spec -> micmute_led .led_value = -1 ;
4069
- spec -> micmute_led .old_hook = spec -> cap_sync_hook ;
4070
- spec -> cap_sync_hook = update_micmute_led ;
4071
- if (!snd_hda_gen_add_kctl (spec , NULL , & micmute_led_mode_ctl ))
4072
- return - ENOMEM ;
4073
- return 0 ;
4074
- }
4075
-
4076
3958
/**
4077
3959
* snd_hda_gen_add_micmute_led_cdev - Create a LED classdev and enable as mic-mute LED
4078
3960
* @codec: the HDA codec
@@ -4091,6 +3973,7 @@ int snd_hda_gen_add_micmute_led_cdev(struct hda_codec *codec,
4091
3973
int (* callback )(struct led_classdev * ,
4092
3974
enum led_brightness ))
4093
3975
{
3976
+ struct hda_gen_spec * spec = codec -> spec ;
4094
3977
int err ;
4095
3978
4096
3979
if (callback ) {
@@ -4101,7 +3984,8 @@ int snd_hda_gen_add_micmute_led_cdev(struct hda_codec *codec,
4101
3984
}
4102
3985
}
4103
3986
4104
- return add_micmute_led_hook (codec );
3987
+ spec -> mic_mute_led = 1 ;
3988
+ return 0 ;
4105
3989
}
4106
3990
EXPORT_SYMBOL_GPL (snd_hda_gen_add_micmute_led_cdev );
4107
3991
#endif /* CONFIG_SND_HDA_GENERIC_LEDS */
@@ -5060,6 +4944,9 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec,
5060
4944
5061
4945
parse_user_hints (codec );
5062
4946
4947
+ if (spec -> vmaster_mute_led || spec -> mic_mute_led )
4948
+ snd_ctl_led_request ();
4949
+
5063
4950
if (spec -> mixer_nid && !spec -> mixer_merge_nid )
5064
4951
spec -> mixer_merge_nid = spec -> mixer_nid ;
5065
4952
@@ -5291,21 +5178,22 @@ int snd_hda_gen_build_controls(struct hda_codec *codec)
5291
5178
!snd_hda_find_mixer_ctl (codec , "Master Playback Volume" )) {
5292
5179
err = snd_hda_add_vmaster (codec , "Master Playback Volume" ,
5293
5180
spec -> vmaster_tlv , follower_pfxs ,
5294
- "Playback Volume" );
5181
+ "Playback Volume" , 0 );
5295
5182
if (err < 0 )
5296
5183
return err ;
5297
5184
}
5298
5185
if (!spec -> no_analog && !spec -> suppress_vmaster &&
5299
5186
!snd_hda_find_mixer_ctl (codec , "Master Playback Switch" )) {
5300
5187
err = __snd_hda_add_vmaster (codec , "Master Playback Switch" ,
5301
5188
NULL , follower_pfxs ,
5302
- "Playback Switch" ,
5303
- true, & spec -> vmaster_mute .sw_kctl );
5189
+ "Playback Switch" , true,
5190
+ spec -> vmaster_mute_led ?
5191
+ SNDRV_CTL_ELEM_ACCESS_SPK_LED : 0 ,
5192
+ & spec -> vmaster_mute .sw_kctl );
5304
5193
if (err < 0 )
5305
5194
return err ;
5306
5195
if (spec -> vmaster_mute .hook ) {
5307
- snd_hda_add_vmaster_hook (codec , & spec -> vmaster_mute ,
5308
- spec -> vmaster_mute_enum );
5196
+ snd_hda_add_vmaster_hook (codec , & spec -> vmaster_mute );
5309
5197
snd_hda_sync_vmaster_hook (& spec -> vmaster_mute );
5310
5198
}
5311
5199
}
0 commit comments