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] 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;