From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/net/rfkill/rfkill-bt.c |  180 ++++++++++--------------------------------------------------
 1 files changed, 30 insertions(+), 150 deletions(-)

diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c
index a2d31bc..73b802c 100644
--- a/kernel/net/rfkill/rfkill-bt.c
+++ b/kernel/net/rfkill/rfkill-bt.c
@@ -25,7 +25,6 @@
 #include <linux/rfkill-bt.h>
 #include <linux/rfkill-wlan.h>
 #include <linux/wakelock.h>
-#include <linux/input.h>
 #include <linux/interrupt.h>
 #include <asm/irq.h>
 #include <linux/suspend.h>
@@ -70,11 +69,9 @@
 	struct wake_lock bt_irq_wl;
 	struct delayed_work bt_sleep_delay_work;
 	int irq_req;
-	bool enable_power_key;
 };
 
 static struct rfkill_rk_data *g_rfkill = NULL;
-static struct input_dev *power_key_dev;
 
 static const char bt_name[] =
 #if defined(CONFIG_BCM4330)
@@ -116,20 +113,6 @@
 #endif
 	;
 
-static int rfkill_rk_power_key_up(void)
-{
-	if (!power_key_dev)
-		return -ENODEV;
-
-	input_report_key(power_key_dev, KEY_POWER, 1);
-	input_sync(power_key_dev);
-	msleep(20);
-	input_report_key(power_key_dev, KEY_POWER, 0);
-	input_sync(power_key_dev);
-
-	return 0;
-}
-
 static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev)
 {
 	struct rfkill_rk_data *rfkill = dev;
@@ -140,16 +123,6 @@
 
 	wake_lock_timeout(&rfkill->bt_irq_wl,
 			  msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT));
-
-	if (rfkill->enable_power_key)
-		return IRQ_WAKE_THREAD;
-
-	return IRQ_HANDLED;
-}
-
-static irqreturn_t rfkill_rk_wake_host_irq_thread(int irq, void *dev)
-{
-	rfkill_rk_power_key_up();
 
 	return IRQ_HANDLED;
 }
@@ -192,12 +165,11 @@
 		LOG("Request irq for bt wakeup host\n");
 		irq->irq = gpio_to_irq(irq->gpio.io);
 		sprintf(irq->name, "%s_irq", irq->gpio.name);
-		ret = request_threaded_irq(irq->irq, rfkill_rk_wake_host_irq,
-					   rfkill_rk_wake_host_irq_thread,
-					   IRQF_ONESHOT | ((irq->gpio.enable == GPIO_ACTIVE_LOW) ?
-					   IRQF_TRIGGER_FALLING :
-					   IRQF_TRIGGER_RISING),
-					   irq->name, rfkill);
+		ret = request_irq(irq->irq, rfkill_rk_wake_host_irq,
+				  (irq->gpio.enable == GPIO_ACTIVE_LOW) ?
+					  IRQF_TRIGGER_FALLING :
+					  IRQF_TRIGGER_RISING,
+				  irq->name, rfkill);
 		if (ret)
 			goto fail2;
 		rfkill->irq_req = 1;
@@ -255,7 +227,6 @@
 {
 	struct rfkill_rk_data *rfkill = g_rfkill;
 	struct rfkill_rk_gpio *wake;
-	bool ret;
 
 	DBG("Enter %s\n", __func__);
 
@@ -270,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);
 
@@ -342,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);
 			}
 		}
 
@@ -354,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)) {
@@ -409,7 +383,6 @@
 	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__);
 
@@ -420,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);
 	}
 
@@ -438,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
 
@@ -450,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__);
 
@@ -466,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);
 	}
 }
 
@@ -514,56 +488,11 @@
 		return -EFAULT;
 
 	DBG("btwrite %c\n", b);
+	/* HCI_DEV_WRITE */
 	if (b != '0')
 		rfkill_rk_sleep_bt(BT_WAKEUP);
 	else
 		rfkill_rk_sleep_bt(BT_SLEEP);
-
-	return count;
-}
-
-static ssize_t bluesleep_read_proc_powerupkey(struct file *file,
-					      char __user *buffer, size_t count,
-					      loff_t *data)
-{
-	struct rfkill_rk_data *rfkill = g_rfkill;
-	char src[2];
-
-	if (*data >= 1)
-		return 0;
-
-	if (!rfkill)
-		return -EFAULT;
-
-	src[0] = rfkill->enable_power_key ? '1' : '0';
-	src[1] = '\n';
-	if (copy_to_user(buffer, src, 2))
-		return -EFAULT;
-	*data = 1;
-
-	return 2;
-}
-
-static ssize_t bluesleep_write_proc_powerupkey(struct file *file,
-					       const char __user *buffer,
-					       size_t count, loff_t *data)
-{
-	char b;
-	struct rfkill_rk_data *rfkill = g_rfkill;
-
-	if (!rfkill)
-		return -EFAULT;
-
-	if (count < 1)
-		return -EINVAL;
-
-	if (copy_from_user(&b, buffer, 1))
-		return -EFAULT;
-
-	if (b != '0')
-		rfkill->enable_power_key = true;
-	else
-		rfkill->enable_power_key = false;
 
 	return count;
 }
@@ -655,50 +584,15 @@
 }
 #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 const struct file_operations bluesleep_powerupkey = {
-	.owner = THIS_MODULE,
-	.read = bluesleep_read_proc_powerupkey,
-	.write = bluesleep_write_proc_powerupkey,
-};
-
-static int rfkill_rk_register_power_key(void)
-{
-	int ret = 0;
-
-	/* register input device */
-	power_key_dev = input_allocate_device();
-	if (!power_key_dev) {
-		LOG("ir_dev: not enough memory for input device\n");
-		return -ENOMEM;
-	}
-
-	power_key_dev->name = "bt-powerkey";
-	power_key_dev->id.bustype = BUS_HOST;
-
-	power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
-	set_bit(KEY_POWER, power_key_dev->keybit);
-
-	ret = input_register_device(power_key_dev);
-	if (ret) {
-		input_free_device(power_key_dev);
-		LOG("ir_rx_init: register input device exception, exit\n");
-		return -EBUSY;
-	}
-
-	return ret;
-}
 
 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,17 +653,9 @@
 	}
 
 	/* 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;
-		goto fail_alloc;
-	}
-
-	/* read/write proc entries */
-	ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey);
-	if (!ent) {
-		LOG("Unable to create /proc/%s/powerupkey entry", PROC_DIR);
 		ret = -ENOMEM;
 		goto fail_alloc;
 	}
@@ -809,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;
@@ -832,16 +720,12 @@
 
 	LOG("%s device registered.\n", pdata->name);
 
-	if (rfkill_rk_register_power_key() != 0)
-		goto fail_rfkill;
-
 	return 0;
 
 fail_rfkill:
 	rfkill_destroy(rfkill->rfkill_dev);
 fail_alloc:
 
-	remove_proc_entry("powerupkey", sleep_dir);
 	remove_proc_entry("btwrite", sleep_dir);
 	remove_proc_entry("lpm", sleep_dir);
 fail_setup_wake_irq:
@@ -860,11 +744,7 @@
 
 	rfkill_unregister(rfkill->rfkill_dev);
 	rfkill_destroy(rfkill->rfkill_dev);
-	remove_proc_entry("powerupkey", sleep_dir);
-	remove_proc_entry("btwrite", sleep_dir);
-	remove_proc_entry("lpm", sleep_dir);
 
-	input_unregister_device(power_key_dev);
 	cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
 
 	// free gpio

--
Gitblit v1.6.2