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