Skip to content

Commit 74c4f52

Browse files
committed
Input: atmel_mxt_ts - split large i2c transfers into blocks
On some firmware variants, the size of the info block exceeds what can be read in a single transfer.
1 parent d88aadd commit 74c4f52

File tree

1 file changed

+24
-3
lines changed

1 file changed

+24
-3
lines changed

drivers/input/touchscreen/atmel_mxt_ts.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#define MXT_OBJECT_START 0x07
4040
#define MXT_OBJECT_SIZE 6
4141
#define MXT_INFO_CHECKSUM_SIZE 3
42-
#define MXT_MAX_BLOCK_WRITE 256
42+
#define MXT_MAX_BLOCK_WRITE 255
4343

4444
/* Object types */
4545
#define MXT_DEBUG_DIAGNOSTIC_T37 37
@@ -575,6 +575,27 @@ static int __mxt_read_reg(struct i2c_client *client,
575575
return ret;
576576
}
577577

578+
static int mxt_read_blks(struct mxt_data *data, u16 start, u16 count, u8 *buf)
579+
{
580+
u16 offset = 0;
581+
int error;
582+
u16 size;
583+
584+
while (offset < count) {
585+
size = min(MXT_MAX_BLOCK_WRITE, count - offset);
586+
587+
error = __mxt_read_reg(data->client,
588+
start + offset,
589+
size, buf + offset);
590+
if (error)
591+
return error;
592+
593+
offset += size;
594+
}
595+
596+
return 0;
597+
}
598+
578599
static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
579600
const void *val)
580601
{
@@ -1704,7 +1725,7 @@ static int mxt_read_info_block(struct mxt_data *data)
17041725
}
17051726

17061727
/* Read rest of info block */
1707-
error = __mxt_read_reg(client, MXT_OBJECT_START,
1728+
error = mxt_read_blks(data, MXT_OBJECT_START,
17081729
size - MXT_OBJECT_START,
17091730
buf + MXT_OBJECT_START);
17101731
if (error)
@@ -2243,7 +2264,7 @@ static ssize_t mxt_object_show(struct device *dev,
22432264
u16 size = mxt_obj_size(object);
22442265
u16 addr = object->start_address + j * size;
22452266

2246-
error = __mxt_read_reg(data->client, addr, size, obuf);
2267+
error = mxt_read_blks(data, addr, size, obuf);
22472268
if (error)
22482269
goto done;
22492270

0 commit comments

Comments
 (0)