From 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 22 Oct 2024 10:36:11 +0000
Subject: [PATCH] 修改4g拨号为QMI,需要在系统里后台执行quectel-CM

---
 kernel/net/rfkill/rfkill-bt.c |  160 +++++++++--------------------------------------------
 1 files changed, 28 insertions(+), 132 deletions(-)

diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c
index 378fdc9..73b802c 100644
--- a/kernel/net/rfkill/rfkill-bt.c
+++ b/kernel/net/rfkill/rfkill-bt.c
@@ -227,7 +227,6 @@
 {
 	struct rfkill_rk_data *rfkill = g_rfkill;
 	struct rfkill_rk_gpio *wake;
-	bool ret;
 
 	DBG("Enter %s\n", __func__);
 
@@ -242,7 +241,7 @@
 		return;
 	}
 
-	ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
+	cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
 
 	rfkill_rk_sleep_bt_internal(rfkill, sleep);
 
@@ -271,7 +270,8 @@
 
 	return 0;
 }
-static int proc_rk_set_power(void *data, bool blocked)
+
+static int rfkill_rk_set_power(void *data, bool blocked)
 {
 	struct rfkill_rk_data *rfkill = data;
 	struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio;
@@ -313,8 +313,6 @@
 				gpio_direction_output(poweron->io,
 						      poweron->enable);
 				msleep(20);
-				if (gpio_is_valid(wake_host->io))
-					gpio_direction_input(wake_host->io);
 			}
 		}
 
@@ -325,6 +323,11 @@
 				msleep(20);
 				gpio_direction_output(reset->io, reset->enable);
 			}
+		}
+
+		if (gpio_is_valid(wake_host->io)) {
+			LOG("%s: set bt wake_host input!\n", __func__);
+			gpio_direction_input(wake_host->io);
 		}
 
 		if (pinctrl && gpio_is_valid(rts->io)) {
@@ -375,119 +378,11 @@
 	return 0;
 }
 
-
-static int rfkill_rk_set_power(void *data, bool blocked)
-{
-	struct rfkill_rk_data *rfkill = data;
-	struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio;
-	struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio;
-	struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio;
-	struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio;
-	struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
-	int wifi_power = 0;
-	bool toggle = false;
-
-	DBG("Enter %s\n", __func__);
-
-	DBG("Set blocked:%d\n", blocked);
-
-	toggle = rfkill->pdata->power_toggle;
-
-	if (toggle) {
-		if (rfkill_get_wifi_power_state(&wifi_power)) {
-			LOG("%s: cannot get wifi power state!\n", __func__);
-			return -1;
-		}
-	}
-
-	DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false");
-
-	if (!blocked) {
-		if (toggle) {
-			rfkill_set_wifi_bt_power(1);
-			msleep(100);
-		}
-
-		rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup
-
-		if (gpio_is_valid(wake_host->io)) {
-			LOG("%s: set bt wake_host high!\n", __func__);
-			gpio_direction_output(wake_host->io, 1);
-			msleep(20);
-		}
-
-		if (gpio_is_valid(poweron->io)) {
-			if (gpio_get_value(poweron->io) == !poweron->enable) {
-				gpio_direction_output(poweron->io,
-						      !poweron->enable);
-				msleep(20);
-				gpio_direction_output(poweron->io,
-						      poweron->enable);
-				msleep(20);
-				if (gpio_is_valid(wake_host->io))
-					gpio_direction_input(wake_host->io);
-			}
-		}
-
-		if (gpio_is_valid(reset->io)) {
-			if (gpio_get_value(reset->io) == !reset->enable) {
-				gpio_direction_output(reset->io,
-						      !reset->enable);
-				msleep(20);
-				gpio_direction_output(reset->io, reset->enable);
-			}
-		}
-
-		if (pinctrl && gpio_is_valid(rts->io)) {
-			pinctrl_select_state(pinctrl, rts->gpio_state);
-			LOG("ENABLE UART_RTS\n");
-			gpio_direction_output(rts->io, rts->enable);
-			msleep(100);
-			LOG("DISABLE UART_RTS\n");
-			gpio_direction_output(rts->io, !rts->enable);
-			pinctrl_select_state(pinctrl, rts->default_state);
-		}
-
-		bt_power_state = 1;
-		LOG("bt turn on power\n");
-		rfkill_rk_setup_wake_irq(rfkill, 1);
-	} else {
-		if (gpio_is_valid(poweron->io)) {
-			if (gpio_get_value(poweron->io) == poweron->enable) {
-				gpio_direction_output(poweron->io,
-						      poweron->enable);
-				msleep(20);
-			}
-		}
-
-		bt_power_state = 0;
-		LOG("bt shut off power\n");
-		if (gpio_is_valid(reset->io)) {
-			if (gpio_get_value(reset->io) == reset->enable) {
-				gpio_direction_output(reset->io,
-						      reset->enable);
-				msleep(20);
-			}
-		}
-		if (toggle) {
-			if (!wifi_power) {
-				LOG("%s: bt will set vbat to low\n", __func__);
-				rfkill_set_wifi_bt_power(0);
-			} else {
-				LOG("%s: bt shouldn't control the vbat\n", __func__);
-			}
-		}
-	}
-
-	return 0;
-}
-
 static int rfkill_rk_pm_prepare(struct device *dev)
 {
 	struct rfkill_rk_data *rfkill = g_rfkill;
 	struct rfkill_rk_gpio *rts;
 	struct rfkill_rk_irq *wake_host_irq;
-	struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
 
 	DBG("Enter %s\n", __func__);
 
@@ -498,9 +393,9 @@
 	wake_host_irq = &rfkill->pdata->wake_host_irq;
 
 	//To prevent uart to receive bt data when suspended
-	if (pinctrl && gpio_is_valid(rts->io)) {
+	if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) {
 		DBG("Disable UART_RTS\n");
-		pinctrl_select_state(pinctrl, rts->gpio_state);
+		pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state);
 		gpio_direction_output(rts->io, !rts->enable);
 	}
 
