summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2023-01-01 18:31:27 -0800
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2023-01-01 18:31:27 -0800
commit7d7cf3cf72d394887ae05f5828effa71692e3dfb (patch)
tree4d598eaa329ca04bc4c5b9ba7078e19e6663613d
parentd426a3163cd387df4c1f69573e8e6d92acb3b1d2 (diff)
parentabe01b5b507ac7316db7c1de1d009ee44f4bd692 (diff)
downloadnovatek_touch-7d7cf3cf72d394887ae05f5828effa71692e3dfb.tar.gz
Merge android13-gs-pixel-5.10-tm-qpr3 into android13-gs-pixel-5.10-udc
SBMerger: 478053055 Change-Id: I55b26096dc3eb5d2f2e9d28d783b91a79a2ddfc8 Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r--nt36xxx/nt36xxx.c29
-rw-r--r--nt36xxx/nt36xxx.h3
-rw-r--r--nt36xxx/nt36xxx_ext_proc.c6
-rw-r--r--nt36xxx/nt36xxx_goog.c102
4 files changed, 135 insertions, 5 deletions
diff --git a/nt36xxx/nt36xxx.c b/nt36xxx/nt36xxx.c
index 47156b1..7c557a5 100644
--- a/nt36xxx/nt36xxx.c
+++ b/nt36xxx/nt36xxx.c
@@ -286,7 +286,7 @@ void nvt_irq_enable(bool enable)
}
} else {
if (ts->irq_enabled) {
- disable_irq(ts->client->irq);
+ disable_irq_nosync(ts->client->irq);
ts->irq_enabled = false;
}
}
@@ -1727,10 +1727,23 @@ static irqreturn_t nvt_ts_work_func(int irq, void *data)
uint16_t pen_vid;
uint16_t pen_pid;
#endif
+ char trace_tag[128];
+ ktime_t pen_ktime;
if (!ts->probe_done)
return IRQ_HANDLED;
+ if (ts->bTouchIsAwake == false && ts->irq_enabled == false) {
+#ifdef GOOG_TOUCH_INTERFACE
+ u32 locks = goog_pm_wake_get_locks(ts->gti);
+#else
+ u32 locks = 0;
+#endif
+ NVT_LOG("Skipping stray interrupt, locks %#x wkg_option %#x!\n",
+ locks, ts->wkg_option);
+ return IRQ_HANDLED;
+ }
+
if (ts->wkg_option != WAKEUP_GESTURE_OFF && ts->bTouchIsAwake == false)
pm_wakeup_event(&ts->input_dev->dev, 5 * MSEC_PER_SEC);
else
@@ -1993,6 +2006,12 @@ static irqreturn_t nvt_ts_work_func(int irq, void *data)
ts->pen_format_id = point_data[66];
if (ts->pen_format_id != 0xFF) {
if (ts->pen_format_id == 0x01) {
+ pen_ktime = ktime_get();
+ scnprintf(trace_tag, sizeof(trace_tag),
+ "stylus-active: TH %lld BH %lld delta %lld us\n",
+ ktime_to_us(ts->timestamp), ktime_to_us(pen_ktime),
+ ktime_us_delta(pen_ktime, ts->timestamp));
+ ATRACE_BEGIN(trace_tag);
// report pen data
pen_x = (uint32_t)(point_data[67] << 8) + (uint32_t)(point_data[68]);
pen_y = (uint32_t)(point_data[69] << 8) + (uint32_t)(point_data[70]);
@@ -2057,6 +2076,7 @@ static irqreturn_t nvt_ts_work_func(int irq, void *data)
process_usi_responses(info_buf_flags, info_buf);
}
#endif
+ ATRACE_END();
} else if (ts->pen_format_id == 0xF0) {
// report Pen ID
} else {
@@ -2064,6 +2084,12 @@ static irqreturn_t nvt_ts_work_func(int irq, void *data)
goto XFER_ERROR;
}
} else if (ts->pen_active) { // pen_format_id = 0xFF and a pen was reporting
+ pen_ktime = ktime_get();
+ scnprintf(trace_tag, sizeof(trace_tag),
+ "stylus-inactive: TH %lld BH %lld delta %lld us\n",
+ ktime_to_us(ts->timestamp), ktime_to_us(pen_ktime),
+ ktime_us_delta(pen_ktime, ts->timestamp));
+ ATRACE_BEGIN(trace_tag);
input_set_timestamp(ts->pen_input_dev, ts->timestamp);
/* Snapshot some stylus context information for offload */
@@ -2110,6 +2136,7 @@ static irqreturn_t nvt_ts_work_func(int irq, void *data)
nvt_usi_clear_stylus_read_map();
#endif
+ ATRACE_END();
}
} /* if (ts->pen_support) */
diff --git a/nt36xxx/nt36xxx.h b/nt36xxx/nt36xxx.h
index 8c43cf8..920f3bc 100644
--- a/nt36xxx/nt36xxx.h
+++ b/nt36xxx/nt36xxx.h
@@ -30,6 +30,7 @@
#include <linux/earlysuspend.h>
#endif
+#include "../../../gs-google/drivers/soc/google/vh/kernel/systrace.h"
#include "nt36xxx_mem_map.h"
#ifdef CONFIG_MTK_SPI
@@ -403,6 +404,8 @@ int32_t nvt_write_addr(uint32_t addr, uint8_t data);
extern void update_firmware_release(void);
extern int32_t nvt_update_firmware(const char *firmware_name, uint8_t full);
extern void nvt_change_mode(uint8_t mode);
+extern void nvt_get_xdata_info(int32_t **ptr, int *size);
+extern void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr);
extern int8_t nvt_switch_FreqHopEnDis(uint8_t FreqHopEnDis);
extern uint8_t nvt_get_fw_pipe(void);
extern void nvt_read_fw_history(uint32_t addr);
diff --git a/nt36xxx/nt36xxx_ext_proc.c b/nt36xxx/nt36xxx_ext_proc.c
index 2f24039..52811e1 100644
--- a/nt36xxx/nt36xxx_ext_proc.c
+++ b/nt36xxx/nt36xxx_ext_proc.c
@@ -59,6 +59,12 @@ static struct proc_dir_entry *NVT_proc_pen_2d_baseline_entry;
static struct proc_dir_entry *NVT_proc_pen_2d_diff_entry;
static struct proc_dir_entry *NVT_proc_pen_1d_diff_entry;
+void nvt_get_xdata_info(int32_t **ptr, int *size)
+{
+ *ptr = xdata;
+ *size = sizeof(xdata);
+}
+
/*******************************************************
Description:
Novatek touchscreen change mode function.
diff --git a/nt36xxx/nt36xxx_goog.c b/nt36xxx/nt36xxx_goog.c
index 5696d21..caca0bc 100644
--- a/nt36xxx/nt36xxx_goog.c
+++ b/nt36xxx/nt36xxx_goog.c
@@ -149,6 +149,78 @@ int nvt_get_channel_data(void *private_data,
return ret;
}
+int nvt_test_mode_read(struct nvt_ts_data *ts, struct gti_sensor_data_cmd *cmd)
+{
+ char trace_tag[128];
+ int ret = 0;
+
+ scnprintf(trace_tag, sizeof(trace_tag), "%s: type=%#x\n",
+ __func__, cmd->type);
+ ATRACE_BEGIN(trace_tag);
+
+ NVT_DBG("++\n");
+ if (mutex_lock_interruptible(&ts->lock)) {
+ ret = -ERESTARTSYS;
+ goto err_read;
+ }
+
+#if NVT_TOUCH_ESD_PROTECT
+ nvt_esd_check_enable(false);
+#endif /* #if NVT_TOUCH_ESD_PROTECT */
+
+ if (nvt_clear_fw_status()) {
+ ret = -EAGAIN;
+ goto err_read;
+ }
+
+ nvt_change_mode(TEST_MODE_2);
+
+ if (nvt_check_fw_status()) {
+ ret = -EAGAIN;
+ goto err_read;
+ }
+
+ if (nvt_get_fw_info()) {
+ ret = -EAGAIN;
+ goto err_read;
+ }
+
+ switch (cmd->type) {
+ case GTI_SENSOR_DATA_TYPE_MS_RAW:
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR);
+ break;
+ case GTI_SENSOR_DATA_TYPE_MS_BASELINE:
+ nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR);
+ break;
+ case GTI_SENSOR_DATA_TYPE_MS_DIFF:
+ if (nvt_get_fw_pipe() == 0)
+ nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR);
+ else
+ nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR);
+ break;
+ default:
+ NVT_ERR("invalid type %#x.\n", cmd->type);
+ ret = -ENODATA;
+ break;
+ }
+
+err_read:
+ nvt_change_mode(NORMAL_MODE);
+ if (ret == -EAGAIN) {
+ NVT_LOG("Reload FW to recover unexcepted return!");
+ nvt_update_firmware(get_fw_name(), 1);
+ }
+ mutex_unlock(&ts->lock);
+ NVT_DBG("--, ret(%d)\n", ret);
+
+ ATRACE_END();
+ return ret;
+}
+
+
int nvt_callback(void *private_data,
enum gti_cmd_type cmd_type, struct gti_union_cmd_data *cmd)
{
@@ -269,10 +341,32 @@ int nvt_callback(void *private_data,
break;
case GTI_CMD_GET_SENSOR_DATA_MANUAL:
- if (cmd->manual_sensor_data_cmd.type == GTI_SENSOR_DATA_TYPE_MS_DIFF) {
- cmd->manual_sensor_data_cmd.buffer = ts->heatmap_out_buf;
- cmd->manual_sensor_data_cmd.size = ts->heatmap_out_buf_size;
- ret = 0;
+ if (display_state_on == false ||
+ !(cmd->manual_sensor_data_cmd.type & TOUCH_SCAN_TYPE_MUTUAL)) {
+ ret = -ENODATA;
+ } else {
+ int16_t *out = (int16_t *)ts->extra_spi_buf;
+ int out_sz = ts->x_num * ts->y_num * sizeof(int16_t);
+ int32_t *in = NULL;
+ int in_sz = 0;
+
+ nvt_get_xdata_info(&in, &in_sz);
+ if (in && out &&
+ out_sz <= in_sz &&
+ out_sz <= ts->extra_spi_buf_size) {
+ int i, j;
+ int idx = 0;
+
+ ret = nvt_test_mode_read(ts, &cmd->manual_sensor_data_cmd);
+ if (!ret) {
+ for (i = 0; i < ts->y_num; i++)
+ for (j = 0; j < ts->x_num; j++)
+ out[idx++] = (int16_t)in[i * ts->x_num + j];
+
+ cmd->manual_sensor_data_cmd.buffer = ts->extra_spi_buf;
+ cmd->manual_sensor_data_cmd.size = out_sz;
+ }
+ }
}
break;