touch: sec: add mutex to protect offload report
When the release_all_fingers and offload_report run at the same time,
it may cause the input report conflict before input sync.
bug: 190460965
Test: flash boot.img and vendor_boot.img.
Signed-off-by: davidycchen <[email protected]>
Change-Id: Ib3a1f8970f15dc28a73dece18b5307cb5deba220
diff --git a/sec_ts.c b/sec_ts.c
index 5d05f73..32b5d1d 100644
--- a/sec_ts.c
+++ b/sec_ts.c
@@ -2419,7 +2419,7 @@
switch (status_data_1) {
case 0x20:
/* watchdog reset !? */
- sec_ts_unlocked_release_all_finger(ts);
+ sec_ts_locked_release_all_finger(ts);
ret = sec_ts_write(ts,
SEC_TS_CMD_SENSE_ON, NULL, 0);
if (ret < 0)
@@ -2433,14 +2433,14 @@
input_info(true, &ts->client->dev,
"%s: sw_reset done\n",
__func__);
- sec_ts_unlocked_release_all_finger(ts);
+ sec_ts_locked_release_all_finger(ts);
complete_all(&ts->boot_completed);
break;
case 0x10:
input_info(true, &ts->client->dev,
"%s: hw_reset done\n",
__func__);
- sec_ts_unlocked_release_all_finger(ts);
+ sec_ts_locked_release_all_finger(ts);
complete_all(&ts->boot_completed);
break;
default:
@@ -2456,7 +2456,7 @@
input_err(true, &ts->client->dev,
"%s: IC Event Queue is full\n",
__func__);
- sec_ts_unlocked_release_all_finger(ts);
+ sec_ts_locked_release_all_finger(ts);
}
if ((p_event_status->stype ==
@@ -2485,21 +2485,27 @@
}
#ifdef SEC_TS_SUPPORT_CUSTOMLIB
+ mutex_lock(&ts->eventlock);
sec_ts_handle_lib_status_event(ts, p_event_status);
+ mutex_unlock(&ts->eventlock);
#endif
break;
case SEC_TS_COORDINATE_EVENT:
processed_pointer_event = true;
+ mutex_lock(&ts->eventlock);
sec_ts_handle_coord_event(ts,
(struct sec_ts_event_coordinate *)event_buff);
+ mutex_unlock(&ts->eventlock);
break;
case SEC_TS_GESTURE_EVENT:
p_gesture_status =
(struct sec_ts_gesture_status *)event_buff;
#ifdef SEC_TS_SUPPORT_CUSTOMLIB
+ mutex_lock(&ts->eventlock);
sec_ts_handle_gesture_event(ts, p_gesture_status);
+ mutex_unlock(&ts->eventlock);
#endif
break;
@@ -2518,8 +2524,9 @@
#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
if (!ts->offload.offload_running) {
#endif
-
+ mutex_lock(&ts->eventlock);
input_sync(ts->input_dev);
+ mutex_unlock(&ts->eventlock);
#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
}
@@ -2628,12 +2635,8 @@
pm_qos_update_request(&ts->pm_qos_req, 100);
pm_wakeup_event(&ts->client->dev, MSEC_PER_SEC);
- mutex_lock(&ts->eventlock);
-
sec_ts_read_event(ts);
- mutex_unlock(&ts->eventlock);
-
#if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
/* Disable the firmware motion filter during single touch */
update_motion_filter(ts);
@@ -2654,6 +2657,8 @@
bool touch_down = 0;
int i;
+ mutex_lock(&ts->eventlock);
+
input_set_timestamp(ts->input_dev, report->timestamp);
for (i = 0; i < MAX_COORDS; i++) {
@@ -2697,6 +2702,8 @@
input_report_key(ts->input_dev, BTN_TOUCH, touch_down);
input_sync(ts->input_dev);
+
+ mutex_unlock(&ts->eventlock);
}
#endif /* CONFIG_TOUCHSCREEN_OFFLOAD */
@@ -4144,7 +4151,6 @@
#endif
input_report_key(ts->input_dev, KEY_HOMEPAGE, 0);
input_sync(ts->input_dev);
-
}
void sec_ts_locked_release_all_finger(struct sec_ts_data *ts)