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, >p_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