summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtur Pacholec <artur.pacholec@sonymobile.com>2014-12-02 16:06:09 +0100
committerArtur Pacholec <artur.pacholec@sonymobile.com>2014-12-04 08:19:57 +0000
commit23d376ef33aa4c500a5ea24a290f029d5f8e2de3 (patch)
tree25a825d36b312bd7b184060e545815dffd3af915
parentb98bb58a6a0a05b75a0a0e9d615d376214aa4c11 (diff)
downloadbcm-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.c32
-rw-r--r--drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.h1
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,