summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidycchen <davidycchen@google.com>2023-01-31 17:23:50 +0800
committerYen-Chao Chen <davidycchen@google.com>2023-02-09 01:39:29 +0000
commit40fbfb7c32ec60dc1300892cbdc737df1408b188 (patch)
tree29df8b802807560bb502f8fa7f3c2ad97c21aa9c
parentd82fb35b00313c502502d8cee7fc2ae67193e4b1 (diff)
downloadcommon-40fbfb7c32ec60dc1300892cbdc737df1408b188.tar.gz
gti: update driver status for touch_offload
Update the driver context for touch_offload and clear after the data was populated. Bug: 265870152 Test: build pass. Change-Id: I2730c6e74b6574d23faeed9493ec5dc1d54d4500 Signed-off-by: davidycchen <davidycchen@google.com>
-rw-r--r--goog_touch_interface.c50
-rw-r--r--goog_touch_interface.h24
2 files changed, 60 insertions, 14 deletions
diff --git a/goog_touch_interface.c b/goog_touch_interface.c
index 0ceb899..681c45c 100644
--- a/goog_touch_interface.c
+++ b/goog_touch_interface.c
@@ -1718,6 +1718,7 @@ static void panel_bridge_mode_set(struct drm_bridge *bridge,
vrefresh, gti->display_vrefresh);
gti->display_vrefresh = vrefresh;
gti->cmd.display_vrefresh_cmd.setting = vrefresh;
+ gti->context_changed.display_refresh_rate = 1;
ret = goog_process_vendor_cmd(gti, GTI_CMD_NOTIFY_DISPLAY_VREFRESH);
if (ret && ret != -EOPNOTSUPP)
GOOG_WARN(gti, "unexpected return(%d)!", ret);
@@ -2060,6 +2061,23 @@ void goog_v4l2_read(struct goog_touch_interface *gti, ktime_t timestamp)
heatmap_read(&gti->v4l2, ktime_to_ns(timestamp));
}
+int goog_get_driver_status(struct goog_touch_interface *gti,
+ struct gti_context_driver_cmd *driver_cmd)
+{
+ driver_cmd->context_changed.value = gti->context_changed.value;
+ driver_cmd->screen_state = gti->pm.state;
+ driver_cmd->display_refresh_rate = gti->display_vrefresh;
+ driver_cmd->touch_report_rate = gti->report_rate_setting;
+ driver_cmd->noise_state = gti->fw_status.noise_level;
+ driver_cmd->water_mode = gti->fw_status.water_mode;
+ driver_cmd->offload_timestamp = ktime_get();
+
+ gti->context_changed.offload_timestamp = 1;
+
+ /* vendor driver overwrite the context */
+ return goog_process_vendor_cmd(gti, GTI_CMD_GET_CONTEXT_DRIVER);
+}
+
void goog_offload_populate_coordinate_channel(struct goog_touch_interface *gti,
struct touch_offload_frame *frame, int channel)
{
@@ -2139,18 +2157,26 @@ static void goog_offload_populate_driver_status_channel(
ds->header.channel_type = (u32)CONTEXT_CHANNEL_TYPE_DRIVER_STATUS;
ds->header.channel_size = sizeof(struct TouchOffloadDriverStatus);
- ds->contents.screen_state = driver_cmd->contents.screen_state;
+ ds->contents.screen_state = driver_cmd->context_changed.screen_state;
ds->screen_state = driver_cmd->screen_state;
- ds->contents.display_refresh_rate =
- driver_cmd->contents.display_refresh_rate;
+ ds->contents.display_refresh_rate = driver_cmd->context_changed.display_refresh_rate;
ds->display_refresh_rate = driver_cmd->display_refresh_rate;
- ds->contents.touch_report_rate = driver_cmd->contents.touch_report_rate;
+ ds->contents.touch_report_rate = driver_cmd->context_changed.touch_report_rate;
ds->touch_report_rate = driver_cmd->touch_report_rate;
- ds->contents.offload_timestamp = driver_cmd->contents.offload_timestamp;
+ ds->contents.noise_state = driver_cmd->context_changed.noise_state;
+ ds->noise_state = driver_cmd->noise_state;
+
+ ds->contents.water_mode = driver_cmd->context_changed.water_mode;
+ ds->water_mode = driver_cmd->water_mode;
+
+ ds->contents.offload_timestamp = driver_cmd->context_changed.offload_timestamp;
ds->offload_timestamp = driver_cmd->offload_timestamp;
+
+ /* Clean up contents after updating the data. */
+ gti->context_changed.value = 0;
}
static void goog_offload_populate_stylus_status_channel(
@@ -2256,7 +2282,7 @@ void goog_offload_populate_frame(struct goog_touch_interface *gti,
cmd->size = 0;
if (channel_type == CONTEXT_CHANNEL_TYPE_DRIVER_STATUS) {
ATRACE_BEGIN("populate driver context");
- ret = goog_process_vendor_cmd(gti, GTI_CMD_GET_CONTEXT_DRIVER);
+ ret = goog_get_driver_status(gti, &gti->cmd.context_driver_cmd);
if (ret == 0)
goog_offload_populate_driver_status_channel(
gti, frame, i,
@@ -3292,6 +3318,8 @@ static void goog_pm_suspend(struct gti_pm *pm)
if (pm->suspend)
pm->suspend(gti->vendor_dev);
+ gti->context_changed.screen_state = 1;
+
if (gti->tbn_register_mask) {
ret = tbn_release_bus(gti->tbn_register_mask);
if (ret)
@@ -3330,6 +3358,8 @@ static void goog_pm_resume(struct gti_pm *pm)
if (pm->resume)
pm->resume(gti->vendor_dev);
+
+ gti->context_changed.screen_state = 1;
}
void goog_pm_state_update_work(struct work_struct *work) {
@@ -3398,9 +3428,13 @@ void goog_notify_fw_status_changed(struct goog_touch_interface *gti,
break;
case GTI_FW_STATUS_WATER_ENTER:
GOOG_INFO(gti, "Enter water mode\n");
+ gti->fw_status.water_mode = 1;
+ gti->context_changed.water_mode = 1;
break;
case GTI_FW_STATUS_WATER_EXIT:
GOOG_INFO(gti, "Exit water mode\n");
+ gti->fw_status.water_mode = 0;
+ gti->context_changed.water_mode = 1;
break;
case GTI_FW_STATUS_NOISE_MODE:
if (data == NULL) {
@@ -3408,9 +3442,12 @@ void goog_notify_fw_status_changed(struct goog_touch_interface *gti,
} else {
if (data->noise_level == GTI_NOISE_MODE_EXIT) {
GOOG_INFO(gti, "Exit noise mode\n");
+ gti->fw_status.noise_level= 0;
} else {
GOOG_INFO(gti, "Enter noise mode, level: %d\n", data->noise_level);
+ gti->fw_status.noise_level = data->noise_level;
}
+ gti->context_changed.noise_state = 1;
}
break;
default:
@@ -3521,6 +3558,7 @@ static void goog_set_report_rate_work(struct work_struct *work)
}
gti->report_rate_setting = gti->report_rate_setting_next;
+ gti->context_changed.touch_report_rate = 1;
}
static int goog_init_variable_report_rate(struct goog_touch_interface *gti)
diff --git a/goog_touch_interface.h b/goog_touch_interface.h
index ef76702..19f0761 100644
--- a/goog_touch_interface.h
+++ b/goog_touch_interface.h
@@ -233,11 +233,6 @@ enum gti_sensor_data_type : u32 {
TOUCH_SCAN_TYPE_SELF | TOUCH_DATA_TYPE_BASELINE,
};
-enum gti_vendor_dev_pm_state : u32 {
- GTI_VENDOR_DEV_RESUME = 0,
- GTI_VENDOR_DEV_SUSPEND,
-};
-
enum gti_fw_status : u32 {
GTI_FW_STATUS_RESET = 0,
GTI_FW_STATUS_PALM_ENTER,
@@ -260,8 +255,9 @@ enum gti_noise_mode_level : u8 {
* Structures.
*/
-struct gti_context_driver_cmd {
- struct {
+struct gti_context_changed {
+ union {
+ struct {
u32 screen_state : 1;
u32 display_refresh_rate : 1;
u32 touch_report_rate : 1;
@@ -270,7 +266,13 @@ struct gti_context_driver_cmd {
u32 charger_state : 1;
u32 hinge_angle : 1;
u32 offload_timestamp : 1;
- } contents;
+ };
+ u32 value;
+ };
+};
+
+struct gti_context_driver_cmd {
+ struct gti_context_changed context_changed;
u8 screen_state;
u8 display_refresh_rate;
@@ -432,6 +434,7 @@ struct gti_union_cmd_data {
*/
struct gti_fw_status_data {
enum gti_noise_mode_level noise_level;
+ u8 water_mode;
};
/**
@@ -555,6 +558,8 @@ struct gti_pm {
* @tbn_register_mask: the tbn_mask that used to request/release touch bus.
* @pm: struct that used by gti pm.
* @pm_qos_req: struct that used by pm qos.
+ * @fw_status: firmware status such as water_mode, noise_level, etc.
+ * @context_changed: flags that indicate driver status changing.
* @panel_is_lp_mode: display is in low power mode.
* @offload_enable: touch offload is enabled or not.
* @v4l2_enable: v4l2 is enabled or not.
@@ -626,6 +631,9 @@ struct goog_touch_interface {
struct gti_pm pm;
struct pm_qos_request pm_qos_req;
+ struct gti_fw_status_data fw_status;
+ struct gti_context_changed context_changed;
+
bool panel_is_lp_mode;
bool offload_enabled;
bool v4l2_enabled;