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