if you cannot use debug version, you can modify hdajacksense.c or use hda verb to check whether the codec can differentitate cita or omtp headset
static void alc_determine_headset_type(struct hda_codec *codec) +{ + int val; + bool is_ctia = false; + struct alc_spec *spec = codec->spec; + + switch (codec->vendor_id) { + case 0x10ec0283: + alc_write_coef_idx(codec, 0x45, 0xd029); + msleep(300); + val = alc_read_coef_idx(codec, 0x46); + is_ctia = (val & 0x0070) == 0x0070; + break; + case 0x10ec0292: + alc_write_coef_idx(codec, 0x6b, 0xd429); + msleep(300); + val = alc_read_coef_idx(codec, 0x6c); + is_ctia = (val & 0x001c) == 0x001c; + break; + case 0x10ec0668: + alc_write_coef_idx(codec, 0x11, 0x0001); + alc_write_coef_idx(codec, 0xb7, 0x802b); + alc_write_coef_idx(codec, 0x15, 0x0d60); + alc_write_coef_idx(codec, 0xc3, 0x0c00); + msleep(300); + val = alc_read_coef_idx(codec, 0xbe); + is_ctia = (val & 0x1c02) == 0x1c02; + break; + } + + snd_printdd("Headset jack detected iPhone-style headset: %s\n", + is_ctia ? "yes" : "no"); + spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
if you cannot use debug version, you can modify hdajacksense.c or use hda verb to check whether the codec can differentitate cita or omtp headset
static void alc_determine_ headset_ type(struct hda_codec *codec) coef_idx( codec, 0x45, 0xd029); coef_idx( codec, 0x46); coef_idx( codec, 0x6b, 0xd429); coef_idx( codec, 0x6c); coef_idx( codec, 0x11, 0x0001); coef_idx( codec, 0xb7, 0x802b); coef_idx( codec, 0x15, 0x0d60); coef_idx( codec, 0xc3, 0x0c00); coef_idx( codec, 0xbe); "Headset jack detected iPhone-style headset: %s\n", headset_ type = is_ctia ? ALC_HEADSET_ TYPE_CTIA : ALC_HEADSET_ TYPE_OMTP;
+{
+ int val;
+ bool is_ctia = false;
+ struct alc_spec *spec = codec->spec;
+
+ switch (codec->vendor_id) {
+ case 0x10ec0283:
+ alc_write_
+ msleep(300);
+ val = alc_read_
+ is_ctia = (val & 0x0070) == 0x0070;
+ break;
+ case 0x10ec0292:
+ alc_write_
+ msleep(300);
+ val = alc_read_
+ is_ctia = (val & 0x001c) == 0x001c;
+ break;
+ case 0x10ec0668:
+ alc_write_
+ alc_write_
+ alc_write_
+ alc_write_
+ msleep(300);
+ val = alc_read_
+ is_ctia = (val & 0x1c02) == 0x1c02;
+ break;
+ }
+
+ snd_printdd(
+ is_ctia ? "yes" : "no");
+ spec->current_