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