@@ -388,6 +388,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
388
388
case 0x10ec0285 :
389
389
case 0x10ec0298 :
390
390
case 0x10ec0289 :
391
+ case 0x10ec0300 :
391
392
alc_update_coef_idx (codec , 0x10 , 1 <<9 , 0 );
392
393
break ;
393
394
case 0x10ec0275 :
@@ -2830,6 +2831,7 @@ enum {
2830
2831
ALC269_TYPE_ALC215 ,
2831
2832
ALC269_TYPE_ALC225 ,
2832
2833
ALC269_TYPE_ALC294 ,
2834
+ ALC269_TYPE_ALC300 ,
2833
2835
ALC269_TYPE_ALC700 ,
2834
2836
};
2835
2837
@@ -2864,6 +2866,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
2864
2866
case ALC269_TYPE_ALC215 :
2865
2867
case ALC269_TYPE_ALC225 :
2866
2868
case ALC269_TYPE_ALC294 :
2869
+ case ALC269_TYPE_ALC300 :
2867
2870
case ALC269_TYPE_ALC700 :
2868
2871
ssids = alc269_ssids ;
2869
2872
break ;
@@ -4985,9 +4988,18 @@ static void alc_fixup_tpt470_dock(struct hda_codec *codec,
4985
4988
{ 0x19 , 0x21a11010 }, /* dock mic */
4986
4989
{ }
4987
4990
};
4991
+ /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
4992
+ * the speaker output becomes too low by some reason on Thinkpads with
4993
+ * ALC298 codec
4994
+ */
4995
+ static hda_nid_t preferred_pairs [] = {
4996
+ 0x14 , 0x03 , 0x17 , 0x02 , 0x21 , 0x02 ,
4997
+ 0
4998
+ };
4988
4999
struct alc_spec * spec = codec -> spec ;
4989
5000
4990
5001
if (action == HDA_FIXUP_ACT_PRE_PROBE ) {
5002
+ spec -> gen .preferred_dacs = preferred_pairs ;
4991
5003
spec -> parse_flags = HDA_PINCFG_NO_HP_FIXUP ;
4992
5004
snd_hda_apply_pincfgs (codec , pincfgs );
4993
5005
} else if (action == HDA_FIXUP_ACT_INIT ) {
@@ -5358,6 +5370,16 @@ static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5358
5370
spec -> gen .preferred_dacs = preferred_pairs ;
5359
5371
}
5360
5372
5373
+ /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
5374
+ static void alc285_fixup_invalidate_dacs (struct hda_codec * codec ,
5375
+ const struct hda_fixup * fix , int action )
5376
+ {
5377
+ if (action != HDA_FIXUP_ACT_PRE_PROBE )
5378
+ return ;
5379
+
5380
+ snd_hda_override_wcaps (codec , 0x03 , 0 );
5381
+ }
5382
+
5361
5383
/* for hda_fixup_thinkpad_acpi() */
5362
5384
#include "thinkpad_helper.c"
5363
5385
@@ -5492,6 +5514,9 @@ enum {
5492
5514
ALC255_FIXUP_DELL_HEADSET_MIC ,
5493
5515
ALC295_FIXUP_HP_X360 ,
5494
5516
ALC221_FIXUP_HP_HEADSET_MIC ,
5517
+ ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ,
5518
+ ALC295_FIXUP_HP_AUTO_MUTE ,
5519
+ ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ,
5495
5520
};
5496
5521
5497
5522
static const struct hda_fixup alc269_fixups [] = {
@@ -5656,6 +5681,8 @@ static const struct hda_fixup alc269_fixups[] = {
5656
5681
[ALC269_FIXUP_HP_MUTE_LED_MIC3 ] = {
5657
5682
.type = HDA_FIXUP_FUNC ,
5658
5683
.v .func = alc269_fixup_hp_mute_led_mic3 ,
5684
+ .chained = true,
5685
+ .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
5659
5686
},
5660
5687
[ALC269_FIXUP_HP_GPIO_LED ] = {
5661
5688
.type = HDA_FIXUP_FUNC ,
@@ -6359,6 +6386,23 @@ static const struct hda_fixup alc269_fixups[] = {
6359
6386
.chained = true,
6360
6387
.chain_id = ALC269_FIXUP_HEADSET_MIC
6361
6388
},
6389
+ [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ] = {
6390
+ .type = HDA_FIXUP_FUNC ,
6391
+ .v .func = alc285_fixup_invalidate_dacs ,
6392
+ },
6393
+ [ALC295_FIXUP_HP_AUTO_MUTE ] = {
6394
+ .type = HDA_FIXUP_FUNC ,
6395
+ .v .func = alc_fixup_auto_mute_via_amp ,
6396
+ },
6397
+ [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ] = {
6398
+ .type = HDA_FIXUP_PINS ,
6399
+ .v .pins = (const struct hda_pintbl []) {
6400
+ { 0x18 , 0x01a1913c }, /* use as headset mic, without its own jack detect */
6401
+ { }
6402
+ },
6403
+ .chained = true,
6404
+ .chain_id = ALC269_FIXUP_HEADSET_MIC
6405
+ },
6362
6406
};
6363
6407
6364
6408
static const struct snd_pci_quirk alc269_fixup_tbl [] = {
@@ -6373,7 +6417,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
6373
6417
SND_PCI_QUIRK (0x1025 , 0x0762 , "Acer Aspire E1-472" , ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),
6374
6418
SND_PCI_QUIRK (0x1025 , 0x0775 , "Acer Aspire E1-572" , ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572 ),
6375
6419
SND_PCI_QUIRK (0x1025 , 0x079b , "Acer Aspire V5-573G" , ALC282_FIXUP_ASPIRE_V5_PINS ),
6420
+ SND_PCI_QUIRK (0x1025 , 0x102b , "Acer Aspire C24-860" , ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ),
6376
6421
SND_PCI_QUIRK (0x1025 , 0x106d , "Acer Cloudbook 14" , ALC283_FIXUP_CHROME_BOOK ),
6422
+ SND_PCI_QUIRK (0x1025 , 0x128f , "Acer Veriton Z6860G" , ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ),
6423
+ SND_PCI_QUIRK (0x1025 , 0x1290 , "Acer Veriton Z4860G" , ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ),
6424
+ SND_PCI_QUIRK (0x1025 , 0x1291 , "Acer Veriton Z4660G" , ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ),
6377
6425
SND_PCI_QUIRK (0x1028 , 0x0470 , "Dell M101z" , ALC269_FIXUP_DELL_M101Z ),
6378
6426
SND_PCI_QUIRK (0x1028 , 0x054b , "Dell XPS one 2710" , ALC275_FIXUP_DELL_XPS ),
6379
6427
SND_PCI_QUIRK (0x1028 , 0x05bd , "Dell Latitude E6440" , ALC292_FIXUP_DELL_E7X ),
@@ -7032,6 +7080,15 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
7032
7080
{0x12 , 0x90a60130 },
7033
7081
{0x19 , 0x03a11020 },
7034
7082
{0x21 , 0x0321101f }),
7083
+ SND_HDA_PIN_QUIRK (0x10ec0285 , 0x17aa , "Lenovo" , ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ,
7084
+ {0x12 , 0x90a60130 },
7085
+ {0x14 , 0x90170110 },
7086
+ {0x19 , 0x04a11040 },
7087
+ {0x21 , 0x04211020 }),
7088
+ SND_HDA_PIN_QUIRK (0x10ec0286 , 0x1025 , "Acer" , ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ,
7089
+ {0x12 , 0x90a60130 },
7090
+ {0x17 , 0x90170110 },
7091
+ {0x21 , 0x02211020 }),
7035
7092
SND_HDA_PIN_QUIRK (0x10ec0288 , 0x1028 , "Dell" , ALC288_FIXUP_DELL1_MIC_NO_PRESENCE ,
7036
7093
{0x12 , 0x90a60120 },
7037
7094
{0x14 , 0x90170110 },
@@ -7167,6 +7224,37 @@ static void alc269_fill_coef(struct hda_codec *codec)
7167
7224
alc_update_coef_idx (codec , 0x4 , 0 , 1 <<11 );
7168
7225
}
7169
7226
7227
+ static void alc294_hp_init (struct hda_codec * codec )
7228
+ {
7229
+ struct alc_spec * spec = codec -> spec ;
7230
+ hda_nid_t hp_pin = spec -> gen .autocfg .hp_pins [0 ];
7231
+ int i , val ;
7232
+
7233
+ if (!hp_pin )
7234
+ return ;
7235
+
7236
+ snd_hda_codec_write (codec , hp_pin , 0 ,
7237
+ AC_VERB_SET_AMP_GAIN_MUTE , AMP_OUT_MUTE );
7238
+
7239
+ msleep (100 );
7240
+
7241
+ snd_hda_codec_write (codec , hp_pin , 0 ,
7242
+ AC_VERB_SET_PIN_WIDGET_CONTROL , 0x0 );
7243
+
7244
+ alc_update_coef_idx (codec , 0x6f , 0x000f , 0 );/* Set HP depop to manual mode */
7245
+ alc_update_coefex_idx (codec , 0x58 , 0x00 , 0x8000 , 0x8000 ); /* HP depop procedure start */
7246
+
7247
+ /* Wait for depop procedure finish */
7248
+ val = alc_read_coefex_idx (codec , 0x58 , 0x01 );
7249
+ for (i = 0 ; i < 20 && val & 0x0080 ; i ++ ) {
7250
+ msleep (50 );
7251
+ val = alc_read_coefex_idx (codec , 0x58 , 0x01 );
7252
+ }
7253
+ /* Set HP depop to auto mode */
7254
+ alc_update_coef_idx (codec , 0x6f , 0x000f , 0x000b );
7255
+ msleep (50 );
7256
+ }
7257
+
7170
7258
/*
7171
7259
*/
7172
7260
static int patch_alc269 (struct hda_codec * codec )
@@ -7292,13 +7380,19 @@ static int patch_alc269(struct hda_codec *codec)
7292
7380
spec -> codec_variant = ALC269_TYPE_ALC294 ;
7293
7381
spec -> gen .mixer_nid = 0 ; /* ALC2x4 does not have any loopback mixer path */
7294
7382
alc_update_coef_idx (codec , 0x6b , 0x0018 , (1 <<4 ) | (1 <<3 )); /* UAJ MIC Vref control by verb */
7383
+ alc294_hp_init (codec );
7384
+ break ;
7385
+ case 0x10ec0300 :
7386
+ spec -> codec_variant = ALC269_TYPE_ALC300 ;
7387
+ spec -> gen .mixer_nid = 0 ; /* no loopback on ALC300 */
7295
7388
break ;
7296
7389
case 0x10ec0700 :
7297
7390
case 0x10ec0701 :
7298
7391
case 0x10ec0703 :
7299
7392
spec -> codec_variant = ALC269_TYPE_ALC700 ;
7300
7393
spec -> gen .mixer_nid = 0 ; /* ALC700 does not have any loopback mixer path */
7301
7394
alc_update_coef_idx (codec , 0x4a , 1 << 15 , 0 ); /* Combo jack auto trigger control */
7395
+ alc294_hp_init (codec );
7302
7396
break ;
7303
7397
7304
7398
}
@@ -8403,6 +8497,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
8403
8497
HDA_CODEC_ENTRY (0x10ec0295 , "ALC295" , patch_alc269 ),
8404
8498
HDA_CODEC_ENTRY (0x10ec0298 , "ALC298" , patch_alc269 ),
8405
8499
HDA_CODEC_ENTRY (0x10ec0299 , "ALC299" , patch_alc269 ),
8500
+ HDA_CODEC_ENTRY (0x10ec0300 , "ALC300" , patch_alc269 ),
8406
8501
HDA_CODEC_REV_ENTRY (0x10ec0861 , 0x100340 , "ALC660" , patch_alc861 ),
8407
8502
HDA_CODEC_ENTRY (0x10ec0660 , "ALC660-VD" , patch_alc861vd ),
8408
8503
HDA_CODEC_ENTRY (0x10ec0861 , "ALC861" , patch_alc861 ),
0 commit comments