diff options
author | PixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com> | 2023-01-01 18:31:27 -0800 |
---|---|---|
committer | SecurityBot <android-nexus-securitybot@system.gserviceaccount.com> | 2023-01-01 18:31:27 -0800 |
commit | 7d7cf3cf72d394887ae05f5828effa71692e3dfb (patch) | |
tree | 4d598eaa329ca04bc4c5b9ba7078e19e6663613d | |
parent | d426a3163cd387df4c1f69573e8e6d92acb3b1d2 (diff) | |
parent | abe01b5b507ac7316db7c1de1d009ee44f4bd692 (diff) | |
download | novatek_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.c | 29 | ||||
-rw-r--r-- | nt36xxx/nt36xxx.h | 3 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_ext_proc.c | 6 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_goog.c | 102 |
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; |