@@ -5520,6 +5520,9 @@ enum {
5520
5520
ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ,
5521
5521
ALC295_FIXUP_HP_AUTO_MUTE ,
5522
5522
ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ,
5523
+ ALC294_FIXUP_ASUS_MIC ,
5524
+ ALC294_FIXUP_ASUS_HEADSET_MIC ,
5525
+ ALC294_FIXUP_ASUS_SPK ,
5523
5526
};
5524
5527
5525
5528
static const struct hda_fixup alc269_fixups [] = {
@@ -6392,6 +6395,8 @@ static const struct hda_fixup alc269_fixups[] = {
6392
6395
[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ] = {
6393
6396
.type = HDA_FIXUP_FUNC ,
6394
6397
.v .func = alc285_fixup_invalidate_dacs ,
6398
+ .chained = true,
6399
+ .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6395
6400
},
6396
6401
[ALC295_FIXUP_HP_AUTO_MUTE ] = {
6397
6402
.type = HDA_FIXUP_FUNC ,
@@ -6406,6 +6411,36 @@ static const struct hda_fixup alc269_fixups[] = {
6406
6411
.chained = true,
6407
6412
.chain_id = ALC269_FIXUP_HEADSET_MIC
6408
6413
},
6414
+ [ALC294_FIXUP_ASUS_MIC ] = {
6415
+ .type = HDA_FIXUP_PINS ,
6416
+ .v .pins = (const struct hda_pintbl []) {
6417
+ { 0x13 , 0x90a60160 }, /* use as internal mic */
6418
+ { 0x19 , 0x04a11120 }, /* use as headset mic, without its own jack detect */
6419
+ { }
6420
+ },
6421
+ .chained = true,
6422
+ .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6423
+ },
6424
+ [ALC294_FIXUP_ASUS_HEADSET_MIC ] = {
6425
+ .type = HDA_FIXUP_PINS ,
6426
+ .v .pins = (const struct hda_pintbl []) {
6427
+ { 0x19 , 0x01a1113c }, /* use as headset mic, without its own jack detect */
6428
+ { }
6429
+ },
6430
+ .chained = true,
6431
+ .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6432
+ },
6433
+ [ALC294_FIXUP_ASUS_SPK ] = {
6434
+ .type = HDA_FIXUP_VERBS ,
6435
+ .v .verbs = (const struct hda_verb []) {
6436
+ /* Set EAPD high */
6437
+ { 0x20 , AC_VERB_SET_COEF_INDEX , 0x40 },
6438
+ { 0x20 , AC_VERB_SET_PROC_COEF , 0x8800 },
6439
+ { }
6440
+ },
6441
+ .chained = true,
6442
+ .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
6443
+ },
6409
6444
};
6410
6445
6411
6446
static const struct snd_pci_quirk alc269_fixup_tbl [] = {
@@ -6548,6 +6583,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
6548
6583
SND_PCI_QUIRK (0x1043 , 0x12e0 , "ASUS X541SA" , ALC256_FIXUP_ASUS_MIC ),
6549
6584
SND_PCI_QUIRK (0x1043 , 0x13b0 , "ASUS Z550SA" , ALC256_FIXUP_ASUS_MIC ),
6550
6585
SND_PCI_QUIRK (0x1043 , 0x1427 , "Asus Zenbook UX31E" , ALC269VB_FIXUP_ASUS_ZENBOOK ),
6586
+ SND_PCI_QUIRK (0x1043 , 0x14a1 , "ASUS UX533FD" , ALC294_FIXUP_ASUS_SPK ),
6551
6587
SND_PCI_QUIRK (0x1043 , 0x1517 , "Asus Zenbook UX31A" , ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A ),
6552
6588
SND_PCI_QUIRK (0x1043 , 0x16e3 , "ASUS UX50" , ALC269_FIXUP_STEREO_DMIC ),
6553
6589
SND_PCI_QUIRK (0x1043 , 0x1a13 , "Asus G73Jw" , ALC269_FIXUP_ASUS_G73JW ),
@@ -7155,6 +7191,14 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
7155
7191
SND_HDA_PIN_QUIRK (0x10ec0293 , 0x1028 , "Dell" , ALC293_FIXUP_DELL1_MIC_NO_PRESENCE ,
7156
7192
ALC292_STANDARD_PINS ,
7157
7193
{0x13 , 0x90a60140 }),
7194
+ SND_HDA_PIN_QUIRK (0x10ec0294 , 0x1043 , "ASUS" , ALC294_FIXUP_ASUS_MIC ,
7195
+ {0x14 , 0x90170110 },
7196
+ {0x1b , 0x90a70130 },
7197
+ {0x21 , 0x04211020 }),
7198
+ SND_HDA_PIN_QUIRK (0x10ec0294 , 0x1043 , "ASUS" , ALC294_FIXUP_ASUS_SPK ,
7199
+ {0x12 , 0x90a60130 },
7200
+ {0x17 , 0x90170110 },
7201
+ {0x21 , 0x04211020 }),
7158
7202
SND_HDA_PIN_QUIRK (0x10ec0295 , 0x1028 , "Dell" , ALC269_FIXUP_DELL1_MIC_NO_PRESENCE ,
7159
7203
ALC295_STANDARD_PINS ,
7160
7204
{0x17 , 0x21014020 },
@@ -7227,6 +7271,37 @@ static void alc269_fill_coef(struct hda_codec *codec)
7227
7271
alc_update_coef_idx (codec , 0x4 , 0 , 1 <<11 );
7228
7272
}
7229
7273
7274
+ static void alc294_hp_init (struct hda_codec * codec )
7275
+ {
7276
+ struct alc_spec * spec = codec -> spec ;
7277
+ hda_nid_t hp_pin = spec -> gen .autocfg .hp_pins [0 ];
7278
+ int i , val ;
7279
+
7280
+ if (!hp_pin )
7281
+ return ;
7282
+
7283
+ snd_hda_codec_write (codec , hp_pin , 0 ,
7284
+ AC_VERB_SET_AMP_GAIN_MUTE , AMP_OUT_MUTE );
7285
+
7286
+ msleep (100 );
7287
+
7288
+ snd_hda_codec_write (codec , hp_pin , 0 ,
7289
+ AC_VERB_SET_PIN_WIDGET_CONTROL , 0x0 );
7290
+
7291
+ alc_update_coef_idx (codec , 0x6f , 0x000f , 0 );/* Set HP depop to manual mode */
7292
+ alc_update_coefex_idx (codec , 0x58 , 0x00 , 0x8000 , 0x8000 ); /* HP depop procedure start */
7293
+
7294
+ /* Wait for depop procedure finish */
7295
+ val = alc_read_coefex_idx (codec , 0x58 , 0x01 );
7296
+ for (i = 0 ; i < 20 && val & 0x0080 ; i ++ ) {
7297
+ msleep (50 );
7298
+ val = alc_read_coefex_idx (codec , 0x58 , 0x01 );
7299
+ }
7300
+ /* Set HP depop to auto mode */
7301
+ alc_update_coef_idx (codec , 0x6f , 0x000f , 0x000b );
7302
+ msleep (50 );
7303
+ }
7304
+
7230
7305
/*
7231
7306
*/
7232
7307
static int patch_alc269 (struct hda_codec * codec )
@@ -7352,6 +7427,7 @@ static int patch_alc269(struct hda_codec *codec)
7352
7427
spec -> codec_variant = ALC269_TYPE_ALC294 ;
7353
7428
spec -> gen .mixer_nid = 0 ; /* ALC2x4 does not have any loopback mixer path */
7354
7429
alc_update_coef_idx (codec , 0x6b , 0x0018 , (1 <<4 ) | (1 <<3 )); /* UAJ MIC Vref control by verb */
7430
+ alc294_hp_init (codec );
7355
7431
break ;
7356
7432
case 0x10ec0300 :
7357
7433
spec -> codec_variant = ALC269_TYPE_ALC300 ;
@@ -7363,6 +7439,7 @@ static int patch_alc269(struct hda_codec *codec)
7363
7439
spec -> codec_variant = ALC269_TYPE_ALC700 ;
7364
7440
spec -> gen .mixer_nid = 0 ; /* ALC700 does not have any loopback mixer path */
7365
7441
alc_update_coef_idx (codec , 0x4a , 1 << 15 , 0 ); /* Combo jack auto trigger control */
7442
+ alc294_hp_init (codec );
7366
7443
break ;
7367
7444
7368
7445
}
0 commit comments