summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Chang <changmark@google.com>2021-05-21 17:00:46 +0800
committerMark Chang <changmark@google.com>2021-05-21 22:17:08 +0800
commit5f9f196b6493ce2a6522ccdb6239ccdf217e9b6f (patch)
tree15443ed770644dbb46810379b0cf81c9151c8b7e
parent0973e6848fcf41ddb497d216f63a938468d8462e (diff)
downloadsec_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.c28
-rw-r--r--sec_ts.h1
2 files changed, 20 insertions, 9 deletions
diff --git a/sec_ts.c b/sec_ts.c
index 95440c4..83f4fc4 100644
--- a/sec_ts.c
+++ b/sec_ts.c
@@ -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__);
diff --git a/sec_ts.h b/sec_ts.h
index dfb75dd..28b47bd 100644
--- a/sec_ts.h
+++ b/sec_ts.h
@@ -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;