From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Thu, 19 Dec 2024 01:47:39 +0000
Subject: [PATCH] add wifi6 8852be driver

---
 kernel/drivers/input/touchscreen/gt1x/gt1x.c |   60 ++++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/kernel/drivers/input/touchscreen/gt1x/gt1x.c b/kernel/drivers/input/touchscreen/gt1x/gt1x.c
index f65ca3b..8c8e06d 100644
--- a/kernel/drivers/input/touchscreen/gt1x/gt1x.c
+++ b/kernel/drivers/input/touchscreen/gt1x/gt1x.c
@@ -33,6 +33,7 @@
 bool gt1x_gt5688;
 int gt1x_rst_gpio;
 int gt1x_int_gpio;
+static bool power_invert;
 #endif
 
 static int gt1x_register_powermanger(void);
@@ -323,9 +324,15 @@
 	gt1x_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0);
 	gt1x_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0);
 
-	if (!gpio_is_valid(gt1x_int_gpio) || !gpio_is_valid(gt1x_rst_gpio)) {
+	if (!gpio_is_valid(gt1x_int_gpio) && !gpio_is_valid(gt1x_rst_gpio)) {
 		GTP_ERROR("Invalid GPIO, irq-gpio:%d, rst-gpio:%d",
 				gt1x_int_gpio, gt1x_rst_gpio);
+		return -EINVAL;
+	}
+
+	if (!gpio_is_valid(gt1x_int_gpio)) {
+		GTP_ERROR("Invalid GPIO, irq-gpio:%d",
+				gt1x_int_gpio);
 		return -EINVAL;
 	}
 
@@ -336,6 +343,9 @@
 		if (PTR_ERR(vdd_ana) == -ENODEV) {
 			GTP_ERROR("power not specified, ignore power ctrl");
 			vdd_ana = NULL;
+		} else {
+			power_invert = of_property_read_bool(np, "power-invert");
+			GTP_INFO("Power Invert,%s ", power_invert ? "yes" : "no");
 		}
 	}
 	if (IS_ERR(vdd_ana)) {
@@ -364,7 +374,7 @@
  */
 int gt1x_power_switch(int on)
 {
-	int ret;
+	int ret = 0;
 	struct i2c_client *client = gt1x_i2c_client;
 
 	if (!client || !vdd_ana)
@@ -372,10 +382,20 @@
 
 	if (on) {
 		GTP_DEBUG("GTP power on.");
-		ret = regulator_enable(vdd_ana);
+		if (power_invert) {
+			if (regulator_is_enabled(vdd_ana) > 0)
+				ret = regulator_disable(vdd_ana);
+		} else {
+			ret = regulator_enable(vdd_ana);
+		}
 	} else {
 		GTP_DEBUG("GTP power off.");
-		ret = regulator_disable(vdd_ana);
+		if (power_invert) {
+			if (!regulator_is_enabled(vdd_ana))
+				ret = regulator_enable(vdd_ana);
+		} else {
+			ret = regulator_disable(vdd_ana);
+		}
 	}
 	return ret;
 }
@@ -411,14 +431,17 @@
 	GTP_GPIO_AS_INT(GTP_INT_PORT);
 	gt1x_i2c_client->irq = GTP_INT_IRQ;
 
-	ret = gpio_request(GTP_RST_PORT, "GTP_RST_PORT");
-	if (ret < 0) {
-		GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32) GTP_RST_PORT, ret);
-		gpio_free(GTP_INT_PORT);
-		return ret;
-	}
+	if (gpio_is_valid(gt1x_rst_gpio)) {
+		ret = gpio_request(GTP_RST_PORT, "GTP_RST_PORT");
+		if (ret < 0) {
+			GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32) GTP_RST_PORT, ret);
+			gpio_free(GTP_INT_PORT);
+			return ret;
+		}
 
 	GTP_GPIO_AS_INPUT(GTP_RST_PORT);
+	}
+
 	return 0;
 }
 
@@ -633,6 +656,18 @@
 }
 
 #if defined(CONFIG_FB)
+#include <linux/async.h>
+
+static void gt1x_resume_async(void *data, async_cookie_t cookie)
+{
+	gt1x_resume();
+}
+
+static void gt1x_suspend_async(void *data, async_cookie_t cookie)
+{
+	gt1x_suspend();
+}
+
 /* frame buffer notifier block control the suspend/resume procedure */
 static struct notifier_block gt1x_fb_notifier;
 static int tp_status;
@@ -663,7 +698,7 @@
 		if (*blank == FB_BLANK_UNBLANK) {
 			tp_status = *blank;
 			GTP_DEBUG("Resume by fb notifier.");
-			gt1x_resume();
+			async_schedule(gt1x_resume_async, NULL);
 		}
 	}
 #endif
@@ -674,7 +709,7 @@
 		if (*blank == FB_BLANK_POWERDOWN) {
 			tp_status = *blank;
 			GTP_DEBUG("Suspend by fb notifier.");
-			gt1x_suspend();
+			async_schedule(gt1x_suspend_async, NULL);
 		}
 	}
 
@@ -807,3 +842,4 @@
 
 MODULE_DESCRIPTION("GTP Series Driver");
 MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);

--
Gitblit v1.6.2