summaryrefslogtreecommitdiff
path: root/ft3658
diff options
context:
space:
mode:
authorMason Wang <masonwang@google.com>2022-04-29 21:54:13 +0800
committerMason Wang <masonwang@google.com>2022-04-29 22:18:19 +0800
commit7f4f9a848ad7899b7e66e62d304fc18f79debd73 (patch)
tree71ac78c0e06c5d2a1a0fb5327cd6eb61e4c6d0cd /ft3658
parent6baf40c270f994703a83d721232ecadc46e2ed13 (diff)
downloadfocaltech_touch-7f4f9a848ad7899b7e66e62d304fc18f79debd73.tar.gz
touch/focaltech: Fix accessing null pointer during shutdown.
Root cause is that touch driver reads heatmap data when user taps on the touch panel during shutdown, but the heatmap relative buffers have been freed, so I move the free processes of heatmap buffers after freeing IRQ. Bug: 230670844 Test: There is no kernel panic to keep a finger on the panel during shutdown. Signed-off-by: Mason Wang <masonwang@google.com> Change-Id: I48d1f1ce8e7c8a24acaca3abbb37a404ecc740dc
Diffstat (limited to 'ft3658')
-rw-r--r--ft3658/focaltech_core.c50
1 files changed, 16 insertions, 34 deletions
diff --git a/ft3658/focaltech_core.c b/ft3658/focaltech_core.c
index fd51988..b4acd6c 100644
--- a/ft3658/focaltech_core.c
+++ b/ft3658/focaltech_core.c
@@ -2907,20 +2907,11 @@ err_heatmap_probe:
#endif
#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) || \
IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
- if (ts_data->trans_raw) {
- kfree_safe(ts_data->trans_raw);
- ts_data->trans_raw = NULL;
- }
+ kfree_safe(ts_data->trans_raw);
err_trans_raw:
- if (ts_data->heatmap_raw) {
- kfree_safe(ts_data->heatmap_raw);
- ts_data->heatmap_raw = NULL;
- }
+ kfree_safe(ts_data->heatmap_raw);
err_heatmap_raw:
- if (ts_data->heatmap_buff) {
- kfree_safe(ts_data->heatmap_buff);
- ts_data->heatmap_buff = NULL;
- }
+ kfree_safe(ts_data->heatmap_buff);
err_heatmap_buff:
#endif
#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
@@ -2970,28 +2961,6 @@ static int fts_ts_remove_entry(struct fts_ts_data *ts_data)
fts_release_apk_debug_channel(ts_data);
fts_remove_sysfs(ts_data);
-#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
- touch_offload_cleanup(&ts_data->offload);
-#endif
-#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) || \
- IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
- if (ts_data->heatmap_buff) {
- kfree_safe(ts_data->heatmap_buff);
- ts_data->heatmap_buff = NULL;
- }
- if (ts_data->heatmap_raw) {
- kfree_safe(ts_data->heatmap_raw);
- ts_data->heatmap_raw = NULL;
- }
- if (ts_data->trans_raw) {
- kfree_safe(ts_data->trans_raw);
- ts_data->trans_raw = NULL;
- }
-#endif
-
-#if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
- heatmap_remove(&ts_data->v4l2);
-#endif
fts_ex_mode_exit(ts_data);
fts_fwupg_exit(ts_data);
@@ -3043,6 +3012,19 @@ static int fts_ts_remove_entry(struct fts_ts_data *ts_data)
unregister_early_suspend(&ts_data->early_suspend);
#endif
+#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD)
+ touch_offload_cleanup(&ts_data->offload);
+#endif
+#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) || \
+ IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
+ kfree_safe(ts_data->heatmap_buff);
+ kfree_safe(ts_data->heatmap_raw);
+ kfree_safe(ts_data->trans_raw);
+#endif
+#if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
+ heatmap_remove(&ts_data->v4l2);
+#endif
+
if (gpio_is_valid(ts_data->pdata->reset_gpio))
gpio_free(ts_data->pdata->reset_gpio);