@@ -3662,6 +3662,16 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
36623662 WRITE_COEF (0xb7 , 0x802b ),
36633663 {}
36643664 };
3665+ static struct coef_fw coef0225 [] = {
3666+ UPDATE_COEF (0x4a , 1 <<8 , 0 ),
3667+ UPDATE_COEFEX (0x57 , 0x05 , 1 <<14 , 0 ),
3668+ UPDATE_COEF (0x63 , 3 <<14 , 3 <<14 ),
3669+ UPDATE_COEF (0x4a , 3 <<4 , 2 <<4 ),
3670+ UPDATE_COEF (0x4a , 3 <<10 , 3 <<10 ),
3671+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
3672+ UPDATE_COEF (0x4a , 3 <<10 , 0 ),
3673+ {}
3674+ };
36653675
36663676 switch (codec -> core .vendor_id ) {
36673677 case 0x10ec0255 :
@@ -3686,6 +3696,9 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
36863696 case 0x10ec0668 :
36873697 alc_process_coef_fw (codec , coef0668 );
36883698 break ;
3699+ case 0x10ec0225 :
3700+ alc_process_coef_fw (codec , coef0225 );
3701+ break ;
36893702 }
36903703 codec_dbg (codec , "Headset jack set to unplugged mode.\n" );
36913704}
@@ -3731,6 +3744,13 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
37313744 UPDATE_COEF (0xc3 , 0 , 1 <<12 ),
37323745 {}
37333746 };
3747+ static struct coef_fw coef0225 [] = {
3748+ UPDATE_COEFEX (0x57 , 0x05 , 1 <<14 , 1 <<14 ),
3749+ UPDATE_COEF (0x4a , 3 <<4 , 2 <<4 ),
3750+ UPDATE_COEF (0x63 , 3 <<14 , 0 ),
3751+ {}
3752+ };
3753+
37343754
37353755 switch (codec -> core .vendor_id ) {
37363756 case 0x10ec0255 :
@@ -3776,6 +3796,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
37763796 alc_process_coef_fw (codec , coef0688 );
37773797 snd_hda_set_pin_ctl_cache (codec , mic_pin , PIN_VREF50 );
37783798 break ;
3799+ case 0x10ec0225 :
3800+ alc_update_coef_idx (codec , 0x45 , 0x3f <<10 , 0x31 <<10 );
3801+ snd_hda_set_pin_ctl_cache (codec , hp_pin , 0 );
3802+ alc_process_coef_fw (codec , coef0225 );
3803+ snd_hda_set_pin_ctl_cache (codec , mic_pin , PIN_VREF50 );
3804+ break ;
37793805 }
37803806 codec_dbg (codec , "Headset jack set to mic-in mode.\n" );
37813807}
@@ -3888,6 +3914,13 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
38883914 WRITE_COEF (0xc3 , 0x0000 ),
38893915 {}
38903916 };
3917+ static struct coef_fw coef0225 [] = {
3918+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x35 <<10 ),
3919+ UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
3920+ UPDATE_COEF (0x4a , 7 <<6 , 7 <<6 ),
3921+ UPDATE_COEF (0x4a , 3 <<4 , 3 <<4 ),
3922+ {}
3923+ };
38913924
38923925 switch (codec -> core .vendor_id ) {
38933926 case 0x10ec0255 :
@@ -3916,6 +3949,9 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
39163949 case 0x10ec0668 :
39173950 alc_process_coef_fw (codec , coef0688 );
39183951 break ;
3952+ case 0x10ec0225 :
3953+ alc_process_coef_fw (codec , coef0225 );
3954+ break ;
39193955 }
39203956 codec_dbg (codec , "Headset jack set to iPhone-style headset mode.\n" );
39213957}
@@ -3959,6 +3995,13 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
39593995 WRITE_COEF (0xc3 , 0x0000 ),
39603996 {}
39613997 };
3998+ static struct coef_fw coef0225 [] = {
3999+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x39 <<10 ),
4000+ UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
4001+ UPDATE_COEF (0x4a , 7 <<6 , 7 <<6 ),
4002+ UPDATE_COEF (0x4a , 3 <<4 , 3 <<4 ),
4003+ {}
4004+ };
39624005
39634006 switch (codec -> core .vendor_id ) {
39644007 case 0x10ec0255 :
@@ -3987,6 +4030,9 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
39874030 case 0x10ec0668 :
39884031 alc_process_coef_fw (codec , coef0688 );
39894032 break ;
4033+ case 0x10ec0225 :
4034+ alc_process_coef_fw (codec , coef0225 );
4035+ break ;
39904036 }
39914037 codec_dbg (codec , "Headset jack set to Nokia-style headset mode.\n" );
39924038}
@@ -4018,6 +4064,11 @@ static void alc_determine_headset_type(struct hda_codec *codec)
40184064 WRITE_COEF (0xc3 , 0x0c00 ),
40194065 {}
40204066 };
4067+ static struct coef_fw coef0225 [] = {
4068+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
4069+ UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
4070+ {}
4071+ };
40214072
40224073 switch (codec -> core .vendor_id ) {
40234074 case 0x10ec0255 :
@@ -4062,6 +4113,12 @@ static void alc_determine_headset_type(struct hda_codec *codec)
40624113 val = alc_read_coef_idx (codec , 0xbe );
40634114 is_ctia = (val & 0x1c02 ) == 0x1c02 ;
40644115 break ;
4116+ case 0x10ec0225 :
4117+ alc_process_coef_fw (codec , coef0225 );
4118+ msleep (800 );
4119+ val = alc_read_coef_idx (codec , 0x46 );
4120+ is_ctia = (val & 0x00f0 ) == 0x00f0 ;
4121+ break ;
40654122 }
40664123
40674124 codec_dbg (codec , "Headset jack detected iPhone-style headset: %s\n" ,
0 commit comments