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