lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20231227071008.13665-2-bo.liu@senarytech.com> Date: Wed, 27 Dec 2023 15:10:07 +0800 From: bo liu <bo.liu@...arytech.com> To: perex@...ex.cz, tiwai@...e.com Cc: linux-sound@...r.kernel.org, linux-kernel@...r.kernel.org, bo liu <bo.liu@...arytech.com> Subject: [PATCH 2/3] Fix headset auto detect fail in cx8070 and SN6140 CX8070 and SN6140 will get wrong headset type when use OMTP headset, then the headset mic will not work. Signed-off-by: bo liu <bo.liu@...arytech.com> --- sound/pci/hda/patch_conexant.c | 35 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 2d58595bfbdd..9ebc0709a202 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -184,11 +184,10 @@ static int cx_auto_init(struct hda_codec *codec) snd_hda_codec_write(codec, 0x1c, 0, 0x4f0, 0x0eb); /* fix reboot headset recognize fail issue */ mic_persent = snd_hda_codec_read(codec, 0x19, 0, 0xf09, 0x0); - if (mic_persent&0x80000000) { + if (mic_persent&0x80000000) snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x24); - } else { + else snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x20); - } break; } @@ -209,46 +208,46 @@ static void cx_auto_free(struct hda_codec *codec) cx_auto_shutdown(codec); snd_hda_gen_free(codec); } - + static int headset_present_flag; static void cx_jack_unsol_event(struct hda_codec *codec, unsigned int res) { - unsigned int val,phone_present,mic_persent,phone_tag,mic_tag; + unsigned int val, phone_present, mic_persent,phone_tag, mic_tag; unsigned int count=0; - + switch (codec->core.vendor_id) { case 0x14f11f86: case 0x14f11f87: /* check hp&mic tag to process headset pulgin&plugout */ phone_tag = snd_hda_codec_read(codec, 0x16, 0, 0xf08, 0x0); mic_tag = snd_hda_codec_read(codec, 0x19, 0, 0xf08, 0x0); - if((phone_tag&(res>>26)) || (mic_tag&(res>>26))) { - //msleep(600); + if ((phone_tag&(res>>26)) || (mic_tag&(res>>26))) { phone_present = snd_hda_codec_read(codec, 0x16, 0, 0xf09, 0x0); - if(!(phone_present&0x80000000)) {/* headphone plugout */ + if (!(phone_present&0x80000000)) {/* headphone plugout */ headset_present_flag = 0; snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x20); break; } if (headset_present_flag == 0) { headset_present_flag = 1; - } else if(headset_present_flag == 1) { + } else if (headset_present_flag == 1) { mic_persent = snd_hda_codec_read(codec, 0x19, 0, 0xf09, 0x0); - if ((phone_present&0x80000000)&&(mic_persent&0x80000000)) {/* headset is present */ + /* headset is present */ + if ((phone_present&0x80000000) && (mic_persent&0x80000000)) { /* wait headset detect done */ do { - val = snd_hda_codec_read(codec, 0x1c, 0, 0xca0, 0x0); - if(val&0x080) { + val = snd_hda_codec_read(codec, 0x1c, + 0, 0xca0, 0x0); + if (val&0x080) break; - } - msleep(10); + msleep(20); count += 1; - } while(count > 5); + } while (count > 3); val = snd_hda_codec_read(codec, 0x1c, 0, 0xcb0, 0x0); - if(val&0x800) { + if (val&0x800) { codec_dbg(codec, "headset plugin, type is CTIA\n"); snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x24); - } else if(val&0x400) { + } else if (val&0x400) { codec_dbg(codec, "headset plugin, type is OMTP\n"); snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x24); } else { -- 2.34.1
Powered by blists - more mailing lists