diff options
author | Mason Wang <masonwang@google.com> | 2022-11-24 17:18:04 +0800 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-11-30 23:09:11 +0000 |
commit | 56fd357d58e445c8cbc3d46b41721bc01520afb9 (patch) | |
tree | 8b87f9a21e12397567c779e2d428c6c92d761a79 | |
parent | 63ec4e44762bc2e12721af28021af8f8c2ff5e4f (diff) | |
download | common-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.c | 68 | ||||
-rw-r--r-- | goog_touch_interface.h | 5 |
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(>i->input_lock); mutex_init(>i->manual_sensing_lock); mutex_init(>i->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; |