Commit 89542936 authored by Kailang Yang's avatar Kailang Yang Committed by Takashi Iwai

ALSA: hda/realtek - Update headset mode for ALC298

Dell new platform with new hardware layout.
Old headset mode policy will cause headset mode check type has a
chance to check fail.
So, we update new headset mode to match new hardware layout.
New headset mode policy also could suitable to old hardware layout.
Signed-off-by: default avatarKailang Yang <kailang@realtek.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 74ec1181
...@@ -3873,6 +3873,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) ...@@ -3873,6 +3873,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
UPDATE_COEF(0x67, 0x2000, 0), UPDATE_COEF(0x67, 0x2000, 0),
{} {}
}; };
static struct coef_fw coef0298[] = {
UPDATE_COEF(0x19, 0x1300, 0x0300),
{}
};
static struct coef_fw coef0292[] = { static struct coef_fw coef0292[] = {
WRITE_COEF(0x76, 0x000e), WRITE_COEF(0x76, 0x000e),
WRITE_COEF(0x6c, 0x2400), WRITE_COEF(0x6c, 0x2400),
...@@ -3935,7 +3939,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) ...@@ -3935,7 +3939,10 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
break; break;
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
alc_process_coef_fw(codec, coef0288);
break;
case 0x10ec0298: case 0x10ec0298:
alc_process_coef_fw(codec, coef0298);
alc_process_coef_fw(codec, coef0288); alc_process_coef_fw(codec, coef0288);
break; break;
case 0x10ec0292: case 0x10ec0292:
...@@ -3976,6 +3983,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, ...@@ -3976,6 +3983,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
{} {}
}; };
static struct coef_fw coef0288[] = { static struct coef_fw coef0288[] = {
UPDATE_COEF(0x4f, 0x00c0, 0),
UPDATE_COEF(0x50, 0x2000, 0), UPDATE_COEF(0x50, 0x2000, 0),
UPDATE_COEF(0x56, 0x0006, 0), UPDATE_COEF(0x56, 0x0006, 0),
UPDATE_COEF(0x4f, 0xfcc0, 0xc400), UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
...@@ -4039,7 +4047,6 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, ...@@ -4039,7 +4047,6 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
case 0x10ec0298: case 0x10ec0298:
alc_update_coef_idx(codec, 0x4f, 0x000c, 0);
snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
alc_process_coef_fw(codec, coef0288); alc_process_coef_fw(codec, coef0288);
snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
...@@ -4177,6 +4184,8 @@ static void alc_headset_mode_default(struct hda_codec *codec) ...@@ -4177,6 +4184,8 @@ static void alc_headset_mode_default(struct hda_codec *codec)
/* Iphone type */ /* Iphone type */
static void alc_headset_mode_ctia(struct hda_codec *codec) static void alc_headset_mode_ctia(struct hda_codec *codec)
{ {
int val;
static struct coef_fw coef0255[] = { static struct coef_fw coef0255[] = {
WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */ WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
WRITE_COEF(0x1b, 0x0c2b), WRITE_COEF(0x1b, 0x0c2b),
...@@ -4244,8 +4253,17 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) ...@@ -4244,8 +4253,17 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
alc_process_coef_fw(codec, coef0233); alc_process_coef_fw(codec, coef0233);
break; break;
case 0x10ec0298: case 0x10ec0298:
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);/* Headset output enable */ val = alc_read_coef_idx(codec, 0x50);
/* ALC298 jack type setting is the same with ALC286/ALC288 */ if (val & (1 << 12)) {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
msleep(300);
} else {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
msleep(300);
}
break;
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400); alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
...@@ -4344,7 +4362,9 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) ...@@ -4344,7 +4362,9 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
break; break;
case 0x10ec0298: case 0x10ec0298:
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */ alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
/* ALC298 jack type setting is the same with ALC286/ALC288 */ alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
msleep(300);
break;
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400); alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
...@@ -4384,6 +4404,14 @@ static void alc_determine_headset_type(struct hda_codec *codec) ...@@ -4384,6 +4404,14 @@ static void alc_determine_headset_type(struct hda_codec *codec)
UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */ UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
{} {}
}; };
static struct coef_fw coef0298[] = {
UPDATE_COEF(0x50, 0x2000, 0x2000),
UPDATE_COEF(0x56, 0x0006, 0x0006),
UPDATE_COEF(0x66, 0x0008, 0),
UPDATE_COEF(0x67, 0x2000, 0),
UPDATE_COEF(0x19, 0x1300, 0x1300),
{}
};
static struct coef_fw coef0293[] = { static struct coef_fw coef0293[] = {
UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */ UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
WRITE_COEF(0x45, 0xD429), /* Set to ctia type */ WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
...@@ -4433,8 +4461,34 @@ static void alc_determine_headset_type(struct hda_codec *codec) ...@@ -4433,8 +4461,34 @@ static void alc_determine_headset_type(struct hda_codec *codec)
is_ctia = (val & 0x0070) == 0x0070; is_ctia = (val & 0x0070) == 0x0070;
break; break;
case 0x10ec0298: case 0x10ec0298:
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020); /* Headset output enable */ snd_hda_codec_write(codec, 0x21, 0,
/* ALC298 check jack type is the same with ALC286/ALC288 */ AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
msleep(100);
snd_hda_codec_write(codec, 0x21, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
msleep(200);
val = alc_read_coef_idx(codec, 0x50);
if (val & (1 << 12)) {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
alc_process_coef_fw(codec, coef0288);
msleep(350);
val = alc_read_coef_idx(codec, 0x50);
is_ctia = (val & 0x0070) == 0x0070;
} else {
alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
alc_process_coef_fw(codec, coef0288);
msleep(350);
val = alc_read_coef_idx(codec, 0x50);
is_ctia = (val & 0x0070) == 0x0070;
}
alc_process_coef_fw(codec, coef0298);
snd_hda_codec_write(codec, 0x21, 0,
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
msleep(75);
snd_hda_codec_write(codec, 0x21, 0,
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
break;
case 0x10ec0286: case 0x10ec0286:
case 0x10ec0288: case 0x10ec0288:
alc_process_coef_fw(codec, coef0288); alc_process_coef_fw(codec, coef0288);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment