summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMason Wang <masonwang@google.com>2022-11-24 17:18:04 +0800
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-11-30 23:09:11 +0000
commit56fd357d58e445c8cbc3d46b41721bc01520afb9 (patch)
tree8b87f9a21e12397567c779e2d428c6c92d761a79
parent63ec4e44762bc2e12721af28021af8f8c2ff5e4f (diff)
downloadcommon-56fd357d58e445c8cbc3d46b41721bc01520afb9.tar.gz
touch/gti: Only handle display state if changed
The display driver has new power control design for refresh rate, clock and bus. So panel_bridge_enable/panel_bridge_disable will be called frequently. But the touch driver only needs to handle display state if changed. Bug: 253330479 Test: Build pass. Signed-off-by: Mason Wang <masonwang@google.com> Change-Id: Ide46b623c51240fed0755b123c7ff9026b15e040
-rw-r--r--goog_touch_interface.c68
-rw-r--r--goog_touch_interface.h5
2 files changed, 43 insertions, 30 deletions
diff --git a/goog_touch_interface.c b/goog_touch_interface.c
index 3237b37..8a55016 100644
--- a/goog_touch_interface.c
+++ b/goog_touch_interface.c
@@ -21,6 +21,8 @@ static u8 gti_dev_num;
* GTI/common: forward declarations, structures and functions.
*/
static void goog_offload_set_running(struct goog_touch_interface *gti, bool running);
+static void goog_set_display_state(struct goog_touch_interface *gti,
+ enum gti_display_state_setting display_state);
/*-----------------------------------------------------------------------------
* GTI/sysfs: forward declarations, structures and functions.
@@ -1250,7 +1252,6 @@ void gti_debug_input_dump(struct goog_touch_interface *gti)
*/
static void panel_bridge_enable(struct drm_bridge *bridge)
{
- int ret = 0;
struct goog_touch_interface *gti =
container_of(bridge, struct goog_touch_interface, panel_bridge);
@@ -1259,19 +1260,11 @@ static void panel_bridge_enable(struct drm_bridge *bridge)
return;
}
- GOOG_INFO("screen-on.\n");
-
- goog_pm_wake_lock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON, false);
-
- gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_ON;
- ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
- if (ret && ret != -EOPNOTSUPP)
- GOOG_WARN("unexpected vendor_cmd return(%d)!\n", ret);
+ goog_set_display_state(gti, GTI_DISPLAY_STATE_ON);
}
static void panel_bridge_disable(struct drm_bridge *bridge)
{
- int ret = 0;
struct goog_touch_interface *gti =
container_of(bridge, struct goog_touch_interface, panel_bridge);
@@ -1282,14 +1275,7 @@ static void panel_bridge_disable(struct drm_bridge *bridge)
return;
}
- GOOG_INFO("screen-off.\n");
-
- goog_pm_wake_unlock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON);
-
- gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_OFF;
- ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
- if (ret && ret != -EOPNOTSUPP)
- GOOG_WARN("unexpected vendor_cmd return(%d)!\n", ret);
+ goog_set_display_state(gti, GTI_DISPLAY_STATE_OFF);
}
struct drm_connector *get_bridge_connector(struct drm_bridge *bridge)
@@ -1334,16 +1320,10 @@ static void panel_bridge_mode_set(struct drm_bridge *bridge,
GOOG_INFO("panel_is_lp_mode changed from %d to %d.\n",
gti->panel_is_lp_mode, panel_is_lp_mode);
- if (panel_is_lp_mode) {
- goog_pm_wake_unlock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON);
- gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_OFF;
- } else {
- goog_pm_wake_lock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON, false);
- gti->cmd.display_state_cmd.setting = GTI_DISPLAY_STATE_ON;
- }
- ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
- if (ret && ret != -EOPNOTSUPP)
- GOOG_WARN("unexpected return(%d)!", ret);
+ if (panel_is_lp_mode)
+ goog_set_display_state(gti, GTI_DISPLAY_STATE_OFF);
+ else
+ goog_set_display_state(gti, GTI_DISPLAY_STATE_ON);
}
gti->panel_is_lp_mode = panel_is_lp_mode;
@@ -1406,6 +1386,37 @@ static void unregister_panel_bridge(struct drm_bridge *bridge)
/*-----------------------------------------------------------------------------
* GTI: functions.
*/
+static void goog_set_display_state(struct goog_touch_interface *gti,
+ enum gti_display_state_setting display_state)
+{
+ int ret = 0;
+
+ if (gti->display_state == display_state)
+ return;
+
+ switch (display_state) {
+ case GTI_DISPLAY_STATE_OFF:
+ GOOG_INFO("screen-off.\n");
+ goog_pm_wake_unlock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON);
+
+ break;
+ case GTI_DISPLAY_STATE_ON:
+ GOOG_INFO("screen-on.\n");
+ goog_pm_wake_lock(gti, GTI_PM_WAKELOCK_TYPE_SCREEN_ON, false);
+
+ break;
+ default:
+ GOOG_ERR("Unexpected value(0x%X) of display state parameter.\n",
+ display_state);
+ return;
+ }
+ gti->display_state = display_state;
+ gti->cmd.display_state_cmd.setting = display_state;
+ ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_STATE);
+ if (ret && ret != -EOPNOTSUPP)
+ GOOG_WARN("Unexpected vendor_cmd return(%d)!\n", ret);
+}
+
bool goog_check_spi_dma_enabled(struct spi_device *spi_dev)
{
bool ret = false;
@@ -3037,6 +3048,7 @@ struct goog_touch_interface *goog_touch_interface_probe(
gti->vendor_default_handler = default_handler;
gti->mf_mode = GTI_MF_MODE_DEFAULT;
gti->screen_protector_mode_setting = GTI_SCREEN_PROTECTOR_MODE_DISABLE;
+ gti->display_state = GTI_DISPLAY_STATE_ON;
mutex_init(&gti->input_lock);
mutex_init(&gti->manual_sensing_lock);
mutex_init(&gti->input_process_lock);
diff --git a/goog_touch_interface.h b/goog_touch_interface.h
index c2b49d7..1ed774a 100644
--- a/goog_touch_interface.h
+++ b/goog_touch_interface.h
@@ -569,6 +569,7 @@ struct goog_touch_interface {
ktime_t mf_downtime;
int display_vrefresh;
+ enum gti_display_state_setting display_state;
enum gti_mf_mode mf_mode;
enum gti_mf_state mf_state;
enum gti_screen_protector_mode screen_protector_mode_setting;
@@ -588,8 +589,8 @@ struct goog_touch_interface {
bool wakeup_before_force_active_enabled;
unsigned int wakeup_before_force_active_delay;
union {
- u8 offload_id_byte[4];
- u32 offload_id;
+ u8 offload_id_byte[4];
+ u32 offload_id;
};
u8 *heatmap_buf;
u32 heatmap_buf_size;