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;
};