diff options
author | Dudley Du <dudl@cypress.com> | 2016-03-04 11:23:09 -0800 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2016-03-04 11:32:13 -0800 |
commit | 3cd47869431d7402d0613cf0f7fbb392f2b97565 (patch) | |
tree | 295eebb05b77b62f3b64ee8112b83b4e11980198 /drivers/input/mouse/cyapa.h | |
parent | 5186b8c41a89fd071f8d036b41ec4b68fbcf2e4d (diff) | |
download | op-kernel-dev-3cd47869431d7402d0613cf0f7fbb392f2b97565.zip op-kernel-dev-3cd47869431d7402d0613cf0f7fbb392f2b97565.tar.gz |
Input: cyapa - fix for losing events during device power transitions
When changing the scan rate as part of runtime-resume process we may lose
some of the events, because:
1) for gen3 trackpads, the driver must msleep() some time to ensure that
the device is ready to accept next command;
2) for gen5 and later trackpads, the queue dumping function will simply
ignore the events when waiting for the set power mode command response.
The solution is to keep polling and report those valid events when the set
power mode command is in progress.
Signed-off-by: Dudley Du <dudl@cypress.com>
Tested-by: Jeremiah Mahler <jmmahler@gmail.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input/mouse/cyapa.h')
-rw-r--r-- | drivers/input/mouse/cyapa.h | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/input/mouse/cyapa.h b/drivers/input/mouse/cyapa.h index b812bba..ce951fe 100644 --- a/drivers/input/mouse/cyapa.h +++ b/drivers/input/mouse/cyapa.h @@ -250,6 +250,15 @@ struct cyapa; typedef bool (*cb_sort)(struct cyapa *, u8 *, int); +enum cyapa_pm_stage { + CYAPA_PM_DEACTIVE, + CYAPA_PM_ACTIVE, + CYAPA_PM_SUSPEND, + CYAPA_PM_RESUME, + CYAPA_PM_RUNTIME_SUSPEND, + CYAPA_PM_RUNTIME_RESUME, +}; + struct cyapa_dev_ops { int (*check_fw)(struct cyapa *, const struct firmware *); int (*bl_enter)(struct cyapa *); @@ -273,7 +282,7 @@ struct cyapa_dev_ops { int (*sort_empty_output_data)(struct cyapa *, u8 *, int *, cb_sort); - int (*set_power_mode)(struct cyapa *, u8, u16, bool); + int (*set_power_mode)(struct cyapa *, u8, u16, enum cyapa_pm_stage); int (*set_proximity)(struct cyapa *, bool); }; @@ -289,6 +298,9 @@ struct cyapa_pip_cmd_states { u8 *resp_data; int *resp_len; + enum cyapa_pm_stage pm_stage; + struct mutex pm_stage_lock; + u8 irq_cmd_buf[CYAPA_REG_MAP_SIZE]; u8 empty_buf[CYAPA_REG_MAP_SIZE]; }; |