summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Chang <changmark@google.com>2021-04-13 23:47:23 +0800
committerMark Chang <changmark@google.com>2021-04-14 21:32:42 +0800
commit224c61111d1209690c3fcb7ab24c6238a58b1a64 (patch)
tree69ce6d32ce2b871c9ab8155bbec8cae4e6dcd32c
parentaa71ff13976a3ac8aa3e30887cb28433880f475d (diff)
downloadsec_touch-224c61111d1209690c3fcb7ab24c6238a58b1a64.tar.gz
touch/sec: Dynamic SPI delay for reading data in custom library.
Touch IC needs data preparation time between the request command and the read command. As encoded heatmaps can vary largely between frames, a dynamic delay time for reading custom library further improves the latency when reading small encoded heatmaps. Bug: 182246865 Test: Verified encoded heatmap retrievals. Signed-off-by: Mark Chang <changmark@google.com> Change-Id: I3f803fc9c69f7459172b9dc42d41f9eeaf4eba37
-rw-r--r--sec_ts.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/sec_ts.c b/sec_ts.c
index 1be3784..2242b46 100644
--- a/sec_ts.c
+++ b/sec_ts.c
@@ -47,29 +47,43 @@ static void unregister_panel_bridge(struct drm_bridge *bridge);
int sec_ts_read_information(struct sec_ts_data *ts);
#ifndef I2C_INTERFACE
-int sec_ts_spi_delay(u8 reg)
+void sec_ts_spi_delay(u8 reg, u32 len)
{
+ u32 delay_us = 100;
+
switch (reg) {
case SEC_TS_READ_TOUCH_RAWDATA:
- return 500;
+ delay_us = 500;
+ break;
#if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP)
case SEC_TS_CMD_HEATMAP_READ:
- return 500;
+ delay_us = 500;
+ break;
#endif
+ case SEC_TS_CMD_CUSTOMLIB_READ_PARAM:
+ delay_us = 70 + ((len * 3) >> 1);
+ break;
case SEC_TS_READ_ALL_EVENT:
- return 550;
+ delay_us = 550;
+ break;
case SEC_TS_READ_CSRAM_RTDP_DATA:
- return 550;
+ delay_us = 550;
+ break;
case SEC_TS_CAAT_READ_STORED_DATA:
- return 550;
+ delay_us = 550;
+ break;
case SEC_TS_CMD_FLASH_READ_DATA:
- return 2000;
+ delay_us = 2000;
+ break;
case SEC_TS_READ_FIRMWARE_INTEGRITY:
- return 20*1000;
+ delay_us = 20*1000;
+ break;
case SEC_TS_READ_SELFTEST_RESULT:
- return 4000;
- default: return 100;
+ delay_us = 4000;
+ break;
}
+
+ usleep_range(delay_us, delay_us + 1);
}
int sec_ts_spi_post_delay(u8 reg)
@@ -372,8 +386,7 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg,
continue;
}
- usleep_range(sec_ts_spi_delay(reg),
- sec_ts_spi_delay(reg) + 1);
+ sec_ts_spi_delay(reg, len);
// read sequence start
spi_message_init(&msg);
@@ -543,8 +556,7 @@ static int sec_ts_read_internal(struct sec_ts_data *ts, u8 reg,
continue;
}
- usleep_range(sec_ts_spi_delay(reg),
- sec_ts_spi_delay(reg) + 1);
+ sec_ts_spi_delay(reg, len);
copy_size = 0;
remain = spi_read_len;
@@ -965,7 +977,7 @@ static int sec_ts_read_from_customlib(struct sec_ts_data *ts, u8 *data, int len)
ret = sec_ts_write(ts, SEC_TS_CMD_CUSTOMLIB_READ_PARAM, data, 2);
if (ret < 0)
input_err(true, &ts->client->dev,
- "%s: fail to read custom library command\n", __func__);
+ "%s: fail to write custom library command\n", __func__);
ret = sec_ts_read(ts, SEC_TS_CMD_CUSTOMLIB_READ_PARAM, (u8 *)data, len);
if (ret < 0)