From 433150deb9c6c7f48ba1ffd14e822eb3a4224378 Mon Sep 17 00:00:00 2001 From: litong20 Date: Wed, 27 Apr 2022 10:37:31 +0800 Subject: [PATCH] Clear data buffer after releasing connects. 1. Clear data buffer after releasing connects. 2. Filter invalid events during event handler and no longer report. Change-Id: I24ab2257c7f7641188fae7898cd4af7514066905 Reviewed-on: https://gerrit.mot.com/2253924 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Wei Deng Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- .../goodix_berlin_mmi/goodix_brl_hw.c | 10 ++++++---- .../goodix_berlin_mmi/goodix_ts_core.c | 20 +++++++++---------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c index 7f61a8df502b..e231c03cfda7 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c @@ -1199,11 +1199,11 @@ static int brl_event_handler(struct goodix_ts_core *cd, } event_status = pre_buf[0]; - if (event_status & GOODIX_TOUCH_EVENT) + if (event_status & GOODIX_TOUCH_EVENT) { return goodix_touch_handler(cd, ts_event, pre_buf, pre_read_len); - if (event_status & GOODIX_REQUEST_EVENT) { + } else if (event_status & GOODIX_REQUEST_EVENT) { ts_event->event_type = EVENT_REQUEST; if (pre_buf[2] == BRL_REQUEST_CODE_CONFIG) ts_event->request_code = REQUEST_TYPE_CONFIG; @@ -1211,14 +1211,16 @@ static int brl_event_handler(struct goodix_ts_core *cd, ts_event->request_code = REQUEST_TYPE_RESET; else ts_debug("unsupported request code 0x%x", pre_buf[2]); - } - if (event_status & GOODIX_GESTURE_EVENT) { + } else if (event_status & GOODIX_GESTURE_EVENT) { ts_event->event_type = EVENT_GESTURE; ts_event->gesture_type = pre_buf[4]; #ifdef CONFIG_GTP_FOD memcpy(ts_event->gesture_data, &pre_buf[8], GOODIX_GESTURE_DATA_LEN); #endif + } else { + ts_info("Unsupported event status"); + return -EINVAL; } return 0; } diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c index b1226a30b867..39d826040193 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.c @@ -1182,29 +1182,26 @@ static void goodix_ts_report_finger(struct input_dev *dev, { unsigned int touch_num = touch_data->touch_num; int i; -#ifdef CONFIG_GTP_LAST_TIME static uint8_t touchdown[GOODIX_MAX_TOUCH]; -#endif #if defined (CONFIG_GTP_FOD) || defined (CONFIG_GTP_LAST_TIME) struct goodix_ts_core *core_data = goodix_modules.core_data; #endif #ifdef CONFIG_GTP_FOD - struct goodix_ts_event *ts_event = &goodix_modules.core_data ->ts_event; + struct goodix_ts_event *ts_event = &goodix_modules.core_data->ts_event; #endif mutex_lock(&dev->mutex); - for (i = 0; i < GOODIX_MAX_TOUCH; i++) { if (touch_data->coords[i].status == TS_TOUCH) { ts_debug("report: id %d, x %d, y %d, w %d", i, touch_data->coords[i].x, touch_data->coords[i].y, touch_data->coords[i].w); -#ifdef CONFIG_GTP_LAST_TIME if (touchdown[i] == 0) { +#ifdef CONFIG_GTP_LAST_TIME core_data->last_event_time = ktime_get(); ts_debug("TOUCH: [%d] logged timestamp\n", i); +#endif touchdown[i] = 1; } -#endif input_mt_slot(dev, i); input_mt_report_slot_state(dev, MT_TOOL_FINGER, true); input_report_abs(dev, ABS_MT_POSITION_X, @@ -1214,14 +1211,12 @@ static void goodix_ts_report_finger(struct input_dev *dev, input_report_abs(dev, ABS_MT_TOUCH_MAJOR, touch_data->coords[i].w); } else { -#ifdef CONFIG_GTP_LAST_TIME if (touchdown[i] == 1) { ts_debug("TOUCH: [%d] release\n", i); touchdown[i] = 0; + input_mt_slot(dev, i); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, false); } -#endif - input_mt_slot(dev, i); - input_mt_report_slot_state(dev, MT_TOOL_FINGER, false); } } @@ -1884,6 +1879,7 @@ int goodix_ts_esd_init(struct goodix_ts_core *cd) void goodix_ts_release_connects(struct goodix_ts_core *core_data) { struct input_dev *input_dev = core_data->input_dev; + struct goodix_ts_event *ts_event; int i; if (!input_dev) { @@ -1902,6 +1898,10 @@ void goodix_ts_release_connects(struct goodix_ts_core *core_data) input_mt_sync_frame(input_dev); input_sync(input_dev); + /* clean event buffer */ + ts_event = &core_data->ts_event; + memset(ts_event, 0, sizeof(*ts_event)); + mutex_unlock(&input_dev->mutex); }