@@ -5380,6 +5380,66 @@ static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
5380
5380
snd_hda_override_wcaps (codec , 0x03 , 0 );
5381
5381
}
5382
5382
5383
+ static const struct hda_jack_keymap alc_headset_btn_keymap [] = {
5384
+ { SND_JACK_BTN_0 , KEY_PLAYPAUSE },
5385
+ { SND_JACK_BTN_1 , KEY_VOICECOMMAND },
5386
+ { SND_JACK_BTN_2 , KEY_VOLUMEUP },
5387
+ { SND_JACK_BTN_3 , KEY_VOLUMEDOWN },
5388
+ {}
5389
+ };
5390
+
5391
+ static void alc_headset_btn_callback (struct hda_codec * codec ,
5392
+ struct hda_jack_callback * jack )
5393
+ {
5394
+ int report = 0 ;
5395
+
5396
+ if (jack -> unsol_res & (7 << 13 ))
5397
+ report |= SND_JACK_BTN_0 ;
5398
+
5399
+ if (jack -> unsol_res & (1 << 16 | 3 << 8 ))
5400
+ report |= SND_JACK_BTN_1 ;
5401
+
5402
+ /* Volume up key */
5403
+ if (jack -> unsol_res & (7 << 23 ))
5404
+ report |= SND_JACK_BTN_2 ;
5405
+
5406
+ /* Volume down key */
5407
+ if (jack -> unsol_res & (7 << 10 ))
5408
+ report |= SND_JACK_BTN_3 ;
5409
+
5410
+ jack -> jack -> button_state = report ;
5411
+ }
5412
+
5413
+ static void alc_fixup_headset_jack (struct hda_codec * codec ,
5414
+ const struct hda_fixup * fix , int action )
5415
+ {
5416
+
5417
+ switch (action ) {
5418
+ case HDA_FIXUP_ACT_PRE_PROBE :
5419
+ snd_hda_jack_detect_enable_callback (codec , 0x55 ,
5420
+ alc_headset_btn_callback );
5421
+ snd_hda_jack_add_kctl (codec , 0x55 , "Headset Jack" , false,
5422
+ SND_JACK_HEADSET , alc_headset_btn_keymap );
5423
+ break ;
5424
+ case HDA_FIXUP_ACT_INIT :
5425
+ switch (codec -> core .vendor_id ) {
5426
+ case 0x10ec0225 :
5427
+ case 0x10ec0295 :
5428
+ case 0x10ec0299 :
5429
+ alc_write_coef_idx (codec , 0x48 , 0xd011 );
5430
+ alc_update_coef_idx (codec , 0x49 , 0x007f , 0x0045 );
5431
+ alc_update_coef_idx (codec , 0x44 , 0x007f << 8 , 0x0045 << 8 );
5432
+ break ;
5433
+ case 0x10ec0236 :
5434
+ case 0x10ec0256 :
5435
+ alc_write_coef_idx (codec , 0x48 , 0xd011 );
5436
+ alc_update_coef_idx (codec , 0x49 , 0x007f , 0x0045 );
5437
+ break ;
5438
+ }
5439
+ break ;
5440
+ }
5441
+ }
5442
+
5383
5443
/* for hda_fixup_thinkpad_acpi() */
5384
5444
#include "thinkpad_helper.c"
5385
5445
@@ -5517,6 +5577,7 @@ enum {
5517
5577
ALC285_FIXUP_LENOVO_HEADPHONE_NOISE ,
5518
5578
ALC295_FIXUP_HP_AUTO_MUTE ,
5519
5579
ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE ,
5580
+ ALC225_FIXUP_HEADSET_JACK ,
5520
5581
};
5521
5582
5522
5583
static const struct hda_fixup alc269_fixups [] = {
@@ -6403,6 +6464,10 @@ static const struct hda_fixup alc269_fixups[] = {
6403
6464
.chained = true,
6404
6465
.chain_id = ALC269_FIXUP_HEADSET_MIC
6405
6466
},
6467
+ [ALC225_FIXUP_HEADSET_JACK ] = {
6468
+ .type = HDA_FIXUP_FUNC ,
6469
+ .v .func = alc_fixup_headset_jack ,
6470
+ },
6406
6471
};
6407
6472
6408
6473
static const struct snd_pci_quirk alc269_fixup_tbl [] = {
@@ -6805,6 +6870,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
6805
6870
{.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB , .name = "alc255-dummy-lineout" },
6806
6871
{.id = ALC255_FIXUP_DELL_HEADSET_MIC , .name = "alc255-dell-headset" },
6807
6872
{.id = ALC295_FIXUP_HP_X360 , .name = "alc295-hp-x360" },
6873
+ {.id = ALC225_FIXUP_HEADSET_JACK , .name = "alc-sense-combo" },
6808
6874
{}
6809
6875
};
6810
6876
#define ALC225_STANDARD_PINS \
0 commit comments