From f8c23d1415aad662de5acfa33671b5d14d2c1300 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Wed, 15 Mar 2023 09:58:59 +0000 Subject: [PATCH] 修复hp / spk自动切换 --- kernel/drivers/headset_observe/rk_headset.c | 10 ++++++++++ kernel/drivers/headset_observe/rockchip_headset_core.c | 29 +++++++++++++++++++++++++++++ kernel/drivers/headset_observe/rk_headset.h | 1 + kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi | 7 ++++--- kernel/drivers/misc/nkio/nk_io_core.c | 3 ++- 5 files changed, 46 insertions(+), 4 deletions(-) diff --git a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi index e432a7c..a91435a 100755 --- a/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi +++ b/kernel/arch/arm64/boot/dts/rockchip/NK-R36S0.dtsi @@ -19,6 +19,7 @@ rk_headset: rk-headset { compatible = "rockchip_headset"; headset_gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_LOW>; + spk_ctl_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>;//AMP_SD_GPIO4_C2_3V3 pinctrl-names = "default"; pinctrl-0 = <&hp_det>; }; @@ -101,7 +102,7 @@ air_mode_4g_gpio = <&gpio1 RK_PB0 GPIO_ACTIVE_HIGH>; //4G_AIR_MODE_GPIO01_B0_3V3 wake_4g_gpio = <&gpio1 RK_PB1 GPIO_ACTIVE_HIGH>; //4G_WAKEUP_GPIO01_B1_3V3 hp_en_gpio = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>;//HP_EN_GPIO3_A6_3V3 - spk_out_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>;//AMP_SD_GPIO4_C2_3V3 +// spk_out_gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>;//AMP_SD_GPIO4_C2_3V3 wifi_power_en_gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; //WIFI_PWREN_GPIO3_C6_1V8 // pcie_power_en_gpio = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;//PCIE_PWREN_H_GPIO0_D4 pinctrl-names = "default"; @@ -543,7 +544,8 @@ // }; headphone { hp_det: hp-det { - rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>; + rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>, + <4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; }; }; @@ -578,7 +580,6 @@ <1 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>, <1 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>, <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>, - <4 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>, <3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>, <3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>, <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>, diff --git a/kernel/drivers/headset_observe/rk_headset.c b/kernel/drivers/headset_observe/rk_headset.c index 5b16db7..54d4af1 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; @@ -182,6 +183,11 @@ 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,0); + 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 +202,10 @@ goto out; } } else if (headset_info->headset_status == HEADSET_OUT) { + ret = gpio_direction_output(pdata->spk_ctl_gpio,1); + 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/rockchip_headset_core.c b/kernel/drivers/headset_observe/rockchip_headset_core.c index 3c2eeb7..de4f548 100644 --- a/kernel/drivers/headset_observe/rockchip_headset_core.c +++ b/kernel/drivers/headset_observe/rockchip_headset_core.c @@ -73,6 +73,35 @@ 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) { diff --git a/kernel/drivers/misc/nkio/nk_io_core.c b/kernel/drivers/misc/nkio/nk_io_core.c index b9db2bd..7df3022 100755 --- a/kernel/drivers/misc/nkio/nk_io_core.c +++ b/kernel/drivers/misc/nkio/nk_io_core.c @@ -319,7 +319,7 @@ } } - +/* //spk_out_gpio ret = of_get_named_gpio_flags(node, "spk_out_gpio", 0, &flags); if (ret < 0) { @@ -336,6 +336,7 @@ printk("%s() gpio_direction_output spk_out_gpio set ERROR\n", __FUNCTION__); } } +*/ //air_mode_4g_gpio ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags); if (ret < 0) { -- Gitblit v1.6.2