@ -43,6 +43,7 @@ struct conexant_spec {
unsigned int num_eapds ;
hda_nid_t eapds [ 4 ] ;
bool dynamic_eapd ;
hda_nid_t mute_led_eapd ;
unsigned int parse_flags ; /* flag for snd_hda_parse_pin_defcfg() */
@ -163,6 +164,17 @@ static void cx_auto_vmaster_hook(void *private_data, int enabled)
cx_auto_turn_eapd ( codec , spec - > num_eapds , spec - > eapds , enabled ) ;
}
/* turn on/off EAPD according to Master switch (inversely!) for mute LED */
static void cx_auto_vmaster_hook_mute_led ( void * private_data , int enabled )
{
struct hda_codec * codec = private_data ;
struct conexant_spec * spec = codec - > spec ;
snd_hda_codec_write ( codec , spec - > mute_led_eapd , 0 ,
AC_VERB_SET_EAPD_BTLENABLE ,
enabled ? 0x00 : 0x02 ) ;
}
static int cx_auto_build_controls ( struct hda_codec * codec )
{
int err ;
@ -223,6 +235,7 @@ enum {
CXT_FIXUP_TOSHIBA_P105 ,
CXT_FIXUP_HP_530 ,
CXT_FIXUP_CAP_MIX_AMP_5047 ,
CXT_FIXUP_MUTE_LED_EAPD ,
} ;
/* for hda_fixup_thinkpad_acpi() */
@ -557,6 +570,18 @@ static void cxt_fixup_olpc_xo(struct hda_codec *codec,
}
}
static void cxt_fixup_mute_led_eapd ( struct hda_codec * codec ,
const struct hda_fixup * fix , int action )
{
struct conexant_spec * spec = codec - > spec ;
if ( action = = HDA_FIXUP_ACT_PRE_PROBE ) {
spec - > mute_led_eapd = 0x1b ;
spec - > dynamic_eapd = 1 ;
spec - > gen . vmaster_mute . hook = cx_auto_vmaster_hook_mute_led ;
}
}
/*
* Fix max input level on mixer widget to 0 dB
* ( originally it has 0x2b steps with 0 dB offset 0x14 )
@ -705,6 +730,10 @@ static const struct hda_fixup cxt_fixups[] = {
. type = HDA_FIXUP_FUNC ,
. v . func = cxt_fixup_cap_mix_amp_5047 ,
} ,
[ CXT_FIXUP_MUTE_LED_EAPD ] = {
. type = HDA_FIXUP_FUNC ,
. v . func = cxt_fixup_mute_led_eapd ,
} ,
} ;
static const struct snd_pci_quirk cxt5045_fixups [ ] = {
@ -762,6 +791,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
SND_PCI_QUIRK ( 0x17aa , 0x21cf , " Lenovo T520 " , CXT_PINCFG_LENOVO_TP410 ) ,
SND_PCI_QUIRK ( 0x17aa , 0x21da , " Lenovo X220 " , CXT_PINCFG_LENOVO_TP410 ) ,
SND_PCI_QUIRK ( 0x17aa , 0x21db , " Lenovo X220-tablet " , CXT_PINCFG_LENOVO_TP410 ) ,
SND_PCI_QUIRK ( 0x17aa , 0x38af , " Lenovo IdeaPad Z560 " , CXT_FIXUP_MUTE_LED_EAPD ) ,
SND_PCI_QUIRK ( 0x17aa , 0x3975 , " Lenovo U300s " , CXT_FIXUP_STEREO_DMIC ) ,
SND_PCI_QUIRK ( 0x17aa , 0x3977 , " Lenovo IdeaPad U310 " , CXT_FIXUP_STEREO_DMIC ) ,
SND_PCI_QUIRK ( 0x17aa , 0x397b , " Lenovo S205 " , CXT_FIXUP_STEREO_DMIC ) ,
@ -780,6 +810,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] = {
{ . id = CXT_PINCFG_LEMOTE_A1004 , . name = " lemote-a1004 " } ,
{ . id = CXT_PINCFG_LEMOTE_A1205 , . name = " lemote-a1205 " } ,
{ . id = CXT_FIXUP_OLPC_XO , . name = " olpc-xo " } ,
{ . id = CXT_FIXUP_MUTE_LED_EAPD , . name = " mute-led-eapd " } ,
{ }
} ;