From e28fcc60c40977222ca2e7d3abaf6d2f6f9305e2 Mon Sep 17 00:00:00 2001 From: Shashank Babu Chinta Venkata Date: Mon, 11 Jan 2021 21:03:49 -0800 Subject: [PATCH 1/2] input: touchscreen: st: cancel pending resume work Before initiating trusted touch, cancel any pending suspend or resume work and wait for already scheduled worker to finish. Change-Id: I9eb89a76e7238bf2ce18d319b9c50f2da784c703 Signed-off-by: Shashank Babu Chinta Venkata --- drivers/input/touchscreen/st/fts.c | 11 ++++++++--- drivers/input/touchscreen/st/fts.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/input/touchscreen/st/fts.c b/drivers/input/touchscreen/st/fts.c index 57f186450c7a..bbe11619fe73 100644 --- a/drivers/input/touchscreen/st/fts.c +++ b/drivers/input/touchscreen/st/fts.c @@ -769,6 +769,7 @@ static void fts_trusted_touch_abort_pvm(struct fts_ts_info *info) case TRUSTED_TOUCH_PVM_INIT: case PVM_I2C_RESOURCE_RELEASED: atomic_set(&info->trusted_touch_enabled, 0); + atomic_set(&info->trusted_touch_underway, 0); } atomic_set(&info->trusted_touch_abort_status, 0); @@ -807,7 +808,8 @@ static int fts_bus_get(struct fts_ts_info *info) { int rc = 0; - flush_workqueue(info->event_wq); + cancel_work_sync(&info->suspend_work); + cancel_work_sync(&info->resume_work); reinit_completion(&info->trusted_touch_powerdown); fts_enable_reg(info, true); mutex_lock(&info->fts_clk_io_ctrl_mutex); @@ -884,6 +886,7 @@ static void fts_trusted_touch_pvm_vm_mode_disable(struct fts_ts_info *info) fts_trusted_touch_set_pvm_driver_state(info, TRUSTED_TOUCH_PVM_INIT); atomic_set(&info->trusted_touch_enabled, 0); + atomic_set(&info->trusted_touch_underway, 0); return; error: fts_trusted_touch_abort_handler(info, @@ -1018,6 +1021,8 @@ static int fts_trusted_touch_pvm_vm_mode_enable(struct fts_ts_info *info) int rc = 0; struct trusted_touch_vm_info *vm_info = info->vm_info; + atomic_set(&info->trusted_touch_underway, 1); + /* i2c session start and resource acquire */ if (fts_bus_get(info) < 0) { dev_err(&info->client->dev, "fts_bus_get failed\n"); @@ -5350,7 +5355,7 @@ static void fts_resume_work(struct work_struct *work) info = container_of(work, struct fts_ts_info, resume_work); #ifdef CONFIG_ST_TRUSTED_TOUCH - if (atomic_read(&info->trusted_touch_enabled)) + if (atomic_read(&info->trusted_touch_underway)) wait_for_completion_interruptible( &info->trusted_touch_powerdown); #endif @@ -5385,7 +5390,7 @@ static void fts_suspend_work(struct work_struct *work) info = container_of(work, struct fts_ts_info, suspend_work); #ifdef CONFIG_ST_TRUSTED_TOUCH - if (atomic_read(&info->trusted_touch_enabled)) + if (atomic_read(&info->trusted_touch_underway)) wait_for_completion_interruptible( &info->trusted_touch_powerdown); #endif diff --git a/drivers/input/touchscreen/st/fts.h b/drivers/input/touchscreen/st/fts.h index 06830dfb35f5..2dbf7e709d38 100644 --- a/drivers/input/touchscreen/st/fts.h +++ b/drivers/input/touchscreen/st/fts.h @@ -416,6 +416,7 @@ struct fts_ts_info { struct clk *core_clk; struct clk *iface_clk; atomic_t trusted_touch_initialized; + atomic_t trusted_touch_underway; atomic_t trusted_touch_enabled; atomic_t trusted_touch_event; atomic_t trusted_touch_abort_status; From 11246e21c35dfab748059de7e7314eab21572ddc Mon Sep 17 00:00:00 2001 From: Shashank Babu Chinta Venkata Date: Mon, 11 Jan 2021 21:11:37 -0800 Subject: [PATCH 2/2] input: touchscreen: focaltech: cancel pending resume work Before initiating trusted touch, cancel any pending suspend or resume work and wait for already scheduled worker to finish. Change-Id: I2a44e4e87eaf544d2190e4c9a125d40d7f9115d7 Signed-off-by: Shashank Babu Chinta Venkata --- .../input/touchscreen/focaltech_touch/focaltech_core.c | 9 +++++++-- .../input/touchscreen/focaltech_touch/focaltech_core.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/focaltech_touch/focaltech_core.c b/drivers/input/touchscreen/focaltech_touch/focaltech_core.c index c48d13d9f7ed..3a696b6f4c9d 100644 --- a/drivers/input/touchscreen/focaltech_touch/focaltech_core.c +++ b/drivers/input/touchscreen/focaltech_touch/focaltech_core.c @@ -744,6 +744,7 @@ static void fts_ts_trusted_touch_abort_pvm(struct fts_ts_data *fts_data) case TRUSTED_TOUCH_PVM_INIT: case PVM_I2C_RESOURCE_RELEASED: atomic_set(&fts_data->trusted_touch_enabled, 0); + atomic_set(&fts_data->trusted_touch_underway, 0); } atomic_set(&fts_data->trusted_touch_abort_status, 0); @@ -779,6 +780,8 @@ static int fts_ts_bus_get(struct fts_ts_data *fts_data) { int rc = 0; + cancel_work_sync(&fts_data->suspend_work); + cancel_work_sync(&fts_data->resume_work); reinit_completion(&fts_data->trusted_touch_powerdown); fts_ts_enable_reg(fts_data, true); mutex_lock(&fts_data->fts_clk_io_ctrl_mutex); @@ -856,6 +859,7 @@ static void fts_trusted_touch_pvm_vm_mode_disable(struct fts_ts_data *fts_data) fts_ts_trusted_touch_set_pvm_driver_state(fts_data, TRUSTED_TOUCH_PVM_INIT); atomic_set(&fts_data->trusted_touch_enabled, 0); + atomic_set(&fts_data->trusted_touch_underway, 0); return; error: fts_ts_trusted_touch_abort_handler(fts_data, @@ -993,6 +997,7 @@ static int fts_ts_trusted_touch_pvm_vm_mode_enable(struct fts_ts_data *fts_data) int rc = 0; struct trusted_touch_vm_info *vm_info = fts_data->vm_info; + atomic_set(&fts_data->trusted_touch_underway, 1); /* i2c session start and resource acquire */ if (fts_ts_bus_get(fts_data) < 0) { FTS_ERROR("fts_ts_bus_get failed\n"); @@ -2864,7 +2869,7 @@ static int fts_ts_suspend(struct device *dev) return 0; } #ifdef CONFIG_FTS_TRUSTED_TOUCH - if (atomic_read(&fts_data->trusted_touch_enabled)) + if (atomic_read(&fts_data->trusted_touch_underway)) wait_for_completion_interruptible( &fts_data->trusted_touch_powerdown); #endif @@ -2910,7 +2915,7 @@ static int fts_ts_resume(struct device *dev) } #ifdef CONFIG_ST_TRUSTED_TOUCH - if (atomic_read(&ts_data->trusted_touch_enabled)) + if (atomic_read(&ts_data->trusted_touch_underway)) wait_for_completion_interruptible( &ts_data->trusted_touch_powerdown); #endif diff --git a/drivers/input/touchscreen/focaltech_touch/focaltech_core.h b/drivers/input/touchscreen/focaltech_touch/focaltech_core.h index 370735397b0e..c87cc52e5e47 100644 --- a/drivers/input/touchscreen/focaltech_touch/focaltech_core.h +++ b/drivers/input/touchscreen/focaltech_touch/focaltech_core.h @@ -295,6 +295,7 @@ struct fts_ts_data { struct clk *iface_clk; atomic_t trusted_touch_initialized; atomic_t trusted_touch_enabled; + atomic_t trusted_touch_underway; atomic_t trusted_touch_event; atomic_t trusted_touch_abort_status; atomic_t delayed_vm_probe_pending;