@@ -3838,6 +3838,17 @@ static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
38383838 }
38393839}
38403840
3841+ static struct coef_fw alc225_pre_hsmode [] = {
3842+ UPDATE_COEF (0x4a , 1 <<8 , 0 ),
3843+ UPDATE_COEFEX (0x57 , 0x05 , 1 <<14 , 0 ),
3844+ UPDATE_COEF (0x63 , 3 <<14 , 3 <<14 ),
3845+ UPDATE_COEF (0x4a , 3 <<4 , 2 <<4 ),
3846+ UPDATE_COEF (0x4a , 3 <<10 , 3 <<10 ),
3847+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
3848+ UPDATE_COEF (0x4a , 3 <<10 , 0 ),
3849+ {}
3850+ };
3851+
38413852static void alc_headset_mode_unplugged (struct hda_codec * codec )
38423853{
38433854 static struct coef_fw coef0255 [] = {
@@ -3873,6 +3884,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
38733884 UPDATE_COEF (0x67 , 0x2000 , 0 ),
38743885 {}
38753886 };
3887+ static struct coef_fw coef0298 [] = {
3888+ UPDATE_COEF (0x19 , 0x1300 , 0x0300 ),
3889+ {}
3890+ };
38763891 static struct coef_fw coef0292 [] = {
38773892 WRITE_COEF (0x76 , 0x000e ),
38783893 WRITE_COEF (0x6c , 0x2400 ),
@@ -3895,13 +3910,7 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
38953910 {}
38963911 };
38973912 static struct coef_fw coef0225 [] = {
3898- UPDATE_COEF (0x4a , 1 <<8 , 0 ),
3899- UPDATE_COEFEX (0x57 , 0x05 , 1 <<14 , 0 ),
3900- UPDATE_COEF (0x63 , 3 <<14 , 3 <<14 ),
3901- UPDATE_COEF (0x4a , 3 <<4 , 2 <<4 ),
3902- UPDATE_COEF (0x4a , 3 <<10 , 3 <<10 ),
3903- UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
3904- UPDATE_COEF (0x4a , 3 <<10 , 0 ),
3913+ UPDATE_COEF (0x63 , 3 <<14 , 0 ),
39053914 {}
39063915 };
39073916 static struct coef_fw coef0274 [] = {
@@ -3935,7 +3944,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
39353944 break ;
39363945 case 0x10ec0286 :
39373946 case 0x10ec0288 :
3947+ alc_process_coef_fw (codec , coef0288 );
3948+ break ;
39383949 case 0x10ec0298 :
3950+ alc_process_coef_fw (codec , coef0298 );
39393951 alc_process_coef_fw (codec , coef0288 );
39403952 break ;
39413953 case 0x10ec0292 :
@@ -3976,6 +3988,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
39763988 {}
39773989 };
39783990 static struct coef_fw coef0288 [] = {
3991+ UPDATE_COEF (0x4f , 0x00c0 , 0 ),
39793992 UPDATE_COEF (0x50 , 0x2000 , 0 ),
39803993 UPDATE_COEF (0x56 , 0x0006 , 0 ),
39813994 UPDATE_COEF (0x4f , 0xfcc0 , 0xc400 ),
@@ -4039,7 +4052,6 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
40394052 case 0x10ec0286 :
40404053 case 0x10ec0288 :
40414054 case 0x10ec0298 :
4042- alc_update_coef_idx (codec , 0x4f , 0x000c , 0 );
40434055 snd_hda_set_pin_ctl_cache (codec , hp_pin , 0 );
40444056 alc_process_coef_fw (codec , coef0288 );
40454057 snd_hda_set_pin_ctl_cache (codec , mic_pin , PIN_VREF50 );
@@ -4072,6 +4084,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
40724084 case 0x10ec0225 :
40734085 case 0x10ec0295 :
40744086 case 0x10ec0299 :
4087+ alc_process_coef_fw (codec , alc225_pre_hsmode );
40754088 alc_update_coef_idx (codec , 0x45 , 0x3f <<10 , 0x31 <<10 );
40764089 snd_hda_set_pin_ctl_cache (codec , hp_pin , 0 );
40774090 alc_process_coef_fw (codec , coef0225 );
@@ -4084,7 +4097,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
40844097static void alc_headset_mode_default (struct hda_codec * codec )
40854098{
40864099 static struct coef_fw coef0225 [] = {
4087- UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
4100+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x30 <<10 ),
4101+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x31 <<10 ),
4102+ UPDATE_COEF (0x49 , 3 <<8 , 0 <<8 ),
4103+ UPDATE_COEF (0x4a , 3 <<4 , 3 <<4 ),
4104+ UPDATE_COEF (0x63 , 3 <<14 , 0 ),
4105+ UPDATE_COEF (0x67 , 0xf000 , 0x3000 ),
40884106 {}
40894107 };
40904108 static struct coef_fw coef0255 [] = {
@@ -4138,6 +4156,7 @@ static void alc_headset_mode_default(struct hda_codec *codec)
41384156 case 0x10ec0225 :
41394157 case 0x10ec0295 :
41404158 case 0x10ec0299 :
4159+ alc_process_coef_fw (codec , alc225_pre_hsmode );
41414160 alc_process_coef_fw (codec , coef0225 );
41424161 break ;
41434162 case 0x10ec0255 :
@@ -4177,6 +4196,8 @@ static void alc_headset_mode_default(struct hda_codec *codec)
41774196/* Iphone type */
41784197static void alc_headset_mode_ctia (struct hda_codec * codec )
41794198{
4199+ int val ;
4200+
41804201 static struct coef_fw coef0255 [] = {
41814202 WRITE_COEF (0x45 , 0xd489 ), /* Set to CTIA type */
41824203 WRITE_COEF (0x1b , 0x0c2b ),
@@ -4219,11 +4240,14 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
42194240 WRITE_COEF (0xc3 , 0x0000 ),
42204241 {}
42214242 };
4222- static struct coef_fw coef0225 [] = {
4243+ static struct coef_fw coef0225_1 [] = {
42234244 UPDATE_COEF (0x45 , 0x3f <<10 , 0x35 <<10 ),
4224- UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
4225- UPDATE_COEF (0x4a , 7 <<6 , 7 <<6 ),
4226- UPDATE_COEF (0x4a , 3 <<4 , 3 <<4 ),
4245+ UPDATE_COEF (0x63 , 3 <<14 , 2 <<14 ),
4246+ {}
4247+ };
4248+ static struct coef_fw coef0225_2 [] = {
4249+ UPDATE_COEF (0x45 , 0x3f <<10 , 0x35 <<10 ),
4250+ UPDATE_COEF (0x63 , 3 <<14 , 1 <<14 ),
42274251 {}
42284252 };
42294253
@@ -4244,8 +4268,17 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
42444268 alc_process_coef_fw (codec , coef0233 );
42454269 break ;
42464270 case 0x10ec0298 :
4247- alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0020 );/* Headset output enable */
4248- /* ALC298 jack type setting is the same with ALC286/ALC288 */
4271+ val = alc_read_coef_idx (codec , 0x50 );
4272+ if (val & (1 << 12 )) {
4273+ alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0020 );
4274+ alc_update_coef_idx (codec , 0x4f , 0xfcc0 , 0xd400 );
4275+ msleep (300 );
4276+ } else {
4277+ alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0010 );
4278+ alc_update_coef_idx (codec , 0x4f , 0xfcc0 , 0xd400 );
4279+ msleep (300 );
4280+ }
4281+ break ;
42494282 case 0x10ec0286 :
42504283 case 0x10ec0288 :
42514284 alc_update_coef_idx (codec , 0x4f , 0xfcc0 , 0xd400 );
@@ -4264,7 +4297,11 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
42644297 case 0x10ec0225 :
42654298 case 0x10ec0295 :
42664299 case 0x10ec0299 :
4267- alc_process_coef_fw (codec , coef0225 );
4300+ val = alc_read_coef_idx (codec , 0x45 );
4301+ if (val & (1 << 9 ))
4302+ alc_process_coef_fw (codec , coef0225_2 );
4303+ else
4304+ alc_process_coef_fw (codec , coef0225_1 );
42684305 break ;
42694306 case 0x10ec0867 :
42704307 alc_update_coefex_idx (codec , 0x57 , 0x5 , 1 <<14 , 0 );
@@ -4320,9 +4357,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
43204357 };
43214358 static struct coef_fw coef0225 [] = {
43224359 UPDATE_COEF (0x45 , 0x3f <<10 , 0x39 <<10 ),
4323- UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
4324- UPDATE_COEF (0x4a , 7 <<6 , 7 <<6 ),
4325- UPDATE_COEF (0x4a , 3 <<4 , 3 <<4 ),
4360+ UPDATE_COEF (0x63 , 3 <<14 , 2 <<14 ),
43264361 {}
43274362 };
43284363
@@ -4344,7 +4379,9 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
43444379 break ;
43454380 case 0x10ec0298 :
43464381 alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0010 );/* Headset output enable */
4347- /* ALC298 jack type setting is the same with ALC286/ALC288 */
4382+ alc_update_coef_idx (codec , 0x4f , 0xfcc0 , 0xe400 );
4383+ msleep (300 );
4384+ break ;
43484385 case 0x10ec0286 :
43494386 case 0x10ec0288 :
43504387 alc_update_coef_idx (codec , 0x4f , 0xfcc0 , 0xe400 );
@@ -4384,6 +4421,14 @@ static void alc_determine_headset_type(struct hda_codec *codec)
43844421 UPDATE_COEF (0x4f , 0xfcc0 , 0xd400 ), /* Check Type */
43854422 {}
43864423 };
4424+ static struct coef_fw coef0298 [] = {
4425+ UPDATE_COEF (0x50 , 0x2000 , 0x2000 ),
4426+ UPDATE_COEF (0x56 , 0x0006 , 0x0006 ),
4427+ UPDATE_COEF (0x66 , 0x0008 , 0 ),
4428+ UPDATE_COEF (0x67 , 0x2000 , 0 ),
4429+ UPDATE_COEF (0x19 , 0x1300 , 0x1300 ),
4430+ {}
4431+ };
43874432 static struct coef_fw coef0293 [] = {
43884433 UPDATE_COEF (0x4a , 0x000f , 0x0008 ), /* Combo Jack auto detect */
43894434 WRITE_COEF (0x45 , 0xD429 ), /* Set to ctia type */
@@ -4396,11 +4441,6 @@ static void alc_determine_headset_type(struct hda_codec *codec)
43964441 WRITE_COEF (0xc3 , 0x0c00 ),
43974442 {}
43984443 };
4399- static struct coef_fw coef0225 [] = {
4400- UPDATE_COEF (0x45 , 0x3f <<10 , 0x34 <<10 ),
4401- UPDATE_COEF (0x49 , 1 <<8 , 1 <<8 ),
4402- {}
4403- };
44044444 static struct coef_fw coef0274 [] = {
44054445 UPDATE_COEF (0x4a , 0x0010 , 0 ),
44064446 UPDATE_COEF (0x4a , 0x8000 , 0 ),
@@ -4433,8 +4473,34 @@ static void alc_determine_headset_type(struct hda_codec *codec)
44334473 is_ctia = (val & 0x0070 ) == 0x0070 ;
44344474 break ;
44354475 case 0x10ec0298 :
4436- alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0020 ); /* Headset output enable */
4437- /* ALC298 check jack type is the same with ALC286/ALC288 */
4476+ snd_hda_codec_write (codec , 0x21 , 0 ,
4477+ AC_VERB_SET_AMP_GAIN_MUTE , AMP_OUT_MUTE );
4478+ msleep (100 );
4479+ snd_hda_codec_write (codec , 0x21 , 0 ,
4480+ AC_VERB_SET_PIN_WIDGET_CONTROL , 0x0 );
4481+ msleep (200 );
4482+
4483+ val = alc_read_coef_idx (codec , 0x50 );
4484+ if (val & (1 << 12 )) {
4485+ alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0020 );
4486+ alc_process_coef_fw (codec , coef0288 );
4487+ msleep (350 );
4488+ val = alc_read_coef_idx (codec , 0x50 );
4489+ is_ctia = (val & 0x0070 ) == 0x0070 ;
4490+ } else {
4491+ alc_update_coef_idx (codec , 0x8e , 0x0070 , 0x0010 );
4492+ alc_process_coef_fw (codec , coef0288 );
4493+ msleep (350 );
4494+ val = alc_read_coef_idx (codec , 0x50 );
4495+ is_ctia = (val & 0x0070 ) == 0x0070 ;
4496+ }
4497+ alc_process_coef_fw (codec , coef0298 );
4498+ snd_hda_codec_write (codec , 0x21 , 0 ,
4499+ AC_VERB_SET_PIN_WIDGET_CONTROL , PIN_HP );
4500+ msleep (75 );
4501+ snd_hda_codec_write (codec , 0x21 , 0 ,
4502+ AC_VERB_SET_AMP_GAIN_MUTE , AMP_OUT_UNMUTE );
4503+ break ;
44384504 case 0x10ec0286 :
44394505 case 0x10ec0288 :
44404506 alc_process_coef_fw (codec , coef0288 );
@@ -4463,10 +4529,25 @@ static void alc_determine_headset_type(struct hda_codec *codec)
44634529 case 0x10ec0225 :
44644530 case 0x10ec0295 :
44654531 case 0x10ec0299 :
4466- alc_process_coef_fw (codec , coef0225 );
4467- msleep (800 );
4468- val = alc_read_coef_idx (codec , 0x46 );
4469- is_ctia = (val & 0x00f0 ) == 0x00f0 ;
4532+ alc_process_coef_fw (codec , alc225_pre_hsmode );
4533+ alc_update_coef_idx (codec , 0x67 , 0xf000 , 0x1000 );
4534+ val = alc_read_coef_idx (codec , 0x45 );
4535+ if (val & (1 << 9 )) {
4536+ alc_update_coef_idx (codec , 0x45 , 0x3f <<10 , 0x34 <<10 );
4537+ alc_update_coef_idx (codec , 0x49 , 3 <<8 , 2 <<8 );
4538+ msleep (800 );
4539+ val = alc_read_coef_idx (codec , 0x46 );
4540+ is_ctia = (val & 0x00f0 ) == 0x00f0 ;
4541+ } else {
4542+ alc_update_coef_idx (codec , 0x45 , 0x3f <<10 , 0x34 <<10 );
4543+ alc_update_coef_idx (codec , 0x49 , 3 <<8 , 1 <<8 );
4544+ msleep (800 );
4545+ val = alc_read_coef_idx (codec , 0x46 );
4546+ is_ctia = (val & 0x00f0 ) == 0x00f0 ;
4547+ }
4548+ alc_update_coef_idx (codec , 0x4a , 7 <<6 , 7 <<6 );
4549+ alc_update_coef_idx (codec , 0x4a , 3 <<4 , 3 <<4 );
4550+ alc_update_coef_idx (codec , 0x67 , 0xf000 , 0x3000 );
44704551 break ;
44714552 case 0x10ec0867 :
44724553 is_ctia = true;
@@ -6724,6 +6805,7 @@ static int patch_alc269(struct hda_codec *codec)
67246805 case 0x10ec0225 :
67256806 case 0x10ec0295 :
67266807 spec -> codec_variant = ALC269_TYPE_ALC225 ;
6808+ spec -> gen .mixer_nid = 0 ; /* no loopback on ALC225 ALC295 */
67276809 break ;
67286810 case 0x10ec0299 :
67296811 spec -> codec_variant = ALC269_TYPE_ALC225 ;
0 commit comments