|
@@ -194,7 +194,7 @@ struct sigmatel_spec {
|
|
|
int default_polarity;
|
|
|
|
|
|
unsigned int mic_mute_led_gpio; /* capture mute LED GPIO */
|
|
|
- bool mic_mute_led_on; /* current mic mute state */
|
|
|
+ unsigned int mic_enabled; /* current mic mute state (bitmask) */
|
|
|
|
|
|
/* stream */
|
|
|
unsigned int stream_delay;
|
|
@@ -324,19 +324,26 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
|
|
|
|
|
|
/* hook for controlling mic-mute LED GPIO */
|
|
|
static void stac_capture_led_hook(struct hda_codec *codec,
|
|
|
- struct snd_ctl_elem_value *ucontrol)
|
|
|
+ struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
{
|
|
|
struct sigmatel_spec *spec = codec->spec;
|
|
|
- bool mute;
|
|
|
+ unsigned int mask;
|
|
|
+ bool cur_mute, prev_mute;
|
|
|
|
|
|
- if (!ucontrol)
|
|
|
+ if (!kcontrol || !ucontrol)
|
|
|
return;
|
|
|
|
|
|
- mute = !(ucontrol->value.integer.value[0] ||
|
|
|
- ucontrol->value.integer.value[1]);
|
|
|
- if (spec->mic_mute_led_on != mute) {
|
|
|
- spec->mic_mute_led_on = mute;
|
|
|
- if (mute)
|
|
|
+ mask = 1U << snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
|
|
|
+ prev_mute = !spec->mic_enabled;
|
|
|
+ if (ucontrol->value.integer.value[0] ||
|
|
|
+ ucontrol->value.integer.value[1])
|
|
|
+ spec->mic_enabled |= mask;
|
|
|
+ else
|
|
|
+ spec->mic_enabled &= ~mask;
|
|
|
+ cur_mute = !spec->mic_enabled;
|
|
|
+ if (cur_mute != prev_mute) {
|
|
|
+ if (cur_mute)
|
|
|
spec->gpio_data |= spec->mic_mute_led_gpio;
|
|
|
else
|
|
|
spec->gpio_data &= ~spec->mic_mute_led_gpio;
|
|
@@ -4462,7 +4469,7 @@ static void stac_setup_gpio(struct hda_codec *codec)
|
|
|
if (spec->mic_mute_led_gpio) {
|
|
|
spec->gpio_mask |= spec->mic_mute_led_gpio;
|
|
|
spec->gpio_dir |= spec->mic_mute_led_gpio;
|
|
|
- spec->mic_mute_led_on = true;
|
|
|
+ spec->mic_enabled = 0;
|
|
|
spec->gpio_data |= spec->mic_mute_led_gpio;
|
|
|
|
|
|
spec->gen.cap_sync_hook = stac_capture_led_hook;
|