touch/common: GTI support vendor device pm notification.

Bug: 201610482
Bug: 232030989
Signed-off-by: Super Liu <supercjliu@google.com>
Change-Id: I5647ece259d0df91405f101f5f01be9135133e53
diff --git a/goog_touch_interface.c b/goog_touch_interface.c
index 34f8f53..9e50500 100644
--- a/goog_touch_interface.c
+++ b/goog_touch_interface.c
@@ -95,16 +95,28 @@
 
 	if (gti->panel_is_lp_mode) {
 		GOOG_LOG("skip screen-on because of panel_is_lp_mode enabled!\n");
-	} else {
-		if (gti->tbn_register_mask)
-			tbn_request_bus(gti->tbn_register_mask);
-
-		GOOG_LOG("screen-on.\n");
-		gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_ON;
-		ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
-		if (ret)
-			GOOG_WARN("unexpected return(%d)!", ret);
+		return;
 	}
+
+	GOOG_LOG("screen-on.\n");
+	if (gti->pm_state == GTI_RESUME) {
+		GOOG_WARN("GTI already resumed!\n");
+		return;
+	}
+	if (gti->vendor_dev_pm_state == GTI_VENDOR_DEV_RESUME) {
+		GOOG_WARN("unexpected vendor_dev_pm_state(%d)!\n",
+			gti->vendor_dev_pm_state);
+	}
+	if (gti->tbn_register_mask) {
+		ret = tbn_request_bus(gti->tbn_register_mask);
+		if (ret)
+			GOOG_ERR("tbn_request_bus failed, ret %d!\n", ret);
+	}
+	gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_ON;
+	ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
+	if (ret)
+		GOOG_WARN("unexpected vendor_cmd return(%d)!\n", ret);
+	gti->pm_state = GTI_RESUME;
 }
 
 static void panel_bridge_disable(struct drm_bridge *bridge)
@@ -121,13 +133,17 @@
 	}
 
 	GOOG_LOG("screen-off.\n");
+	if (gti->pm_state == GTI_SUSPEND) {
+		GOOG_WARN("GTI already suspended!\n");
+		return;
+	}
+	if (gti->vendor_dev_pm_state == GTI_VENDOR_DEV_SUSPEND)
+		GOOG_WARN("unexpected vendor_dev_pm_state(%d)!\n", gti->vendor_dev_pm_state);
 	gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_OFF;
 	ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
 	if (ret)
-		GOOG_WARN("unexpected return(%d)!", ret);
-
-	if (gti->tbn_register_mask)
-		tbn_release_bus(gti->tbn_register_mask);
+		GOOG_WARN("unexpected vendor_cmd return(%d)!\n", ret);
+	gti->pm_state = GTI_SUSPEND;
 }
 
 struct drm_connector *get_bridge_connector(struct drm_bridge *bridge)
@@ -996,6 +1012,28 @@
 	}
 }
 
