Commit de889108 authored by Marek Vasut's avatar Marek Vasut Committed by Dmitry Torokhov

Input: ili210x - special case ili251x sample read out

The ili251x touch controller needs 5ms delay between sending I2C device
address and register address, and, writing or reading register data.

According to downstream ili251x example code, this 5ms delay is not
required when reading touch samples out of the controller. Implement
such a special case.
Signed-off-by: default avatarMarek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20211108005259.480545-1-marex@denx.deSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent be896bd3
...@@ -224,15 +224,17 @@ static const struct ili2xxx_chip ili212x_chip = { ...@@ -224,15 +224,17 @@ static const struct ili2xxx_chip ili212x_chip = {
.has_calibrate_reg = true, .has_calibrate_reg = true,
}; };
static int ili251x_read_reg(struct i2c_client *client, static int ili251x_read_reg_common(struct i2c_client *client,
u8 reg, void *buf, size_t len) u8 reg, void *buf, size_t len,
unsigned int delay)
{ {
int error; int error;
int ret; int ret;
ret = i2c_master_send(client, &reg, 1); ret = i2c_master_send(client, &reg, 1);
if (ret == 1) { if (ret == 1) {
usleep_range(5000, 5500); if (delay)
usleep_range(delay, delay + 500);
ret = i2c_master_recv(client, buf, len); ret = i2c_master_recv(client, buf, len);
if (ret == len) if (ret == len)
...@@ -244,12 +246,18 @@ static int ili251x_read_reg(struct i2c_client *client, ...@@ -244,12 +246,18 @@ static int ili251x_read_reg(struct i2c_client *client,
return ret; return ret;
} }
static int ili251x_read_reg(struct i2c_client *client,
u8 reg, void *buf, size_t len)
{
return ili251x_read_reg_common(client, reg, buf, len, 5000);
}
static int ili251x_read_touch_data(struct i2c_client *client, u8 *data) static int ili251x_read_touch_data(struct i2c_client *client, u8 *data)
{ {
int error; int error;
error = ili251x_read_reg(client, REG_TOUCHDATA, error = ili251x_read_reg_common(client, REG_TOUCHDATA,
data, ILI251X_DATA_SIZE1); data, ILI251X_DATA_SIZE1, 0);
if (!error && data[0] == 2) { if (!error && data[0] == 2) {
error = i2c_master_recv(client, data + ILI251X_DATA_SIZE1, error = i2c_master_recv(client, data + ILI251X_DATA_SIZE1,
ILI251X_DATA_SIZE2); ILI251X_DATA_SIZE2);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment