From 619f0f87159c5dbd2755b1b0a0eb35784be84e7a Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Fri, 22 Mar 2024 08:09:42 +0000 Subject: [PATCH] 增加支持hp & spk 自动切换 --- kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi | 37 +++++++++--------- kernel/drivers/headset_observe/rk_headset.c | 11 +++++ kernel/drivers/headset_observe/rockchip_headset_core.c | 28 ++++++++++++++ kernel/drivers/headset_observe/rk_headset.h | 1 kernel/.gitignore | 1 kernel/drivers/headset_observe/rk_headset_irq_hook_adc.c | 11 +++++ 6 files changed, 69 insertions(+), 20 deletions(-) diff --git a/kernel/.gitignore b/kernel/.gitignore index f2f21dd..ad136f3 100644 --- a/kernel/.gitignore +++ b/kernel/.gitignore @@ -44,6 +44,7 @@ *.xz Module.symvers modules.builtin +*.modinfo # # Top-level generic files diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi b/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi index 3b44759..b122855 100755 --- a/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/NK-6A13_V0A.dtsi @@ -38,10 +38,10 @@ io-channels = <&saradc 3>; io-channel-names = "adc-detect"; keyup-threshold-microvolt = <1800000>; - pinctrl-0 = <&hp_det>; + pinctrl-0 = <&spk_con>; pinctrl-names = "default"; - hp-det-gpio = <&gpio1 RK_PD5 GPIO_ACTIVE_HIGH>; - spk-con-gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; + //hp-det-gpio = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>; + //spk-con-gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_HIGH>; play-pause-key { label = "playpause"; linux,code = <164>; @@ -132,9 +132,10 @@ }; rk_headset: rk-headset { - status = "disabled"; + status = "okay"; compatible = "rockchip_headset"; - headset_gpio = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>; + headset_gpio = <&gpio1 RK_PD5 GPIO_ACTIVE_HIGH>; + spk_ctl_gpio = <&gpio3 RK_PC3 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; pinctrl-0 = <&hp_det>; io-channels = <&saradc 3>; @@ -389,6 +390,14 @@ &combphy0_ps { status = "okay"; }; + +/* +&usbdrd_dwc3_0 { + dr_mode = "otg"; + extcon = <&u2phy0>; + status = "okay"; +}; +*/ &combphy1_ps { status = "okay"; @@ -901,6 +910,10 @@ hp_det: hp-det { rockchip,pins = <1 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; }; + + spk_con: spk-con { + rockchip,pins = <3 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none>; + }; }; hym8563 { @@ -1050,12 +1063,6 @@ vmmc-supply = <&vcc_3v3_sd_s0>; }; -&uart9 { - status = "okay"; - pinctrl-names = "default"; - pinctrl-0 = <&uart9m0_xfer &uart9m0_ctsn>; -}; - &u2phy0_otg { status = "okay"; }; @@ -1099,16 +1106,10 @@ status = "okay"; }; -&usbdrd_dwc3_0 { - dr_mode = "otg"; - extcon = <&u2phy0>; - status = "okay"; -}; - &usbdrd_dwc3_1 { dr_mode = "host"; maximum-speed = "high-speed"; - status = "okay"; + status = "disabled"; }; &uart1 { diff --git a/kernel/drivers/headset_observe/rk_headset.c b/kernel/drivers/headset_observe/rk_headset.c index 5b16db7..3564946 100644 --- a/kernel/drivers/headset_observe/rk_headset.c +++ b/kernel/drivers/headset_observe/rk_headset.c @@ -153,6 +153,7 @@ { int level = 0; int level2 = 0; + int ret; struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; @@ -177,11 +178,15 @@ pr_warn("old_status == headset_info->headset_status\n"); goto out; } - DBG("(headset in is %s)headset status is %s\n", + DBG("(troy test headset in is %s)headset status is %s\n", pdata->headset_insert_type ? "high level" : "low level", headset_info->headset_status ? "in" : "out"); if (headset_info->headset_status == HEADSET_IN) { headset_info->cur_headset_status = BIT_HEADSET_NO_MIC; + ret = gpio_direction_output(pdata->spk_ctl_gpio,1); + if (ret < 0) { + printk("spk_ctl_gpio set direction fail\n"); + } if (pdata->headset_insert_type == HEADSET_IN_HIGH) irq_set_irq_type(headset_info->irq[HEADSET], IRQF_TRIGGER_FALLING); @@ -196,6 +201,10 @@ goto out; } } else if (headset_info->headset_status == HEADSET_OUT) { + ret = gpio_direction_output(pdata->spk_ctl_gpio,0); + if (ret < 0) { + printk("spk_ctl_gpio set direction fail\n"); + } headset_info->hook_status = HOOK_UP; if (headset_info->isHook_irq == enable) { DBG("disable headset_hook irq\n"); diff --git a/kernel/drivers/headset_observe/rk_headset.h b/kernel/drivers/headset_observe/rk_headset.h index c10961c..ffde994 100644 --- a/kernel/drivers/headset_observe/rk_headset.h +++ b/kernel/drivers/headset_observe/rk_headset.h @@ -11,6 +11,7 @@ struct rk_headset_pdata { /* heaset about */ unsigned int headset_gpio; + unsigned int spk_ctl_gpio; /* Headphones into the state level */ unsigned int headset_insert_type; /* hook about */ diff --git a/kernel/drivers/headset_observe/rk_headset_irq_hook_adc.c b/kernel/drivers/headset_observe/rk_headset_irq_hook_adc.c index 828a026..9484c75 100644 --- a/kernel/drivers/headset_observe/rk_headset_irq_hook_adc.c +++ b/kernel/drivers/headset_observe/rk_headset_irq_hook_adc.c @@ -111,6 +111,7 @@ struct rk_headset_pdata *pdata = headset_info->pdata; static unsigned int old_status = 0; int i, level = 0; + int ret; disable_irq_nosync(headset_info->irq[HEADSET]); if (headset_info->heatset_irq_working == BUSY || @@ -161,11 +162,15 @@ goto out; } - pr_info("(headset in is %s)headset status is %s\n", + pr_info("(myttest headset in is %s)headset status is %s\n", pdata->headset_insert_type ? "high level" : "low level", headset_info->headset_status ? "in" : "out"); if (headset_info->headset_status == HEADSET_IN) { + ret = gpio_direction_output(pdata->spk_ctl_gpio,1); + if (ret < 0) { + printk("spk_ctl_gpio set direction fail\n"); + } if (pdata->chan != 0) { /* detect Hook key */ schedule_delayed_work( @@ -186,6 +191,10 @@ irq_set_irq_type(headset_info->irq[HEADSET], IRQF_TRIGGER_RISING); } else if (headset_info->headset_status == HEADSET_OUT) { + ret = gpio_direction_output(pdata->spk_ctl_gpio,0); + if (ret < 0) { + printk("spk_ctl_gpio set direction fail\n"); + } headset_info->cur_headset_status = HEADSET_OUT; cancel_delayed_work(&headset_info->hook_work); if (headset_info->isMic) { diff --git a/kernel/drivers/headset_observe/rockchip_headset_core.c b/kernel/drivers/headset_observe/rockchip_headset_core.c index 3c2eeb7..9f44b25 100644 --- a/kernel/drivers/headset_observe/rockchip_headset_core.c +++ b/kernel/drivers/headset_observe/rockchip_headset_core.c @@ -73,6 +73,34 @@ HEADSET_IN_LOW : HEADSET_IN_HIGH; } + + /* spk-ctl */ + ret = of_get_named_gpio_flags(node, "spk_ctl_gpio", 0, &flags); + if (ret < 0) { + dev_err(&pdev->dev, "Can not read property headset_gpio\n"); + goto err; + } else { + pdata->spk_ctl_gpio = ret; + ret = devm_gpio_request(&pdev->dev, pdata->spk_ctl_gpio, + "spk_ctl_gpio"); + if (ret < 0) { + dev_err(&pdev->dev, "spk_ctl_gpio request fail\n"); + goto err; + } + + ret = gpio_get_value(pdata->headset_gpio); + printk(" headset_gpio value : %d\n",ret); + if (ret == 0) + ret = gpio_direction_output(pdata->spk_ctl_gpio,0); + else + ret = gpio_direction_output(pdata->spk_ctl_gpio,1); + if (ret < 0) { + dev_err(&pdev->dev, + "spk_ctl_gpio set direction fail\n"); + goto err; + } + } + /* hook */ ret = of_get_named_gpio_flags(node, "hook_gpio", 0, &pdata->hook_gpio); if (ret < 0) { -- Gitblit v1.6.2