diff options
author | Kailang Yang <kailang@realtek.com> | 2014-06-19 04:11:36 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2014-06-23 06:11:52 -0400 |
commit | 9c5dc3bf121b10f1324f2bb3b9a6f7645850c40e (patch) | |
tree | 8538ac7ee27f0971deb06c9a00d25ebea3b7d8bd /sound/pci | |
parent | 78fcce4d2cc78f9a1afd9c1f4b1530dc16e4d0b1 (diff) |
ALSA: hda/realtek - Support HP mute led for output and input
HP mute led support output mute led and input mute led.
ALC280:
GPIO3 to control output mute led.
Mic1 vref to control input mute led.
ALC282:
Line1 vref to control output mute led.
Mic1 vref to control input mute led.
Signed-off-by: Kailang Yang <kailang@realtek.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index af76995fa966..4852120dd9c6 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -101,6 +101,7 @@ struct alc_spec { | |||
101 | /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */ | 101 | /* mute LED for HP laptops, see alc269_fixup_mic_mute_hook() */ |
102 | int mute_led_polarity; | 102 | int mute_led_polarity; |
103 | hda_nid_t mute_led_nid; | 103 | hda_nid_t mute_led_nid; |
104 | hda_nid_t cap_mute_led_nid; | ||
104 | 105 | ||
105 | unsigned int gpio_led; /* used for alc269_fixup_hp_gpio_led() */ | 106 | unsigned int gpio_led; /* used for alc269_fixup_hp_gpio_led() */ |
106 | 107 | ||
@@ -3520,6 +3521,67 @@ static void alc269_fixup_hp_gpio_led(struct hda_codec *codec, | |||
3520 | } | 3521 | } |
3521 | } | 3522 | } |
3522 | 3523 | ||
3524 | /* turn on/off mic-mute LED per capture hook */ | ||
3525 | static void alc269_fixup_hp_cap_mic_mute_hook(struct hda_codec *codec, | ||
3526 | struct snd_kcontrol *kcontrol, | ||
3527 | struct snd_ctl_elem_value *ucontrol) | ||
3528 | { | ||
3529 | struct alc_spec *spec = codec->spec; | ||
3530 | unsigned int pinval, enable, disable; | ||
3531 | |||
3532 | pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); | ||
3533 | pinval &= ~AC_PINCTL_VREFEN; | ||
3534 | enable = pinval | AC_PINCTL_VREF_80; | ||
3535 | disable = pinval | AC_PINCTL_VREF_HIZ; | ||
3536 | |||
3537 | if (!ucontrol) | ||
3538 | return; | ||
3539 | |||
3540 | if (ucontrol->value.integer.value[0] || | ||
3541 | ucontrol->value.integer.value[1]) | ||
3542 | pinval = disable; | ||
3543 | else | ||
3544 | pinval = enable; | ||
3545 | |||
3546 | if (spec->cap_mute_led_nid) | ||
3547 | snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval); | ||
3548 | } | ||
3549 | |||
3550 | static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, | ||
3551 | const struct hda_fixup *fix, int action) | ||
3552 | { | ||
3553 | struct alc_spec *spec = codec->spec; | ||
3554 | static const struct hda_verb gpio_init[] = { | ||
3555 | { 0x01, AC_VERB_SET_GPIO_MASK, 0x08 }, | ||
3556 | { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x08 }, | ||
3557 | {} | ||
3558 | }; | ||
3559 | |||
3560 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
3561 | spec->gen.vmaster_mute.hook = alc269_fixup_hp_gpio_mute_hook; | ||
3562 | spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook; | ||
3563 | spec->gpio_led = 0; | ||
3564 | spec->cap_mute_led_nid = 0x18; | ||
3565 | snd_hda_add_verbs(codec, gpio_init); | ||
3566 | } | ||
3567 | } | ||
3568 | |||
3569 | static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, | ||
3570 | const struct hda_fixup *fix, int action) | ||
3571 | { | ||
3572 | struct alc_spec *spec = codec->spec; | ||
3573 | |||
3574 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
3575 | spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook; | ||
3576 | spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook; | ||
3577 | spec->mute_led_polarity = 0; | ||
3578 | spec->mute_led_nid = 0x1a; | ||
3579 | spec->cap_mute_led_nid = 0x18; | ||
3580 | spec->gen.vmaster_mute_enum = 1; | ||
3581 | codec->power_filter = led_power_filter; | ||
3582 | } | ||
3583 | } | ||
3584 | |||
3523 | static void alc_headset_mode_unplugged(struct hda_codec *codec) | 3585 | static void alc_headset_mode_unplugged(struct hda_codec *codec) |
3524 | { | 3586 | { |
3525 | int val; | 3587 | int val; |
@@ -4255,6 +4317,8 @@ enum { | |||
4255 | ALC269_FIXUP_HP_MUTE_LED_MIC1, | 4317 | ALC269_FIXUP_HP_MUTE_LED_MIC1, |
4256 | ALC269_FIXUP_HP_MUTE_LED_MIC2, | 4318 | ALC269_FIXUP_HP_MUTE_LED_MIC2, |
4257 | ALC269_FIXUP_HP_GPIO_LED, | 4319 | ALC269_FIXUP_HP_GPIO_LED, |
4320 | ALC269_FIXUP_HP_GPIO_MIC1_LED, | ||
4321 | ALC269_FIXUP_HP_LINE1_MIC1_LED, | ||
4258 | ALC269_FIXUP_INV_DMIC, | 4322 | ALC269_FIXUP_INV_DMIC, |
4259 | ALC269_FIXUP_LENOVO_DOCK, | 4323 | ALC269_FIXUP_LENOVO_DOCK, |
4260 | ALC269_FIXUP_NO_SHUTUP, | 4324 | ALC269_FIXUP_NO_SHUTUP, |
@@ -4447,6 +4511,14 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4447 | .type = HDA_FIXUP_FUNC, | 4511 | .type = HDA_FIXUP_FUNC, |
4448 | .v.func = alc269_fixup_hp_gpio_led, | 4512 | .v.func = alc269_fixup_hp_gpio_led, |
4449 | }, | 4513 | }, |
4514 | [ALC269_FIXUP_HP_GPIO_MIC1_LED] = { | ||
4515 | .type = HDA_FIXUP_FUNC, | ||
4516 | .v.func = alc269_fixup_hp_gpio_mic1_led, | ||
4517 | }, | ||
4518 | [ALC269_FIXUP_HP_LINE1_MIC1_LED] = { | ||
4519 | .type = HDA_FIXUP_FUNC, | ||
4520 | .v.func = alc269_fixup_hp_line1_mic1_led, | ||
4521 | }, | ||
4450 | [ALC269_FIXUP_INV_DMIC] = { | 4522 | [ALC269_FIXUP_INV_DMIC] = { |
4451 | .type = HDA_FIXUP_FUNC, | 4523 | .type = HDA_FIXUP_FUNC, |
4452 | .v.func = alc_fixup_inv_dmic_0x12, | 4524 | .v.func = alc_fixup_inv_dmic_0x12, |
@@ -4790,6 +4862,20 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4790 | SND_PCI_QUIRK(0x103c, 0x2212, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4862 | SND_PCI_QUIRK(0x103c, 0x2212, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4791 | SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4863 | SND_PCI_QUIRK(0x103c, 0x2213, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4792 | SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4864 | SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4865 | SND_PCI_QUIRK(0x103c, 0x2234, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4866 | SND_PCI_QUIRK(0x103c, 0x2235, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4867 | SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4868 | SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4869 | SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4870 | SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4871 | SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4872 | SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4873 | SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4874 | SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4875 | SND_PCI_QUIRK(0x103c, 0x224a, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4876 | SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4877 | SND_PCI_QUIRK(0x103c, 0x224c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4878 | SND_PCI_QUIRK(0x103c, 0x224d, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED), | ||
4793 | SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4879 | SND_PCI_QUIRK(0x103c, 0x2266, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4794 | SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4880 | SND_PCI_QUIRK(0x103c, 0x2267, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4795 | SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4881 | SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -4814,13 +4900,41 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4814 | SND_PCI_QUIRK(0x103c, 0x22ce, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4900 | SND_PCI_QUIRK(0x103c, 0x22ce, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4815 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4901 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4816 | SND_PCI_QUIRK(0x103c, 0x22d0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4902 | SND_PCI_QUIRK(0x103c, 0x22d0, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4903 | SND_PCI_QUIRK(0x103c, 0x22da, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4904 | SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4905 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4906 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4907 | SND_PCI_QUIRK(0x103c, 0x8004, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4817 | /* ALC290 */ | 4908 | /* ALC290 */ |
4909 | SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4910 | SND_PCI_QUIRK(0x103c, 0x2220, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4911 | SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4912 | SND_PCI_QUIRK(0x103c, 0x2222, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4913 | SND_PCI_QUIRK(0x103c, 0x2223, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4914 | SND_PCI_QUIRK(0x103c, 0x2224, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4915 | SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4916 | SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4917 | SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4918 | SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4919 | SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4920 | SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4921 | SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4922 | SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4923 | SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4924 | SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4925 | SND_PCI_QUIRK(0x103c, 0x2258, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4926 | SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4927 | SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4818 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4928 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4819 | SND_PCI_QUIRK(0x103c, 0x2261, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4929 | SND_PCI_QUIRK(0x103c, 0x2261, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4820 | SND_PCI_QUIRK(0x103c, 0x2262, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4930 | SND_PCI_QUIRK(0x103c, 0x2262, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4821 | SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4931 | SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4822 | SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4932 | SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4823 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4933 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4934 | SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4935 | SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4936 | SND_PCI_QUIRK(0x103c, 0x2277, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4937 | SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4824 | SND_PCI_QUIRK(0x103c, 0x227d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4938 | SND_PCI_QUIRK(0x103c, 0x227d, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4825 | SND_PCI_QUIRK(0x103c, 0x227e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4939 | SND_PCI_QUIRK(0x103c, 0x227e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4826 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4940 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |