From 1f4dc0fe687f74148f03d6ac2ead47c9b45b9463 Mon Sep 17 00:00:00 2001
From: huangcm <1263938474@qq.com>
Date: Sat, 12 Oct 2024 02:38:40 +0000
Subject: [PATCH] fix(tp): fix tp err when close screen

---
 longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c         |  102 ++++++++++++++++++++++++++++++++++++++++++---------
 longan/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c |   10 ++++-
 2 files changed, 92 insertions(+), 20 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
index e50b933..27d2068 100755
--- a/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
+++ b/longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c
@@ -240,10 +240,10 @@
 	msleep(ms);
 
 	gtp_set_int_value(0);
-	msleep(2);
+	msleep(50);
 
 	ctp_wakeup(1, 0);
-	msleep(6);
+	msleep(60);
 
 
 #if GTP_ESD_PROTECT
@@ -289,7 +289,7 @@
 	}
 
 	if(retries >= 2) {
-		printk("%s:I2C retry timeout, reset chip.", __func__);
+		printk("%s:I2C retry timeout, reset chip. \n", __func__);
 	}
 	return ret;
 }
@@ -659,7 +659,7 @@
 }
 
 
-
+static s32 gtp_init_panel(struct goodix_ts_data *ts);
 
 /*******************************************************
 Function:
@@ -708,13 +708,14 @@
  *******************************************************/
 static s8 gtp_wakeup_sleep(struct goodix_ts_data * ts)
 {
-	u8 retry = 0;
-	s8 ret = -1;
-
+	//u8 retry = 0;
+	s8 ret = 0;
+	printk("hcm gtp_wakeup_sleep !\n");
 	gtp_io_init(20);
 	gtp_set_io_int();
 
-#if GTP_POWER_CTRL_SLEEP
+//#if GTP_POWER_CTRL_SLEEP
+#if 0
 	while(retry++ < 5)
 	{
 		ret = gtp_send_cfg(ts->client);
@@ -726,9 +727,31 @@
 	}
 
 	printk("GTP wakeup sleep failed.");
-	return ret;
+
+#endif
+	
+	ret = gtp_i2c_test(ts->client);
+	if (ret < 0){
+		printk("hcm I2C communication ERROR!\n");
+		msleep(50);
+		gtp_set_io_int();
+		ret = gtp_i2c_test(ts->client);
+		if (ret < 0){
+			printk("I2C communication ERROR 2!\n");
+		}
+	}
+
+	ret = gtp_init_panel(ts);
+	if (ret < 0) {
+		printk("GTP init panel failed.\n");
+	}
+
+
+#if GTP_CREATE_WR_NODE
+	init_wr_node(ts->client);
 #endif
 
+	return ret;
 }
 
 
@@ -978,7 +1001,7 @@
 		if (ret > 0) {
 			return ret;
 		}
-		printk("GTP i2c test failed time %d.",retry);
+		printk("GTP i2c test failed time %d. \n",retry);
 		msleep(10);
 	}
 	return ret;
@@ -1060,6 +1083,37 @@
 	return 0;
 }
 
