Skip to content

Commit 4cc9b9d

Browse files
KailangYangtiwai
authored andcommitted
ALSA: hda/realtek - Support headset mode for ALC225
Support headset mode for ALC225 platforms. Signed-off-by: Kailang Yang <[email protected]> Cc: <[email protected]> # v4.4+ Signed-off-by: Takashi Iwai <[email protected]>
1 parent cfc5a84 commit 4cc9b9d

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

sound/pci/hda/patch_realtek.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)