diff options
author | Mason Wang <masonwang@google.com> | 2022-04-29 21:54:13 +0800 |
---|---|---|
committer | Mason Wang <masonwang@google.com> | 2022-04-29 22:18:19 +0800 |
commit | 7f4f9a848ad7899b7e66e62d304fc18f79debd73 (patch) | |
tree | 71ac78c0e06c5d2a1a0fb5327cd6eb61e4c6d0cd /ft3658 | |
parent | 6baf40c270f994703a83d721232ecadc46e2ed13 (diff) | |
download | focaltech_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.c | 50 |
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); |