From 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c Mon Sep 17 00:00:00 2001
From: lin <lin@kickpi.com>
Date: Thu, 24 Apr 2025 07:46:24 +0000
Subject: [PATCH] feat(touchscreen) add send cfgs to gt9xx support

---
 longan/kernel/linux-4.9/drivers/input/touchscreen/gt9xx/gt9xx.c |   82 ++++++++++++++++++++++++++++++----------
 1 files changed, 61 insertions(+), 21 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 9111b01..88cec31 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
@@ -84,6 +84,7 @@
 static int revert_x_flag = 0;
 static int revert_y_flag = 0;
 static int exchange_x_y_flag = 0;
+static int gtp_send_cfgs = 0;
 static __u32 twi_id = 0;
 static char irq_pin_name[8];
 
@@ -171,6 +172,25 @@
 		dprintk(DEBUG_INIT,"info.exchange_x_y_flag:%d\n",info.exchange_x_y_flag);
 		dprintk(DEBUG_INIT,"info.irq_gpio_number:%d\n",info.irq_gpio.gpio);
 		dprintk(DEBUG_INIT,"info.wakeup_gpio_number:%d\n",info.wakeup_gpio.gpio);
+	}
+}
+
+int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid)
+{
+	struct device_node *np = dev->of_node;
+	struct property *prop;
+	char cfg_name[18];
+
+ //rdzkj add for compatible of different screen by sensor_id
+		snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid);
+		GTP_INFO("get %s",cfg_name);
+		prop = of_find_property(np, cfg_name, cfg_len);
+ //add end
+	 if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) {
+		return -1;/* failed */
+	 } else {
+		memcpy(cfg, prop->value, *cfg_len);
+		return 0;
 	}
 }
 
@@ -345,18 +365,18 @@
 {
 	s32 ret = 0;
 
-#if GTP_DRIVER_SEND_CFG
+if( gtp_send_cfgs == 1 ) {
 	s32 retry = 0;
 
 	for (retry = 0; retry < 5; retry++)
 	{
-		//ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
-		// if (ret > 0)
-		// {
-		// break;
-		// }
+		ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH);
+		if (ret > 0)
+		{
+		break;
+		}
 	}
-#endif
+ }
 
 	return ret;
 }
@@ -768,8 +788,10 @@
 static s32 gtp_init_panel(struct goodix_ts_data *ts)
 {
 	s32 ret = -1;
+if ( gtp_send_cfgs == 1) // Device tree determines whether to send_cfgs
+{
+	GTP_DEBUG("gtp_send_cfgs==1 into send_cfgs");
 
-#if GTP_DRIVER_SEND_CFG
 	s32 i;
 	u8 check_sum = 0;
 	u8 rd_cfg_buf[16];
@@ -870,18 +892,35 @@
 	GTP_DEBUG("gt9xx:index = %d\n",index);
 }
 
-printk("config send_cfg_buf******** \n");
-//index = rd_cfg_buf[GTP_ADDR_LENGTH];
-ts->gtp_cfg_len = cfg_info_len[index];
-GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
+// printk("config send_cfg_buf******** \n");
+// //index = rd_cfg_buf[GTP_ADDR_LENGTH];
+// ts->gtp_cfg_len = cfg_info_len[index];
+// GTP_DEBUG("gandy---SENSOR ID:%d\n", rd_cfg_buf[GTP_ADDR_LENGTH]);
+// memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
+// memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
+
+GTP_DEBUG("Get config data from device tree.");
 memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
-memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[index], ts->gtp_cfg_len);
+ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, 0);
+if (ret < 0) {
+	GTP_ERROR("Failed to parse config data form device tree.");
+	return -1;
+}
 
 #if GTP_CUSTOM_CFG
-config[RESOLUTION_LOC]	   = (u8)GTP_MAX_WIDTH;
-config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8);
-config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT;
-config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8);
+if ( exchange_x_y_flag == 1 ) {
+	config[RESOLUTION_LOC]	   = (u8)screen_max_y;
+	config[RESOLUTION_LOC + 1] = (u8)(screen_max_y>>8);
+	config[RESOLUTION_LOC + 2] = (u8)screen_max_x;
+	config[RESOLUTION_LOC + 3] = (u8)(screen_max_x>>8);
+}
+else {
+	config[RESOLUTION_LOC]	   = (u8)screen_max_x;
+	config[RESOLUTION_LOC + 1] = (u8)(screen_max_x>>8);
+	config[RESOLUTION_LOC + 2] = (u8)screen_max_y;
+	config[RESOLUTION_LOC + 3] = (u8)(screen_max_y>>8);
+}
+
 
 if (GTP_INT_TRIGGER == 0)  //RISING
 {
@@ -900,7 +939,7 @@
 }
 config[ts->gtp_cfg_len] = (~check_sum) + 1;
 
-#else //else DRIVER NEED NOT SEND CONFIG
+}else{ //else DRIVER NEED NOT SEND CONFIG
 
 if(ts->gtp_cfg_len == 0)
 {
@@ -914,7 +953,7 @@
 	ts->abs_y_max = GTP_MAX_HEIGHT;
 	ts->int_trigger_type = GTP_INT_TRIGGER;
 }
-#endif //endif GTP_DRIVER_SEND_CFG
+}
 
 GTP_DEBUG_FUNC();
 
@@ -932,10 +971,10 @@
 ret = gtp_send_cfg(ts->client);
 if (ret < 0)
 {
-	printk("\ngandy-----send config error.ret=%d\n",ret);
+	GTP_DEBUG("\ngandy-----send config error.ret=%d\n",ret);
 	GTP_ERROR("Send config error.");
 }
-printk("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
+GTP_DEBUG("X_MAX = %d,Y_MAX = %d,TRIGGER = 0x%02x",
 		ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type);
 
 msleep(10);
@@ -1588,6 +1627,7 @@
 	of_property_read_u32(np, "ctp_revert_x_flag", &revert_x_flag);
 	of_property_read_u32(np, "ctp_revert_y_flag", &revert_y_flag);
 	of_property_read_u32(np, "ctp_exchange_x_y_flag", &exchange_x_y_flag);
+	of_property_read_u32(np, "gtp_send_cfgs", &gtp_send_cfgs);
 #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);

--
Gitblit v1.6.2