diff options
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 71e4bad06345..e9ebc7bd752c 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -43,6 +43,7 @@ struct conexant_spec { | |||
| 43 | unsigned int num_eapds; | 43 | unsigned int num_eapds; |
| 44 | hda_nid_t eapds[4]; | 44 | hda_nid_t eapds[4]; |
| 45 | bool dynamic_eapd; | 45 | bool dynamic_eapd; |
| 46 | hda_nid_t mute_led_eapd; | ||
| 46 | 47 | ||
| 47 | unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */ | 48 | unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */ |
| 48 | 49 | ||
| @@ -163,6 +164,17 @@ static void cx_auto_vmaster_hook(void *private_data, int enabled) | |||
| 163 | cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, enabled); | 164 | cx_auto_turn_eapd(codec, spec->num_eapds, spec->eapds, enabled); |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 167 | /* turn on/off EAPD according to Master switch (inversely!) for mute LED */ | ||
| 168 | static void cx_auto_vmaster_hook_mute_led(void *private_data, int enabled) | ||
| 169 | { | ||
| 170 | struct hda_codec *codec = private_data; | ||
| 171 | struct conexant_spec *spec = codec->spec; | ||
| 172 | |||
| 173 | snd_hda_codec_write(codec, spec->mute_led_eapd, 0, | ||
| 174 | AC_VERB_SET_EAPD_BTLENABLE, | ||
| 175 | enabled ? 0x00 : 0x02); | ||
| 176 | } | ||
| 177 | |||
| 166 | static int cx_auto_build_controls(struct hda_codec *codec) | 178 | static int cx_auto_build_controls(struct hda_codec *codec) |
| 167 | { | 179 | { |
| 168 | int err; | 180 | int err; |
| @@ -223,6 +235,7 @@ enum { | |||
| 223 | CXT_FIXUP_TOSHIBA_P105, | 235 | CXT_FIXUP_TOSHIBA_P105, |
| 224 | CXT_FIXUP_HP_530, | 236 | CXT_FIXUP_HP_530, |
| 225 | CXT_FIXUP_CAP_MIX_AMP_5047, | 237 | CXT_FIXUP_CAP_MIX_AMP_5047, |
| 238 | CXT_FIXUP_MUTE_LED_EAPD, | ||
| 226 | }; | 239 | }; |
| 227 | 240 | ||
| 228 | /* for hda_fixup_thinkpad_acpi() */ | 241 | /* for hda_fixup_thinkpad_acpi() */ |
| @@ -557,6 +570,18 @@ static void cxt_fixup_olpc_xo(struct hda_codec *codec, | |||
| 557 | } | 570 | } |
| 558 | } | 571 | } |
| 559 | 572 | ||
| 573 | static void cxt_fixup_mute_led_eapd(struct hda_codec *codec, | ||
| 574 | const struct hda_fixup *fix, int action) | ||
| 575 | { | ||
| 576 | struct conexant_spec *spec = codec->spec; | ||
| 577 | |||
| 578 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
| 579 | spec->mute_led_eapd = 0x1b; | ||
| 580 | spec->dynamic_eapd = 1; | ||
| 581 | spec->gen.vmaster_mute.hook = cx_auto_vmaster_hook_mute_led; | ||
| 582 | } | ||
| 583 | } | ||
| 584 | |||
| 560 | /* | 585 | /* |
| 561 | * Fix max input level on mixer widget to 0dB | 586 | * Fix max input level on mixer widget to 0dB |
| 562 | * (originally it has 0x2b steps with 0dB offset 0x14) | 587 | * (originally it has 0x2b steps with 0dB offset 0x14) |
| @@ -705,6 +730,10 @@ static const struct hda_fixup cxt_fixups[] = { | |||
| 705 | .type = HDA_FIXUP_FUNC, | 730 | .type = HDA_FIXUP_FUNC, |
| 706 | .v.func = cxt_fixup_cap_mix_amp_5047, | 731 | .v.func = cxt_fixup_cap_mix_amp_5047, |
| 707 | }, | 732 | }, |
| 733 | [CXT_FIXUP_MUTE_LED_EAPD] = { | ||
| 734 | .type = HDA_FIXUP_FUNC, | ||
| 735 | .v.func = cxt_fixup_mute_led_eapd, | ||
| 736 | }, | ||
| 708 | }; | 737 | }; |
| 709 | 738 | ||
| 710 | static const struct snd_pci_quirk cxt5045_fixups[] = { | 739 | static const struct snd_pci_quirk cxt5045_fixups[] = { |
| @@ -762,6 +791,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = { | |||
| 762 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), | 791 | SND_PCI_QUIRK(0x17aa, 0x21cf, "Lenovo T520", CXT_PINCFG_LENOVO_TP410), |
| 763 | SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT_PINCFG_LENOVO_TP410), | 792 | SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT_PINCFG_LENOVO_TP410), |
| 764 | SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT_PINCFG_LENOVO_TP410), | 793 | SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT_PINCFG_LENOVO_TP410), |
| 794 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo IdeaPad Z560", CXT_FIXUP_MUTE_LED_EAPD), | ||
| 765 | SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC), | 795 | SND_PCI_QUIRK(0x17aa, 0x3975, "Lenovo U300s", CXT_FIXUP_STEREO_DMIC), |
| 766 | SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC), | 796 | SND_PCI_QUIRK(0x17aa, 0x3977, "Lenovo IdeaPad U310", CXT_FIXUP_STEREO_DMIC), |
| 767 | SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC), | 797 | SND_PCI_QUIRK(0x17aa, 0x397b, "Lenovo S205", CXT_FIXUP_STEREO_DMIC), |
| @@ -780,6 +810,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] = { | |||
| 780 | { .id = CXT_PINCFG_LEMOTE_A1004, .name = "lemote-a1004" }, | 810 | { .id = CXT_PINCFG_LEMOTE_A1004, .name = "lemote-a1004" }, |
| 781 | { .id = CXT_PINCFG_LEMOTE_A1205, .name = "lemote-a1205" }, | 811 | { .id = CXT_PINCFG_LEMOTE_A1205, .name = "lemote-a1205" }, |
| 782 | { .id = CXT_FIXUP_OLPC_XO, .name = "olpc-xo" }, | 812 | { .id = CXT_FIXUP_OLPC_XO, .name = "olpc-xo" }, |
| 813 | { .id = CXT_FIXUP_MUTE_LED_EAPD, .name = "mute-led-eapd" }, | ||
| 783 | {} | 814 | {} |
| 784 | }; | 815 | }; |
| 785 | 816 | ||
