input: synaptics_dsx: Release KEY_SLEEP immediately on palm-detect

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
diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c
index 20f7e94..4153ba0 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 @@
 			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 @@
 		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 @@
 	}
 
 	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 d30baeb..2572081 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 @@
 	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,