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