[alsa-devel] HP mute led for ALC286
Kailang
kailang at realtek.com
Thu Nov 20 08:04:01 CET 2014
> -----Original Message-----
> From: Takashi Iwai [mailto:tiwai at suse.de]
> Sent: Wednesday, November 19, 2014 7:28 PM
> To: Kailang
> Cc: (alsa-devel at alsa-project.org)
> Subject: Re: HP mute led for ALC286
>
> At Wed, 19 Nov 2014 07:13:16 +0000,
> Kailang wrote:
> >
> > Hi Takashi,
> >
> > I had sent the discussion mail about the DMI string for HP.
> > But no body response.
> > So, I just send the patch to fix this issue.
>
> I'd like to avoid the duplicated open codes, so could you try
> the patch below and rewrite your patch to follow this? You'd
> just need to set like:
> spec->gpio_mute_led_mask = 0x02;
> spec->gpio_mic_led_mask = 0x20;
> pec->mute_led_polarity = 0;
> then you can use the existing alc_fixup_gpio_mute_hook and
> alc_fixup_gpio_mic_mute_hook.
I modified as attach patch. ^^
>
>
> thanks,
>
> Takashi
>
> -- 8< --
> From: Takashi Iwai <tiwai at suse.de>
> Subject: [PATCH] ALSA: hda/realtek - Clean up mute/mic GPIO
> LED handling
>
> There are a few duplicated codes handling the mute and
> mic-mute LEDs via GPIO pins. Let's consolidate to single
> helpers. Here we introduced two new fields to alc_spec,
> gpio_mute_led_mask and gpio_mic_led_mask, to contain the bit
> mask to set/clear. Also, mute_led_polarity is evaluated as well.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/pci/hda/patch_realtek.c | 81
> +++++++++++++++++++++----------------------
> 1 file changed, 40 insertions(+), 41 deletions(-)
>
> diff --git a/sound/pci/hda/patch_realtek.c
> b/sound/pci/hda/patch_realtek.c index
> 1af917f58a70..3c29a558e7db 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -96,6 +96,8 @@ struct alc_spec {
> hda_nid_t cap_mute_led_nid;
>
> unsigned int gpio_led; /* used for alc269_fixup_hp_gpio_led() */
> + unsigned int gpio_mute_led_mask;
> + unsigned int gpio_mic_led_mask;
>
> hda_nid_t headset_mic_pin;
> hda_nid_t headphone_mic_pin;
> @@ -3235,41 +3237,45 @@ static void
> alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
> }
> }
>
> -/* turn on/off mute LED per vmaster hook */ -static void
> alc269_fixup_hp_gpio_mute_hook(void *private_data, int enabled)
> +/* update LED status via GPIO */
> +static void alc_update_gpio_led(struct hda_codec *codec,
> unsigned int mask,
> + bool enabled)
> {
> - struct hda_codec *codec = private_data;
> struct alc_spec *spec = codec->spec;
> unsigned int oldval = spec->gpio_led;
>
> + if (spec->mute_led_polarity)
> + enabled = !enabled;
> +
> if (enabled)
> - spec->gpio_led &= ~0x08;
> + spec->gpio_led &= ~mask;
> else
> - spec->gpio_led |= 0x08;
> + spec->gpio_led |= mask;
> if (spec->gpio_led != oldval)
> snd_hda_codec_write(codec, 0x01, 0,
> AC_VERB_SET_GPIO_DATA,
> spec->gpio_led);
> }
>
> -/* turn on/off mic-mute LED per capture hook */ -static void
> alc269_fixup_hp_gpio_mic_mute_hook(struct hda_codec *codec,
> - struct
> snd_kcontrol *kcontrol,
> - struct
> snd_ctl_elem_value *ucontrol)
> +/* turn on/off mute LED via GPIO per vmaster hook */ static void
> +alc_fixup_gpio_mute_hook(void *private_data, int enabled)
> {
> + struct hda_codec *codec = private_data;
> struct alc_spec *spec = codec->spec;
> - unsigned int oldval = spec->gpio_led;
>
> - if (!ucontrol)
> - return;
> + alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled); }
>
> - if (ucontrol->value.integer.value[0] ||
> - ucontrol->value.integer.value[1])
> - spec->gpio_led &= ~0x10;
> - else
> - spec->gpio_led |= 0x10;
> - if (spec->gpio_led != oldval)
> - snd_hda_codec_write(codec, 0x01, 0,
> AC_VERB_SET_GPIO_DATA,
> - spec->gpio_led);
> +/* turn on/off mic-mute LED via GPIO per capture hook */ static void
> +alc_fixup_gpio_mic_mute_hook(struct hda_codec *codec,
> + struct snd_kcontrol *kcontrol,
> + struct
> snd_ctl_elem_value *ucontrol) {
> + struct alc_spec *spec = codec->spec;
> +
> + if (ucontrol)
> + alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
> + ucontrol->value.integer.value[0] ||
> + ucontrol->value.integer.value[1]);
> }
>
> static void alc269_fixup_hp_gpio_led(struct hda_codec
> *codec, @@ -3283,9 +3289,12 @@ static void
> alc269_fixup_hp_gpio_led(struct hda_codec *codec,
> };
>
> if (action == HDA_FIXUP_ACT_PRE_PROBE) {
> - spec->gen.vmaster_mute.hook =
> alc269_fixup_hp_gpio_mute_hook;
> - spec->gen.cap_sync_hook =
> alc269_fixup_hp_gpio_mic_mute_hook;
> + spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
> + spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
> spec->gpio_led = 0;
> + spec->mute_led_polarity = 0;
> + spec->gpio_mute_led_mask = 0x08;
> + spec->gpio_mic_led_mask = 0x10;
> snd_hda_add_verbs(codec, gpio_init);
> }
> }
> @@ -3327,9 +3336,11 @@ static void
> alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
> };
>
> if (action == HDA_FIXUP_ACT_PRE_PROBE) {
> - spec->gen.vmaster_mute.hook =
> alc269_fixup_hp_gpio_mute_hook;
> + spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
> spec->gen.cap_sync_hook =
> alc269_fixup_hp_cap_mic_mute_hook;
> spec->gpio_led = 0;
> + spec->mute_led_polarity = 0;
> + spec->gpio_mute_led_mask = 0x08;
> spec->cap_mute_led_nid = 0x18;
> snd_hda_add_verbs(codec, gpio_init);
> codec->power_filter = led_power_filter; @@
> -3348,9 +3359,11 @@ static void alc280_fixup_hp_gpio4(struct
> hda_codec *codec,
> };
>
> if (action == HDA_FIXUP_ACT_PRE_PROBE) {
> - spec->gen.vmaster_mute.hook =
> alc269_fixup_hp_gpio_mute_hook;
> + spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
> spec->gen.cap_sync_hook =
> alc269_fixup_hp_cap_mic_mute_hook;
> spec->gpio_led = 0;
> + spec->mute_led_polarity = 0;
> + spec->gpio_mute_led_mask = 0x08;
> spec->cap_mute_led_nid = 0x18;
> snd_hda_add_verbs(codec, gpio_init);
> codec->power_filter = led_power_filter; @@
> -5624,22 +5637,6 @@ static void alc_fixup_bass_chmap(struct
> hda_codec *codec,
> }
> }
>
> -/* turn on/off mute LED per vmaster hook */ -static void
> alc662_led_gpio1_mute_hook(void *private_data, int enabled) -{
> - struct hda_codec *codec = private_data;
> - struct alc_spec *spec = codec->spec;
> - unsigned int oldval = spec->gpio_led;
> -
> - if (enabled)
> - spec->gpio_led |= 0x01;
> - else
> - spec->gpio_led &= ~0x01;
> - if (spec->gpio_led != oldval)
> - snd_hda_codec_write(codec, 0x01, 0,
> AC_VERB_SET_GPIO_DATA,
> - spec->gpio_led);
> -}
> -
> /* avoid D3 for keeping GPIO up */
> static unsigned int gpio_led_power_filter(struct hda_codec *codec,
> hda_nid_t nid,
> @@ -5662,8 +5659,10 @@ static void
> alc662_fixup_led_gpio1(struct hda_codec *codec,
> };
>
> if (action == HDA_FIXUP_ACT_PRE_PROBE) {
> - spec->gen.vmaster_mute.hook =
> alc662_led_gpio1_mute_hook;
> + spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
> spec->gpio_led = 0;
> + spec->mute_led_polarity = 1;
> + spec->gpio_mute_led_mask = 0x01;
> snd_hda_add_verbs(codec, gpio_init);
> codec->power_filter = gpio_led_power_filter;
> }
> --
> 2.1.3
>
>
> ------Please consider the environment before printing this e-mail.
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-supported-HP-mute-led-alc286.patch
Type: application/octet-stream
Size: 3572 bytes
Desc: 0001-supported-HP-mute-led-alc286.patch
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20141120/aa462091/attachment.obj>
More information about the Alsa-devel
mailing list