From patchwork Thu Dec 28 02:57:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: bo liu X-Patchwork-Id: 13506120 Received: from mail-m12773.qiye.163.com (mail-m12773.qiye.163.com [115.236.127.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 79FFAF4E3; Thu, 28 Dec 2023 15:54:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=senarytech.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=senarytech.com Received: from liubo (unknown [61.183.143.78]) by mail-m12756.qiye.163.com (Hmail) with ESMTPA id B98DCDC035B; Thu, 28 Dec 2023 10:57:43 +0800 (CST) From: =?utf-8?b?5YiY5Y2a?= To: , Cc: , Subject: =?utf-8?q?Due_to_returning_the_email_and_resending_it//=E7=AD=94?= =?utf-8?q?=E5=A4=8D=3A_=5BPATCH_1/3=5D_Fix_headset_auto_detect_fail_in_cx80?= =?utf-8?q?70_and_SN6140?= Date: Thu, 28 Dec 2023 10:57:43 +0800 Message-ID: <009d01da3939$a1517440$e3f45cc0$@senarytech.com> Precedence: bulk X-Mailing-List: linux-sound@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: Ado5OZT0IQYjxbjwTr6PBszvuPulOQ== Content-Language: zh-cn X-HM-Spam-Status: e1kfGhgUHx5ZQUpXWQgPGg8OCBgUHx5ZQUlOS1dZFg8aDwILHllBWSg2Ly tZV1koWUFITzdXWS1ZQUlXWQ8JGhUIEh9ZQVkaSx9JVh0ZHhkfH0IZTE0dHlUTARMWGhIXJBQOD1 lXWRgSC1lBWU1KVUpDSFVKT0hVTENZV1kWGg8SFR0UWUFZT0tIVUpNT0lOSFVKS0tVSkJLS1kG X-HM-Tid: 0a8cae5b3ba8b223kuuub98dcdc035b X-HM-MType: 1 X-HM-Sender-Digest: e1kMHhlZQR0aFwgeV1kSHx4VD1lBWUc6NUk6Vio5Kjw6CQ8SCC4tPxEL KAMKCy5VSlVKTEtITEhJSU1PTkpOVTMWGhIXVRkUVRcSDjsIHhUaCQIPHhgTVRgUFkVZV1kSC1lB WU1KVUpDSFVKT0hVTENZV1kIAVlBTU5OSjcG FYI Best Regards Bo Liu (刘博) Cell#: +86-18986160629  Email: bo.liu@senarytech.com 深圳前海深蕾半导体有限公司 湖北省武汉市东湖高新技术开发区关山大道355号铭丰大厦 16楼1601-1603室  Room 1601-1603,mTower, No. 355 Guanshan Avenue,  East Lake High-tech Development Zone, Wuhan, Hubei Province.   -----邮件原件----- 发件人: bo liu 发送时间: 2023年12月27日 15:10 收件人: perex@perex.cz; tiwai@suse.com 抄送: linux-sound@vger.kernel.org; linux-kernel@vger.kernel.org; bo liu 主题: [PATCH 1/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 --- sound/pci/hda/patch_conexant.c | 75 +++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) cxt_init_gpio_led(codec); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT); + switch (codec->core.vendor_id) { + case 0x14f11f86: + case 0x14f11f87: + /* fix some headset recognize fail issue */ + snd_hda_codec_write(codec, 0x1c, 0, 0x320, 0x010); + snd_hda_codec_write(codec, 0x1c, 0, 0x3b0, 0xe10); + 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) { + snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x24); + } else { + snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x20); + } + break; + } + return 0; } @@ -191,6 +209,60 @@ 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 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); + phone_present = snd_hda_codec_read(codec, 0x16, 0, 0xf09, 0x0); + 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) { + mic_persent = snd_hda_codec_read(codec, 0x19, 0, 0xf09, 0x0); + if ((phone_present&0x80000000)&&(mic_persent&0x80000000)) {/* headset is present */ + /* wait headset detect done */ + do { + val = snd_hda_codec_read(codec, 0x1c, 0, 0xca0, 0x0); + if(val&0x080) { + break; + } + msleep(10); + count += 1; + } while(count > 5); + val = snd_hda_codec_read(codec, 0x1c, 0, 0xcb0, 0x0); + 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) { + codec_dbg(codec, "headset plugin, type is OMTP\n"); + snd_hda_codec_write(codec, 0x19, 0, 0x707, 0x24); + } else { + codec_dbg(codec, "headphone plugin\n"); + } + headset_present_flag = 2; + } + } + } + break; + } + + snd_hda_jack_unsol_event(codec, res); +} #ifdef CONFIG_PM static int cx_auto_suspend(struct hda_codec *codec) @@ -205,7 +277,7 @@ static const struct hda_codec_ops cx_auto_patch_ops = { .build_pcms = snd_hda_gen_build_pcms, .init = cx_auto_init, .free = cx_auto_free, - .unsol_event = snd_hda_jack_unsol_event, + .unsol_event = cx_jack_unsol_event, #ifdef CONFIG_PM .suspend = cx_auto_suspend, .check_power_status = snd_hda_gen_check_power_status, @@ -1042,6 +1114,7 @@ static int patch_conexant_auto(struct hda_codec *codec) codec->spec = spec; codec->patch_ops = cx_auto_patch_ops; + headset_present_flag = 0; cx_auto_parse_eapd(codec); spec->gen.own_eapd_ctl = 1; -- 2.34.1 diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index a889cccdd607..2d58595bfbdd 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c @@ -166,6 +166,7 @@ static void cxt_init_gpio_led(struct hda_codec *codec) static int cx_auto_init(struct hda_codec *codec) { + unsigned int mic_persent; struct conexant_spec *spec = codec->spec; snd_hda_gen_init(codec); if (!spec->dynamic_eapd) @@ -174,6 +175,23 @@ static int cx_auto_init(struct hda_codec *codec)