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;