The eth3915n requires more delay time than the eth3500 when poweron & reset. Define EKTH3915_POWERON_DELAY_MSEC as the poweron delay time of eth3915n, about 80ms. Define EKTH3915_RESET_DELAY_MSEC as the reset delay time of eth3915n, about 300ms. Signed-off-by: Yunlong Jia <yunlong.jia@xxxxxxxxxx> Reviewed-by: Douglas Anderson <dianders@xxxxxxxxxxxx> --- Changes in v3: 1. Add poweron delay time. Changes in v2: 1. Adjust the 'Signed-off-by'. drivers/input/touchscreen/elants_i2c.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c index c9dd703b0c7d8..fb99dd10b0b6d 100644 --- a/drivers/input/touchscreen/elants_i2c.c +++ b/drivers/input/touchscreen/elants_i2c.c @@ -116,6 +116,8 @@ #define ELAN_POWERON_DELAY_USEC 500 #define ELAN_RESET_DELAY_MSEC 20 +#define EKTH3915_POWERON_DELAY_MSEC 80 +#define EKTH3915_RESET_DELAY_MSEC 300 /* FW boot code version */ #define BC_VER_H_BYTE_FOR_EKTH3900x1_I2C 0x72 @@ -133,6 +135,7 @@ enum elants_chip_id { EKTH3500, EKTF3624, + EKTH3915, }; enum elants_state { @@ -664,6 +667,7 @@ static int elants_i2c_initialize(struct elants_data *ts) switch (ts->chip_id) { case EKTH3500: + case EKTH3915: if (!error) error = elants_i2c_query_ts_info_ekth(ts); break; @@ -1331,6 +1335,9 @@ static int elants_i2c_power_on(struct elants_data *ts) if (IS_ERR_OR_NULL(ts->reset_gpio)) return 0; + if (ts->chip_id == EKTH3915) + msleep(EKTH3915_POWERON_DELAY_MSEC); + gpiod_set_value_cansleep(ts->reset_gpio, 1); error = regulator_enable(ts->vcc33); @@ -1361,7 +1368,17 @@ static int elants_i2c_power_on(struct elants_data *ts) if (error) return error; - msleep(ELAN_RESET_DELAY_MSEC); + if (ts->chip_id == EKTH3915) + /* + * There need delay 300ms for power on sequence. + * T1 + T2 + T3 >= 305 ms + * T1: 0<time<500us + * T2: >5ms + * T3: >300ms + */ + msleep(EKTH3915_RESET_DELAY_MSEC); + else + msleep(ELAN_RESET_DELAY_MSEC); return 0; } @@ -1686,6 +1703,7 @@ static const struct i2c_device_id elants_i2c_id[] = { { DEVICE_NAME, EKTH3500 }, { "ekth3500", EKTH3500 }, { "ektf3624", EKTF3624 }, + { "ekth3915", EKTH3915 }, { } }; MODULE_DEVICE_TABLE(i2c, elants_i2c_id); @@ -1702,6 +1720,7 @@ MODULE_DEVICE_TABLE(acpi, elants_acpi_id); static const struct of_device_id elants_of_match[] = { { .compatible = "elan,ekth3500", .data = (void *)EKTH3500 }, { .compatible = "elan,ektf3624", .data = (void *)EKTF3624 }, + { .compatible = "elan,ekth3915", .data = (void *)EKTH3915 }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, elants_of_match); -- 2.17.1