summaryrefslogtreecommitdiff
path: root/goodix_brl_hw.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-06-20 05:30:14 +0000
committerWendly Li <wendlyli@google.com>2022-06-21 07:02:48 +0000
commite8af885da60c9ab545ab41589db3400a5351a4b3 (patch)
treef8f7f8b4e1a45c03a323b19fa74fbe3ee616fd3c /goodix_brl_hw.c
parent967c1a070556b92b166401a10b07d2ac965e8dcd (diff)
downloadgoodix_touch-e8af885da60c9ab545ab41589db3400a5351a4b3.tar.gz
goodix: Import v1.0.12 driver
Bug: 214118830 Bug: 214118809 Bug: 214118815 Bug: 214118947 Bug: 235776127 Test: Check fw palm and grip works fine and can be switched Test: Check the resolution of pressure is correct Test: Check noise reporting works Test: Check get_package_id works Change-Id: I8e30f09806adb65aaaad2c042c8752d42e4bb23b Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_hw.c')
-rw-r--r--goodix_brl_hw.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c
index f9c3e1e..a64046e 100644
--- a/goodix_brl_hw.c
+++ b/goodix_brl_hw.c
@@ -389,6 +389,7 @@ static int brl_send_cmd(struct goodix_ts_core *cd, struct goodix_ts_cmd *cmd)
struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
+ mutex_lock(&cd->cmd_lock);
cmd->state = 0;
cmd->ack = 0;
goodix_append_checksum(
@@ -400,7 +401,7 @@ static int brl_send_cmd(struct goodix_ts_core *cd, struct goodix_ts_cmd *cmd)
ret = hw_ops->write(cd, misc->cmd_addr, cmd->buf, sizeof(*cmd));
if (ret < 0) {
ts_err("failed write command");
- return ret;
+ goto exit;
}
for (i = 0; i < GOODIX_CMD_RETRY; i++) {
/* check command result */
@@ -408,12 +409,13 @@ static int brl_send_cmd(struct goodix_ts_core *cd, struct goodix_ts_cmd *cmd)
sizeof(cmd_ack));
if (ret < 0) {
ts_err("failed read command ack, %d", ret);
- return ret;
+ goto exit;
}
ts_debug("cmd ack data %*ph", (int)sizeof(cmd_ack),
cmd_ack.buf);
if (cmd_ack.ack == CMD_ACK_OK) {
- return 0;
+ ret = 0;
+ goto exit;
}
if (cmd_ack.ack == CMD_ACK_BUSY ||
cmd_ack.ack == 0x00) {
@@ -426,8 +428,11 @@ static int brl_send_cmd(struct goodix_ts_core *cd, struct goodix_ts_cmd *cmd)
break;
}
}
+ ret = -EINVAL;
ts_err("failed get valid cmd ack");
- return -EINVAL;
+exit:
+ mutex_unlock(&cd->cmd_lock);
+ return ret;
}
#pragma pack(1)
@@ -1111,9 +1116,6 @@ static int goodix_touch_handler(struct goodix_ts_core *cd,
static u8 pre_finger_num;
static u8 pre_pen_num;
- /* clean event buffer */
- memset(ts_event, 0, sizeof(*ts_event));
-
if (event_data->touches > GOODIX_MAX_TOUCH) {
ts_debug("invalid touch num %d", event_data->touches);
return -EINVAL;
@@ -1218,13 +1220,15 @@ static int brl_event_handler(
return -EINVAL;
}
+ /* clean event buffer */
+ memset(ts_event, 0, sizeof(*ts_event));
+
ts_event->event_type = EVENT_INVALID;
/* read status event */
if (event_data->status_changed)
hw_ops->read(cd, 0x1021C, (u8 *)&ts_event->status_data,
sizeof(ts_event->status_data));
-
if (event_data->type & (GOODIX_TOUCH_EVENT >> 4))
return goodix_touch_handler(cd, ts_event,
(struct goodix_ts_touch_event_data *)event_data);