aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorKailang Yang <kailang@realtek.com>2014-06-19 04:11:36 -0400
committerTakashi Iwai <tiwai@suse.de>2014-06-23 06:11:52 -0400
commit9c5dc3bf121b10f1324f2bb3b9a6f7645850c40e (patch)
tree8538ac7ee27f0971deb06c9a00d25ebea3b7d8bd /sound/pci
parent78fcce4d2cc78f9a1afd9c1f4b1530dc16e4d0b1 (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.c114
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 */
3525static 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
3550static 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
3569static 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
3523static void alc_headset_mode_unplugged(struct hda_codec *codec) 3585static 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),