2015-04-21 11:20:15

by Rostislav Lisovy

[permalink] [raw]
Subject: [PATCH 1/2] input: edt-ft5x06: Do not hardcode register numbers in code, use #define

Signed-off-by: Rostislav Lisovy <[email protected]>
---
drivers/input/touchscreen/edt-ft5x06.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
index e6aef3e..c938d4b 100644
--- a/drivers/input/touchscreen/edt-ft5x06.c
+++ b/drivers/input/touchscreen/edt-ft5x06.c
@@ -48,6 +48,9 @@
#define WORK_REGISTER_OFFSET 0x31
#define WORK_REGISTER_NUM_X 0x33
#define WORK_REGISTER_NUM_Y 0x34
+#define WORK_REGISTER_FW_ID 0xA6
+#define WORK_REGISTER_FT_ID 0xA8
+#define WORK_REGISTER_FW_VER 0xBB

#define M09_REGISTER_THRESHOLD 0x80
#define M09_REGISTER_GAIN 0x92
@@ -799,14 +802,16 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
char *p;
int error;
char *model_name = tsdata->name;
+ u8 cmd;

/* see what we find if we assume it is a M06 *
* if we get less than EDT_NAME_LEN, we don't want
* to have garbage in there
*/
memset(rdbuf, 0, sizeof(rdbuf));
- error = edt_ft5x06_ts_readwrite(client, 1, "\xbb",
- EDT_NAME_LEN - 1, rdbuf);
+ cmd = WORK_REGISTER_FW_VER;
+ error = edt_ft5x06_ts_readwrite(client, 1, &cmd, EDT_NAME_LEN - 1,
+ rdbuf);
if (error)
return error;

@@ -831,15 +836,15 @@ static int edt_ft5x06_ts_identify(struct i2c_client *client,
/* since there are only two versions around (M06, M09) */
tsdata->version = M09;

- error = edt_ft5x06_ts_readwrite(client, 1, "\xA6",
- 2, rdbuf);
+ cmd = WORK_REGISTER_FW_ID;
+ error = edt_ft5x06_ts_readwrite(client, 1, &cmd, 2, rdbuf);
if (error)
return error;

strlcpy(fw_version, rdbuf, 2);

- error = edt_ft5x06_ts_readwrite(client, 1, "\xA8",
- 1, rdbuf);
+ cmd = WORK_REGISTER_FT_ID;
+ error = edt_ft5x06_ts_readwrite(client, 1, &cmd, 1, rdbuf);
if (error)
return error;

--
2.1.0


2015-04-21 11:20:31

by Rostislav Lisovy

[permalink] [raw]
Subject: [PATCH 2/2] input: edt-ft5x06: Perform register read from the very beginning (reg 0x0)

When the touch controller detects a touch event, it raises
an interrupt. The driver then reads the touch controller
registers in its ISR. When register readout is started with the
register 0x02, some devices (tested with the register-compatible
FT5316) return 'garbage' (on single touch, "number of touchpoints"
is 5, all the other registers are either 0xFF, 0x0F or 0x00)
and since the device thinks the interrupt event was not handled
properly (by proper register read), the interrupt is being invoked
cca 60--70 times.

By starting the register read with the register 0x00 (X and Y
coordinated are at the offset 3), valid data are read and the
interrupt event is properly handled.

Signed-off-by: Rostislav Lisovy <[email protected]>
---
drivers/input/touchscreen/edt-ft5x06.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c
index c938d4b..72bd74c 100644
--- a/drivers/input/touchscreen/edt-ft5x06.c
+++ b/drivers/input/touchscreen/edt-ft5x06.c
@@ -187,10 +187,10 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id)
break;

case M09:
- cmd = 0x02;
- offset = 1;
+ cmd = 0x00;
+ offset = 3;
tplen = 6;
- datalen = 29;
+ datalen = 31;
break;

default:
--
2.1.0