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 | |
| 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>
| -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), |