+static int goodix_ts_suspend(struct device *dev);
+static int goodix_ts_resume(struct device *dev);
+extern void gt9xx_resume_extern(void);
+extern void gt9xx_suspend_extern(void);
+struct goodix_ts_data *cur_ts;
+
+void gt9xx_suspend_extern(void)
+{
+	// goodix_ts_suspend(config_info.dev);
+	
+	gtp_irq_disable(cur_ts);
+	cancel_work_sync(&goodix_resume_work);
+	flush_workqueue(goodix_resume_wq);
+	cancel_work_sync(&cur_ts->work);
+	flush_workqueue(goodix_wq);
+
+}
+EXPORT_SYMBOL(gt9xx_suspend_extern);
+
+void gt9xx_resume_extern(void)
+{
+	// goodix_ts_resume(config_info.dev);
+	printk("%s goodix_ts_resume v1\n", goodix_ts_name);
+	__gpio_set_value(config_info.wakeup_gpio.gpio, 1);
+	input_set_power_enable(&(config_info.input_type), 1);
+	msleep(10);
+	// goodix_resume_events
+	queue_work(goodix_resume_wq, &goodix_resume_work);//gandy
+
+}
+EXPORT_SYMBOL(gt9xx_resume_extern);
 
 /*******************************************************
 Function:
@@ -1102,8 +1156,16 @@
 
 
 	ret = gtp_i2c_test(client);
-	if (ret < 0){
-		printk("I2C communication ERROR!\n");
+	if (ret < 0 && client->addr == 0x5d){
+		printk("I2C communication ERROR! reset chip and retry \n");
+		gtp_set_io_int();
+		ret = gtp_i2c_test(client);
+		if (ret < 0){
+			printk("I2C communication ERROR 2!\n");
+			goto exit_device_detect;
+		}
+	} else if (ret < 0) {
+		printk("I2C communication ERROR %02x !\n", client->addr);
 		goto exit_device_detect;
 	}
 
@@ -1165,6 +1227,9 @@
 	queue_delayed_work(gtp_esd_check_workqueue, &gtp_esd_check_work, GTP_ESD_CHECK_CIRCLE); 
 #endif
 	dprintk(DEBUG_INIT, "gt9xx probe success!\n");
+
+	cur_ts = ts;
+
 	return 0;
 exit_device_detect:
 	i2c_set_clientdata(client, NULL);
@@ -1221,7 +1286,7 @@
 {
 	int ret;
 	struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client);
-
+	printk("goodix_resume_events \n");    
 	ret = gtp_wakeup_sleep(ts);
 	if (ret < 0)
 		printk("resume power on failed\n");    	
@@ -1438,11 +1503,11 @@
 	.driver = {
 		.name   = CTP_NAME,
 		.owner  = THIS_MODULE,
-#ifndef CONFIG_HAS_EARLYSUSPEND
-#ifdef CONFIG_PM
-		.pm = GT9XX_PM_OPS,
-#endif
-#endif
+// #ifndef CONFIG_HAS_EARLYSUSPEND
+// #ifdef CONFIG_PM
+// 		.pm = GT9XX_PM_OPS,
+// #endif
+// #endif
 	},
 	.address_list	= normal_i2c,
 };
@@ -1521,6 +1586,7 @@
 	//of_property_read_u32(np, "ctp_exchange_x_y_flag", &exchange_x_y_flag);
 #endif
 	sunxi_gpio_to_name(CTP_IRQ_NUMBER,irq_pin_name);
+	pr_err("gt %s, line:%d irq_pin_name = %s \n",__FUNCTION__, __LINE__, irq_pin_name);
 	gtp_io_init(20);
 
 	goodix_wq = create_singlethread_workqueue("goodix_wq");
diff --git a/longan/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c b/longan/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c
index d00c559..385d3b4 100644
--- a/longan/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c
+++ b/longan/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/dev_disp.c
@@ -2935,6 +2935,9 @@
 	return 0;
 }
 
+extern void gt9xx_resume_extern(void);
+extern void gt9xx_suspend_extern(void);
+
 #if defined(CONFIG_PM_RUNTIME)
 static int disp_runtime_suspend(struct device *dev)
 {
@@ -2945,6 +2948,8 @@
 	struct list_head *disp_list = NULL;
 
 	pr_info("%s\n", __func__);
+
+	gt9xx_suspend_extern();
 
 	if (!g_pm_runtime_enable)
 		return 0;
@@ -2975,7 +2980,7 @@
 	suspend_status |= DISPLAY_LIGHT_SLEEP;
 	suspend_prestep = 0;
 
-	pr_info("%s finish\n", __func__);
+	pr_info("%s finish v2\n", __func__);
 
 	return 0;
 }
@@ -3035,8 +3040,9 @@
 	suspend_prestep = 3;
 
 	disp_resume_cb();
+	gt9xx_resume_extern();
 
-	pr_info("%s finish\n", __func__);
+	pr_info("%s finish 1011 v2\n", __func__);
 
 	return 0;
 }

--
Gitblit v1.6.2