+void goog_notify_vendor_dev_pm_state_done(struct goog_touch_interface *gti,
+		enum gti_vendor_dev_pm_state state)
+{
+	int ret = 0;
+
+	if (!gti)
+		return;
+
+	if (gti->vendor_dev_pm_state != state) {
+		GOOG_LOG("pm state changed: %d -> %d.\n",
+			gti->vendor_dev_pm_state, state);
+		gti->vendor_dev_pm_state = state;
+	}
+	if (gti->tbn_register_mask &&
+		gti->vendor_dev_pm_state == GTI_VENDOR_DEV_SUSPEND) {
+		ret = tbn_release_bus(gti->tbn_register_mask);
+		if (ret)
+			GOOG_ERR("tbn_release_bus failed, ret %d!\n", ret);
+	}
+}
+EXPORT_SYMBOL(goog_notify_vendor_dev_pm_state_done);
+
 struct goog_touch_interface *goog_touch_interface_probe(
 		void *private_data,
 		struct device *dev,
diff --git a/goog_touch_interface.h b/goog_touch_interface.h
index ddc7f25..7f0941d 100644
--- a/goog_touch_interface.h
+++ b/goog_touch_interface.h
@@ -36,7 +36,7 @@
  *   GTI_MF_STATE_FILTERED_LOCKED: filtered coordinates. Locked until
  *                                 touch is lifted or timeout.
  */
-enum {
+enum gti_mf_state : u32 {
 	GTI_MF_STATE_FILTERED = 0,
 	GTI_MF_STATE_UNFILTERED,
 	GTI_MF_STATE_FILTERED_LOCKED,
@@ -49,7 +49,7 @@
  *   GTI_MF_MODE_FILTER: only report touch if coord report changed.
  *   GTI_MF_MODE_AUTO: for development case.
  */
-enum {
+enum gti_mf_mode : u32 {
 	GTI_MF_MODE_UNFILTER = 0,
 	GTI_MF_MODE_DEFAULT,
 	GTI_MF_MODE_DYNAMIC = GTI_MF_MODE_DEFAULT,
@@ -95,6 +95,16 @@
 	GTI_DISPLAY_STATE_ON,
 };
 
+enum gti_vendor_dev_pm_state : u32 {
+	GTI_VENDOR_DEV_RESUME = 0,
+	GTI_VENDOR_DEV_SUSPEND,
+};
+
+enum gti_pm_state : u32 {
+	GTI_RESUME = 0,
+	GTI_SUSPEND,
+};
+
 struct gti_sensor_data_cmd {
 	enum gti_sensor_data_type type;
 	u8 *buffer;
@@ -180,6 +190,8 @@
  * @palm_setting: current palm setting.
  * @mf_mode: current motion filter mode.
  * @mf_state: current motion filter state.
+ * @vendor_dev_pm_state: vendor device pm state.
+ * @pm_state: GTI device pm state.
  * @tbn_register_mask: the tbn_mask that used to request/release touch bus.
  * @panel_is_lp_mode: display is in low power mode.
  * @force_legacy_report: force to directly report input by kernel input API.
@@ -214,10 +226,12 @@
 	ktime_t mf_downtime;
 
 	int display_vrefresh;
-	u32 grip_setting;
-	u32 palm_setting;
-	u32 mf_mode;
-	u32 mf_state;
+	enum gti_grip_setting grip_setting;
+	enum gti_palm_setting palm_setting;
+	enum gti_mf_mode mf_mode;
+	enum gti_mf_state mf_state;
+	enum gti_vendor_dev_pm_state vendor_dev_pm_state;
+	enum gti_pm_state pm_state;
 	u32 tbn_register_mask;
 
 	bool panel_is_lp_mode;
@@ -261,6 +275,9 @@
 		struct input_dev *dev, unsigned int code, int value);
 inline void goog_input_sync(struct goog_touch_interface *gti, struct input_dev *dev);
 
+void goog_notify_vendor_dev_pm_state_done(
+		struct goog_touch_interface *gti,
+		enum gti_vendor_dev_pm_state state);
 int goog_process_vendor_cmd(struct goog_touch_interface *gti, enum gti_cmd_type cmd_type);
 int goog_input_process(struct goog_touch_interface *gti);
 struct goog_touch_interface *goog_touch_interface_probe(
diff --git a/goog_touch_interface_nop.h b/goog_touch_interface_nop.h
index 88ed9ac..259cee7 100644
--- a/goog_touch_interface_nop.h
+++ b/goog_touch_interface_nop.h
@@ -15,6 +15,11 @@
 	GTI_CMD_NOP,
 };
 
+enum gti_vendor_dev_pm_state : u32 {
+	GTI_VENDOR_DEV_RESUME = 0,
+	GTI_VENDOR_DEV_SUSPEND,
+};
+
 struct gti_union_cmd_data {
 	u32 nop_cmd;
 };
@@ -76,6 +81,12 @@
 	return 0;
 }
 
+static inline void goog_notify_vendor_dev_pm_state_done(
+	struct goog_touch_interface *gti,
+	enum gti_vendor_dev_pm_state state)
+{
+}
+
 struct gti_optional_configuration {
 	u32 reserve;
 };