@@ -516,7 +411,9 @@
 	}
 
 #ifdef CONFIG_RFKILL_RESET
-	rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
+	rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
+	rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
+	rfkill_set_hw_state(rfkill->rfkill_dev, false);
 	rfkill_rk_set_power(rfkill, BT_BLOCKED);
 #endif
 
@@ -528,7 +425,6 @@
 	struct rfkill_rk_data *rfkill = g_rfkill;
 	struct rfkill_rk_irq *wake_host_irq;
 	struct rfkill_rk_gpio *rts;
-	struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
 
 	DBG("Enter %s\n", __func__);
 
@@ -544,10 +440,10 @@
 		disable_irq_wake(wake_host_irq->irq);
 	}
 
-	if (pinctrl && gpio_is_valid(rts->io)) {
+	if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) {
 		DBG("Enable UART_RTS\n");
 		gpio_direction_output(rts->io, rts->enable);
-		pinctrl_select_state(pinctrl, rts->default_state);
+		pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state);
 	}
 }
 
@@ -594,9 +490,9 @@
 	DBG("btwrite %c\n", b);
 	/* HCI_DEV_WRITE */
 	if (b != '0')
-		proc_rk_set_power(g_rfkill, 0);
+		rfkill_rk_sleep_bt(BT_WAKEUP);
 	else
-		proc_rk_set_power(g_rfkill, 1);
+		rfkill_rk_sleep_bt(BT_SLEEP);
 
 	return count;
 }
@@ -688,16 +584,14 @@
 }
 #endif //CONFIG_OF
 
-static const struct file_operations bluesleep_lpm = {
-	.owner = THIS_MODULE,
-	.read = bluesleep_read_proc_lpm,
-	.write = bluesleep_write_proc_lpm,
+static const struct proc_ops bluesleep_lpm = {
+	.proc_read = bluesleep_read_proc_lpm,
+	.proc_write = bluesleep_write_proc_lpm,
 };
 
-static const struct file_operations bluesleep_btwrite = {
-	.owner = THIS_MODULE,
-	.read = bluesleep_read_proc_btwrite,
-	.write = bluesleep_write_proc_btwrite,
+static const struct proc_ops bluesleep_btwrite = {
+	.proc_read = bluesleep_read_proc_btwrite,
+	.proc_write = bluesleep_write_proc_btwrite,
 };
 
 static int rfkill_rk_probe(struct platform_device *pdev)
@@ -751,7 +645,7 @@
 	}
 
 	/* read/write proc entries */
-	ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm);
+	ent = proc_create("lpm", 0444, sleep_dir, &bluesleep_lpm);
 	if (!ent) {
 		LOG("Unable to create /proc/%s/lpm entry", PROC_DIR);
 		ret = -ENOMEM;
@@ -759,7 +653,7 @@
 	}
 
 	/* read/write proc entries */
-	ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite);
+	ent = proc_create("btwrite", 0444, sleep_dir, &bluesleep_btwrite);
 	if (!ent) {
 		LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR);
 		ret = -ENOMEM;
@@ -801,7 +695,9 @@
 	if (!rfkill->rfkill_dev)
 		goto fail_alloc;
 
-	rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
+	rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
+	rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
+	rfkill_set_hw_state(rfkill->rfkill_dev, false);
 	ret = rfkill_register(rfkill->rfkill_dev);
 	if (ret < 0)
 		goto fail_rfkill;

--
Gitblit v1.6.2