diff options
author | Artur Pacholec <artur.pacholec@sonymobile.com> | 2014-12-02 16:06:09 +0100 |
---|---|---|
committer | Artur Pacholec <artur.pacholec@sonymobile.com> | 2014-12-04 08:19:57 +0000 |
commit | 23d376ef33aa4c500a5ea24a290f029d5f8e2de3 (patch) | |
tree | 25a825d36b312bd7b184060e545815dffd3af915 | |
parent | b98bb58a6a0a05b75a0a0e9d615d376214aa4c11 (diff) | |
download | bcm-23d376ef33aa4c500a5ea24a290f029d5f8e2de3.tar.gz |
input: synaptics_dsx: Release KEY_SLEEP immediately on palm-detectandroid-wear-5.0.0_r0.5
If the palm was kept for long enough time, the KEY_SLEEP DOWN event was
sent and the touch screen went into doze mode without sending out a
KEY_SLEEP UP event. The event was sent after waking up the touch screen
(KEY_POWER DOWN + UP), confusing it.
Bug: 18608339
Change-Id: I8d588679d516a4f44bd59e6959b884f6f723c173
-rw-r--r-- | drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c | 32 | ||||
-rw-r--r-- | drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h | 1 |
2 files changed, 23 insertions, 10 deletions
diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c index 20f7e94f841..4153ba01cbe 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c @@ -953,6 +953,7 @@ static int synaptics_rmi4_f11_abs_report(struct synaptics_rmi4_data *rmi4_data, input_report_key(rmi4_data->input_dev, key, 0); input_sync(rmi4_data->input_dev); rmi4_data->wg_sent = true; + rmi4_data->wg_ongoing = true; rmi4_data->block_until_no_finger = true; } return 0; @@ -966,16 +967,24 @@ static int synaptics_rmi4_f11_abs_report(struct synaptics_rmi4_data *rmi4_data, return 0; if (rmi4_data->has_large_obj_det) { - retval = synaptics_rmi4_reg_read(rmi4_data, - rmi4_data->f11_data_28, - &data28, sizeof(data28)); - if (retval >= 0) { - dev_dbg(rmi4_data->pdev->dev.parent, - "Large object present = %d", - !!(data28 & 0x02)); - input_report_key(rmi4_data->input_dev, KEY_SLEEP, - !!(data28 & 0x02)); - input_sync(rmi4_data->input_dev); + if (!rmi4_data->wg_ongoing) { + retval = synaptics_rmi4_reg_read(rmi4_data, + rmi4_data->f11_data_28, + &data28, sizeof(data28)); + if (retval >= 0) { + dev_dbg(rmi4_data->pdev->dev.parent, + "Large object present = %d", + !!(data28 & 0x02)); + if (data28 & 0x02) { + input_report_key(rmi4_data->input_dev, + KEY_SLEEP, 1); + input_sync(rmi4_data->input_dev); + + input_report_key(rmi4_data->input_dev, + KEY_SLEEP, 0); + input_sync(rmi4_data->input_dev); + } + } } } @@ -1080,6 +1089,9 @@ static int synaptics_rmi4_f11_abs_report(struct synaptics_rmi4_data *rmi4_data, } if (touch_count == 0) { + if (rmi4_data->wg_ongoing) + rmi4_data->wg_ongoing = false; + input_report_key(rmi4_data->input_dev, BTN_TOUCH, 0); input_report_key(rmi4_data->input_dev, diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h index d30baeb209b..2572081d8b4 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h @@ -292,6 +292,7 @@ struct synaptics_rmi4_data { bool enable_wakeup_gesture; bool wakeup_gesture_active; bool wg_sent; + bool wg_ongoing; bool block_until_no_finger; int (*reset_device)(struct synaptics_rmi4_data *rmi4_data); int (*irq_enable)(struct synaptics_rmi4_data *rmi4_data, bool enable, |