diff options
author | Mark Chang <changmark@google.com> | 2021-05-21 17:00:46 +0800 |
---|---|---|
committer | Mark Chang <changmark@google.com> | 2021-05-21 22:17:08 +0800 |
commit | 5f9f196b6493ce2a6522ccdb6239ccdf217e9b6f (patch) | |
tree | 15443ed770644dbb46810379b0cf81c9151c8b7e | |
parent | 0973e6848fcf41ddb497d216f63a938468d8462e (diff) | |
download | sec_touch-5f9f196b6493ce2a6522ccdb6239ccdf217e9b6f.tar.gz |
touch/sec: Update SPI delay for reading data in custom library.
Update the SPI delay time based on the latency data from the vendor and
tuning result of FW 1.9. The base delay time is extended for 240Hz touch
report rate, and dynamic delay time is used to accommodate longer latency
required for processing large data packets.
Bug: 188480651
Test: Verified with locally built ROM and FW 1.9.
Signed-off-by: Mark Chang <changmark@google.com>
Change-Id: I9a52e86bd026260c0cc2e8d2eee35bac977f3b66
-rw-r--r-- | sec_ts.c | 28 | ||||
-rw-r--r-- | sec_ts.h | 1 |
2 files changed, 20 insertions, 9 deletions
@@ -47,7 +47,7 @@ static void unregister_panel_bridge(struct drm_bridge *bridge); int sec_ts_read_information(struct sec_ts_data *ts); #ifndef I2C_INTERFACE -void sec_ts_spi_delay(u8 reg) +u32 sec_ts_spi_delay(u8 reg, u32 data_len) { u32 delay_us = 100; @@ -61,7 +61,7 @@ void sec_ts_spi_delay(u8 reg) break; #endif case SEC_TS_CMD_CUSTOMLIB_READ_PARAM: - delay_us = 95; + delay_us = min(120 + (data_len >> 2), (u32) 500); break; case SEC_TS_READ_ALL_EVENT: delay_us = 550; @@ -84,6 +84,8 @@ void sec_ts_spi_delay(u8 reg) } usleep_range(delay_us, delay_us + 1); + + return delay_us; } int sec_ts_spi_post_delay(u8 reg) @@ -245,6 +247,7 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg, #else struct spi_message msg; struct spi_transfer transfer[1] = { { 0 } }; + u32 spi_delay_us = 0; unsigned int i; unsigned int spi_write_len = 0, spi_read_len = 0; unsigned char write_checksum = 0x0, read_checksum = 0x0; @@ -386,7 +389,7 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg, continue; } - sec_ts_spi_delay(reg); + spi_delay_us = sec_ts_spi_delay(reg, len); // read sequence start spi_message_init(&msg); @@ -425,8 +428,8 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg, ret = -EIO; input_err(true, &ts->client->dev, - "%s: retry %d\n", - __func__, retry + 1); + "%s: retry %d for 0x%02X size(%d) delay(%d)\n", + __func__, retry + 1, reg, len, spi_delay_us); ts->comm_err_count++; usleep_range(1 * 1000, 1 * 1000); @@ -556,7 +559,7 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg, continue; } - sec_ts_spi_delay(reg); + sec_ts_spi_delay(reg, len); copy_size = 0; remain = spi_read_len; @@ -2136,9 +2139,12 @@ static int sec_ts_populate_encoded_channel(struct sec_ts_data *ts, if (encoded_counter == 0 || encoded_data_size == 0 || encoded_data_size > heatmap_array_len * 2) { - input_err(true, &ts->client->dev, - "%s: Invalid encoded data size %d (%d)\n", - __func__, encoded_data_size, encoded_counter); + if (ts->plat_data->encoded_read_fails < 20) { + ts->plat_data->encoded_read_fails++; + input_err(true, &ts->client->dev, + "%s: Invalid encoded data size %d (%d)\n", + __func__, encoded_data_size, encoded_counter); + } return -EIO; } @@ -3521,6 +3527,8 @@ static int sec_ts_parse_dt(struct spi_device *client) &pdata->encoded_enable) < 0) pdata->encoded_enable = 0; + pdata->encoded_read_fails = 0; + if (of_property_read_u32(np, "sec,heatmap_mode", &pdata->heatmap_mode) < 0) pdata->heatmap_mode = 0; @@ -5196,6 +5204,8 @@ static void sec_ts_resume_work(struct work_struct *work) sec_ts_set_grip_type(ts, ONLY_EDGE_HANDLER); + ts->plat_data->encoded_read_fails = 0; + if (ts->dex_mode) { input_info(true, &ts->client->dev, "%s: set dex mode.\n", __func__); @@ -1121,6 +1121,7 @@ struct sec_ts_plat_data { int mis_cal_check; int heatmap_mode; int encoded_enable; + int encoded_read_fails; #ifdef PAT_CONTROL int pat_function; int afe_base; |