* [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
@ 2019-12-11 16:03 Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 3/9] input: elants: remove unused axes Michał Mirosław
` (10 more replies)
0 siblings, 11 replies; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Scott Liu, James Chen, Johnny Chuang, Dmitry Torokhov,
linux-kernel, Dmitry Osipenko, Henrik Rydberg, Mark Rutland,
Rob Herring
This series cleans up the driver a bit and implements changes needed to
support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
---
v2: extended with Dmitry's patches (replaced v1 patches 3 and 4)
Dmitry Osipenko (3):
input: elants: support 0x66 reply opcode for reporting touches
dt-bindings: input: elants-i2c: Document common touchscreen properties
dt-bindings: input: elants-i2c: Document eKTF3624
Michał Mirosław (6):
input: elants: document some registers and values
input: elants: support old touch report format
input: elants: remove unused axes
input: elants: override touchscreen info with DT properties
input: elants: refactor elants_i2c_execute_command()
input: elants: read touchscreen size for EKTF3624
.../devicetree/bindings/input/elants_i2c.txt | 6 +-
drivers/input/touchscreen/elants_i2c.c | 358 ++++++++++++------
2 files changed, 239 insertions(+), 125 deletions(-)
--
2.20.1
^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 3/9] input: elants: remove unused axes
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:34 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 2/9] input: elants: support old touch report format Michał Mirosław
` (9 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Dmitry Osipenko, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
Driver only ever reports MT events. Clear capabilities of all others.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index eadd26d5a06f..ab9d63239ff5 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -1251,17 +1251,6 @@ static int elants_i2c_probe(struct i2c_client *client,
ts->input->name = "Elan Touchscreen";
ts->input->id.bustype = BUS_I2C;
- __set_bit(BTN_TOUCH, ts->input->keybit);
- __set_bit(EV_ABS, ts->input->evbit);
- __set_bit(EV_KEY, ts->input->evbit);
-
- /* Single touch input params setup */
- input_set_abs_params(ts->input, ABS_X, 0, ts->x_max, 0, 0);
- input_set_abs_params(ts->input, ABS_Y, 0, ts->y_max, 0, 0);
- input_set_abs_params(ts->input, ABS_PRESSURE, 0, 255, 0, 0);
- input_abs_set_res(ts->input, ABS_X, ts->x_res);
- input_abs_set_res(ts->input, ABS_Y, ts->y_res);
-
/* Multitouch input params setup */
error = input_mt_init_slots(ts->input, MAX_CONTACT_NUM,
INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 1/9] input: elants: document some registers and values
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 3/9] input: elants: remove unused axes Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 2/9] input: elants: support old touch report format Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:34 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 4/9] input: elants: override touchscreen info with DT properties Michał Mirosław
` (7 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Dmitry Osipenko, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
Add information found in downstream kernels, to make the code less
magic.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 29 +++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index d4ad24ea54c8..887888c53996 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -77,7 +77,11 @@
#define HEADER_REPORT_10_FINGER 0x62
-/* Header (4 bytes) plus 3 fill 10-finger packets */
+/* Power state */
+#define PWR_STATE_DEEP_SLEEP 0
+#define PWR_STATE_NORMAL 1
+
+/* Header (4 bytes) plus 3 full 10-finger packets */
#define MAX_PACKET_SIZE 169
#define BOOT_TIME_DELAY_MS 50
@@ -87,10 +91,21 @@
#define E_ELAN_INFO_BC_VER 0x10
#define E_ELAN_INFO_TEST_VER 0xE0
#define E_ELAN_INFO_FW_ID 0xF0
+#define E_POWER_MODE 0x40
+#define E_POWER_STATE 0x50
+#define E_INFO_X_RES 0x60
+#define E_INFO_Y_RES 0x63
#define E_INFO_OSR 0xD6
#define E_INFO_PHY_SCAN 0xD7
#define E_INFO_PHY_DRIVER 0xD8
+/* FW write command, 0x54 0x?? 0x0, 0x01 */
+#define E_POWER_MODE_BATTERY 0x40
+#define E_POWER_MODE_AC 0x41
+#define E_POWER_MODE_USB 0x42
+#define E_POWER_STATE_SLEEP 0x50
+#define E_POWER_STATE_RESUME 0x58
+
#define MAX_RETRIES 3
#define MAX_FW_UPDATE_RETRIES 30
@@ -231,8 +246,8 @@ static int elants_i2c_calibrate(struct elants_data *ts)
{
struct i2c_client *client = ts->client;
int ret, error;
- static const u8 w_flashkey[] = { 0x54, 0xC0, 0xE1, 0x5A };
- static const u8 rek[] = { 0x54, 0x29, 0x00, 0x01 };
+ static const u8 w_flashkey[] = { CMD_HEADER_WRITE, 0xC0, 0xE1, 0x5A };
+ static const u8 rek[] = { CMD_HEADER_WRITE, 0x29, 0x00, 0x01 };
static const u8 rek_resp[] = { CMD_HEADER_REK, 0x66, 0x66, 0x66 };
disable_irq(client->irq);
@@ -1295,7 +1310,9 @@ static int __maybe_unused elants_i2c_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct elants_data *ts = i2c_get_clientdata(client);
- const u8 set_sleep_cmd[] = { 0x54, 0x50, 0x00, 0x01 };
+ const u8 set_sleep_cmd[] = {
+ CMD_HEADER_WRITE, E_POWER_STATE_SLEEP, 0x00, 0x01
+ };
int retry_cnt;
int error;
@@ -1332,7 +1349,9 @@ static int __maybe_unused elants_i2c_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct elants_data *ts = i2c_get_clientdata(client);
- const u8 set_active_cmd[] = { 0x54, 0x58, 0x00, 0x01 };
+ const u8 set_active_cmd[] = {
+ CMD_HEADER_WRITE, E_POWER_STATE_RESUME, 0x00, 0x01
+ };
int retry_cnt;
int error;
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 2/9] input: elants: support old touch report format
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 3/9] input: elants: remove unused axes Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:54 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 1/9] input: elants: document some registers and values Michał Mirosław
` (8 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Dmitry Osipenko, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
Support ELAN touchpad sensor with older firmware as found on eg. Asus
Transformer Pads.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 36 ++++++++++++++++++--------
1 file changed, 25 insertions(+), 11 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 887888c53996..eadd26d5a06f 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -65,6 +65,7 @@
#define CMD_HEADER_REK 0x66
/* FW position data */
+#define PACKET_SIZE_OLD 40
#define PACKET_SIZE 55
#define MAX_CONTACT_NUM 10
#define FW_POS_HEADER 0
@@ -792,7 +793,8 @@ static int elants_i2c_fw_update(struct elants_data *ts)
* Event reporting.
*/
-static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
+static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf,
+ size_t report_len)
{
struct input_dev *input = ts->input;
unsigned int n_fingers;
@@ -804,7 +806,8 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
buf[FW_POS_STATE];
dev_dbg(&ts->client->dev,
- "n_fingers: %u, state: %04x\n", n_fingers, finger_state);
+ "n_fingers: %u, state: %04x, report_len: %zu\n",
+ n_fingers, finger_state, report_len);
for (i = 0; i < MAX_CONTACT_NUM && n_fingers; i++) {
if (finger_state & 1) {
@@ -814,8 +817,16 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
pos = &buf[FW_POS_XY + i * 3];
x = (((u16)pos[0] & 0xf0) << 4) | pos[1];
y = (((u16)pos[0] & 0x0f) << 8) | pos[2];
- p = buf[FW_POS_PRESSURE + i];
- w = buf[FW_POS_WIDTH + i];
+ if (report_len == PACKET_SIZE_OLD) {
+ w = buf[FW_POS_WIDTH + i / 2];
+ w >>= 4 * (~i & 1); // little-endian-nibbles
+ w |= w << 4;
+ w |= !w;
+ p = w;
+ } else {
+ p = buf[FW_POS_PRESSURE + i];
+ w = buf[FW_POS_WIDTH + i];
+ }
dev_dbg(&ts->client->dev, "i=%d x=%d y=%d p=%d w=%d\n",
i, x, y, p, w);
@@ -848,7 +859,8 @@ static u8 elants_i2c_calculate_checksum(u8 *buf)
return checksum;
}
-static void elants_i2c_event(struct elants_data *ts, u8 *buf)
+static void elants_i2c_event(struct elants_data *ts, u8 *buf,
+ size_t report_len)
{
u8 checksum = elants_i2c_calculate_checksum(buf);
@@ -862,7 +874,7 @@ static void elants_i2c_event(struct elants_data *ts, u8 *buf)
"%s: unknown packet type: %02x\n",
__func__, buf[FW_POS_HEADER]);
else
- elants_i2c_mt_event(ts, buf);
+ elants_i2c_mt_event(ts, buf, report_len);
}
static irqreturn_t elants_i2c_irq(int irq, void *_dev)
@@ -920,7 +932,8 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
break;
case QUEUE_HEADER_SINGLE:
- elants_i2c_event(ts, &ts->buf[HEADER_SIZE]);
+ elants_i2c_event(ts, &ts->buf[HEADER_SIZE],
+ ts->buf[FW_HDR_LENGTH]);
break;
case QUEUE_HEADER_NORMAL:
@@ -933,17 +946,18 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
}
report_len = ts->buf[FW_HDR_LENGTH] / report_count;
- if (report_len != PACKET_SIZE) {
+ if (report_len != PACKET_SIZE &&
+ report_len != PACKET_SIZE_OLD) {
dev_err(&client->dev,
- "mismatching report length: %*ph\n",
+ "unsupported report length: %*ph\n",
HEADER_SIZE, ts->buf);
break;
}
for (i = 0; i < report_count; i++) {
u8 *buf = ts->buf + HEADER_SIZE +
- i * PACKET_SIZE;
- elants_i2c_event(ts, buf);
+ i * report_len;
+ elants_i2c_event(ts, buf, report_len);
}
break;
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 4/9] input: elants: override touchscreen info with DT properties
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (2 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 1/9] input: elants: document some registers and values Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624 Michał Mirosław
` (6 subsequent siblings)
10 siblings, 0 replies; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Henrik Rydberg, Dmitry Osipenko, James Chen,
Johnny Chuang, linux-kernel, Mark Rutland, Rob Herring,
Scott Liu
Allow overriding of information from hardware and support additional
common DT properties like axis inversion. This is required for eg.
Nexus 7 and TF300T where the programmed values in firmware differ
from reality.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
[moved "prop" before DMA buffer]
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index ab9d63239ff5..bc24f52b2932 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -32,6 +32,7 @@
#include <linux/slab.h>
#include <linux/firmware.h>
#include <linux/input/mt.h>
+#include <linux/input/touchscreen.h>
#include <linux/acpi.h>
#include <linux/of.h>
#include <linux/gpio/consumer.h>
@@ -148,6 +149,7 @@ struct elants_data {
unsigned int y_res;
unsigned int x_max;
unsigned int y_max;
+ struct touchscreen_properties prop;
enum elants_state state;
enum elants_iap_mode iap_mode;
@@ -833,8 +835,7 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf,
input_mt_slot(input, i);
input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
- input_event(input, EV_ABS, ABS_MT_POSITION_X, x);
- input_event(input, EV_ABS, ABS_MT_POSITION_Y, y);
+ touchscreen_report_pos(input, &ts->prop, x, y, true);
input_event(input, EV_ABS, ABS_MT_PRESSURE, p);
input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, w);
@@ -1267,6 +1268,8 @@ static int elants_i2c_probe(struct i2c_client *client,
input_abs_set_res(ts->input, ABS_MT_POSITION_X, ts->x_res);
input_abs_set_res(ts->input, ABS_MT_POSITION_Y, ts->y_res);
+ touchscreen_parse_properties(ts->input, true, &ts->prop);
+
error = input_register_device(ts->input);
if (error) {
dev_err(&client->dev,
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (3 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 4/9] input: elants: override touchscreen info with DT properties Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:39 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command() Michał Mirosław
` (5 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Dmitry Osipenko, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
EKTF3624 as present in Asus TF300T tablet has touchscreen size encoded
in different registers.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 82 ++++++++++++++++++++++++--
1 file changed, 77 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 369004678a46..1c3eb49a22e4 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -34,7 +34,7 @@
#include <linux/input/mt.h>
#include <linux/input/touchscreen.h>
#include <linux/acpi.h>
-#include <linux/of.h>
+#include <linux/of_device.h>
#include <linux/gpio/consumer.h>
#include <linux/regulator/consumer.h>
#include <asm/unaligned.h>
@@ -42,6 +42,10 @@
/* Device, Driver information */
#define DEVICE_NAME "elants_i2c"
+/* Device IDs */
+#define EKTH3500 0
+#define EKTF3624 1
+
/* Convert from rows or columns into resolution */
#define ELAN_TS_RESOLUTION(n, m) (((n) - 1) * (m))
@@ -162,6 +166,7 @@ struct elants_data {
bool wake_irq_enabled;
bool keep_power_in_suspend;
+ u8 chip_id;
/* Must be last to be used for DMA operations */
u8 buf[MAX_PACKET_SIZE] ____cacheline_aligned;
@@ -436,7 +441,58 @@ static int elants_i2c_query_bc_version(struct elants_data *ts)
return 0;
}
-static int elants_i2c_query_ts_info(struct elants_data *ts)
+static int elants_i2c_query_ts_info_ektf(struct elants_data *ts)
+{
+ struct i2c_client *client = ts->client;
+ int error;
+ u8 resp[4];
+ u16 phy_x, phy_y;
+ const u8 get_xres_cmd[] = {
+ CMD_HEADER_READ, E_INFO_X_RES, 0x00, 0x00
+ };
+ const u8 get_yres_cmd[] = {
+ CMD_HEADER_READ, E_INFO_Y_RES, 0x00, 0x00
+ };
+
+ /* Get X/Y size in mm */
+ error = elants_i2c_execute_command(client, get_xres_cmd,
+ sizeof(get_xres_cmd),
+ resp, sizeof(resp), 1,
+ "get X size");
+ if (error)
+ return error;
+
+ phy_x = resp[2] | ((resp[3] & 0xF0) << 4);
+
+ error = elants_i2c_execute_command(client, get_yres_cmd,
+ sizeof(get_yres_cmd),
+ resp, sizeof(resp), 1,
+ "get Y size");
+ if (error)
+ return error;
+
+ phy_y = resp[2] | ((resp[3] & 0xF0) << 4);
+
+ if (!phy_x || !phy_y) {
+ dev_warn(&client->dev,
+ "invalid size data: %d x %d mm\n",
+ phy_x, phy_y);
+ return 0;
+ }
+
+ dev_dbg(&client->dev, "phy_x=%d, phy_y=%d\n", phy_x, phy_y);
+
+ /* calculate resolution from size */
+ ts->x_max = 2240-1;
+ ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, phy_x);
+
+ ts->y_max = 1408-1;
+ ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, phy_y);
+
+ return 0;
+}
+
+static int elants_i2c_query_ts_info_ekth(struct elants_data *ts)
{
struct i2c_client *client = ts->client;
int error;
@@ -587,8 +643,20 @@ static int elants_i2c_initialize(struct elants_data *ts)
error = elants_i2c_query_test_version(ts);
if (!error)
error = elants_i2c_query_bc_version(ts);
- if (!error)
- error = elants_i2c_query_ts_info(ts);
+
+ switch (ts->chip_id) {
+ case EKTH3500:
+ if (!error)
+ error = elants_i2c_query_ts_info_ekth(ts);
+ break;
+ case EKTF3624:
+ if (!error)
+ error = elants_i2c_query_ts_info_ektf(ts);
+ break;
+ default:
+ unreachable();
+ break;
+ }
if (error)
ts->iap_mode = ELAN_IAP_RECOVERY;
@@ -1185,6 +1253,9 @@ static int elants_i2c_probe(struct i2c_client *client,
ts->client = client;
i2c_set_clientdata(client, ts);
+ if (client->dev.of_node)
+ ts->chip_id = (uintptr_t)of_device_get_match_data(&client->dev);
+
ts->vcc33 = devm_regulator_get(&client->dev, "vcc33");
if (IS_ERR(ts->vcc33)) {
error = PTR_ERR(ts->vcc33);
@@ -1409,7 +1480,8 @@ MODULE_DEVICE_TABLE(acpi, elants_acpi_id);
#ifdef CONFIG_OF
static const struct of_device_id elants_of_match[] = {
- { .compatible = "elan,ekth3500" },
+ { .compatible = "elan,ekth3500", .data = (void *)EKTH3500 },
+ { .compatible = "elan,ektf3624", .data = (void *)EKTF3624 },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, elants_of_match);
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command()
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (4 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624 Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:30 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 7/9] input: elants: support 0x66 reply opcode for reporting touches Michał Mirosław
` (4 subsequent siblings)
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Dmitry Osipenko, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
Apply some DRY-ing to elants_i2c_execute_command() callers.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 182 +++++++++++++------------
1 file changed, 93 insertions(+), 89 deletions(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index bc24f52b2932..369004678a46 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -203,7 +203,8 @@ static int elants_i2c_read(struct i2c_client *client, void *data, size_t size)
static int elants_i2c_execute_command(struct i2c_client *client,
const u8 *cmd, size_t cmd_size,
- u8 *resp, size_t resp_size)
+ u8 *resp, size_t resp_size,
+ int retries, const char *cmd_name)
{
struct i2c_msg msgs[2];
int ret;
@@ -219,30 +220,55 @@ static int elants_i2c_execute_command(struct i2c_client *client,
break;
default:
- dev_err(&client->dev, "%s: invalid command %*ph\n",
- __func__, (int)cmd_size, cmd);
+ dev_err(&client->dev, "(%s): invalid command: %*ph\n",
+ cmd_name, (int)cmd_size, cmd);
return -EINVAL;
}
- msgs[0].addr = client->addr;
- msgs[0].flags = client->flags & I2C_M_TEN;
- msgs[0].len = cmd_size;
- msgs[0].buf = (u8 *)cmd;
+ for (;;) {
+ msgs[0].addr = client->addr;
+ msgs[0].flags = client->flags & I2C_M_TEN;
+ msgs[0].len = cmd_size;
+ msgs[0].buf = (u8 *)cmd;
- msgs[1].addr = client->addr;
- msgs[1].flags = client->flags & I2C_M_TEN;
- msgs[1].flags |= I2C_M_RD;
- msgs[1].len = resp_size;
- msgs[1].buf = resp;
+ msgs[1].addr = client->addr;
+ msgs[1].flags = client->flags & I2C_M_TEN;
+ msgs[1].flags |= I2C_M_RD;
+ msgs[1].len = resp_size;
+ msgs[1].buf = resp;
- ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
- if (ret < 0)
- return ret;
+ ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+ if (ret < 0) {
+ if (--retries > 0) {
+ dev_dbg(&client->dev,
+ "(%s) I2C transfer failed: %d (retrying)\n",
+ cmd_name, ret);
+ continue;
+ }
- if (ret != ARRAY_SIZE(msgs) || resp[FW_HDR_TYPE] != expected_response)
- return -EIO;
+ dev_err(&client->dev,
+ "(%s) I2C transfer failed: %d\n",
+ cmd_name, ret);
+ return ret;
+ }
- return 0;
+ if (ret != ARRAY_SIZE(msgs) ||
+ resp[FW_HDR_TYPE] != expected_response) {
+ if (--retries > 0) {
+ dev_dbg(&client->dev,
+ "(%s) unexpected response: %*ph (retrying)\n",
+ cmd_name, ret, resp);
+ continue;
+ }
+
+ dev_err(&client->dev,
+ "(%s) unexpected response: %*ph\n",
+ cmd_name, ret, resp);
+ return -EIO;
+ }
+
+ return --retries;
+ }
}
static int elants_i2c_calibrate(struct elants_data *ts)
@@ -315,27 +341,20 @@ static u16 elants_i2c_parse_version(u8 *buf)
static int elants_i2c_query_hw_version(struct elants_data *ts)
{
struct i2c_client *client = ts->client;
- int error, retry_cnt;
+ int retry_cnt = MAX_RETRIES;
const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_FW_ID, 0x00, 0x01 };
u8 resp[HEADER_SIZE];
- for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
- error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
- resp, sizeof(resp));
- if (!error) {
- ts->hw_version = elants_i2c_parse_version(resp);
- if (ts->hw_version != 0xffff)
- return 0;
- }
+ while (retry_cnt) {
+ retry_cnt = elants_i2c_execute_command(client, cmd, sizeof(cmd),
+ resp, sizeof(resp),
+ retry_cnt, "read fw id");
+ if (retry_cnt < 0)
+ return retry_cnt;
- dev_dbg(&client->dev, "read fw id error=%d, buf=%*phC\n",
- error, (int)sizeof(resp), resp);
- }
-
- if (error) {
- dev_err(&client->dev,
- "Failed to read fw id: %d\n", error);
- return error;
+ ts->hw_version = elants_i2c_parse_version(resp);
+ if (ts->hw_version != 0xffff)
+ return 0;
}
dev_err(&client->dev, "Invalid fw id: %#04x\n", ts->hw_version);
@@ -346,26 +365,28 @@ static int elants_i2c_query_hw_version(struct elants_data *ts)
static int elants_i2c_query_fw_version(struct elants_data *ts)
{
struct i2c_client *client = ts->client;
- int error, retry_cnt;
+ int retry_cnt = MAX_RETRIES;
const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_FW_VER, 0x00, 0x01 };
u8 resp[HEADER_SIZE];
- for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
- error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
- resp, sizeof(resp));
- if (!error) {
- ts->fw_version = elants_i2c_parse_version(resp);
- if (ts->fw_version != 0x0000 &&
- ts->fw_version != 0xffff)
- return 0;
- }
+ while (retry_cnt) {
+ retry_cnt = elants_i2c_execute_command(client, cmd,
+ sizeof(cmd),
+ resp, sizeof(resp),
+ retry_cnt,
+ "read fw version");
+ if (retry_cnt < 0)
+ return retry_cnt;
- dev_dbg(&client->dev, "read fw version error=%d, buf=%*phC\n",
- error, (int)sizeof(resp), resp);
+ ts->fw_version = elants_i2c_parse_version(resp);
+ if (ts->fw_version != 0x0000 && ts->fw_version != 0xffff)
+ return 0;
+
+ dev_dbg(&client->dev, "(read fw version) resp %*phC\n",
+ (int)sizeof(resp), resp);
}
- dev_err(&client->dev,
- "Failed to read fw version or fw version is invalid\n");
+ dev_err(&client->dev, "Invalid fw ver: %#04x\n", ts->fw_version);
return -EINVAL;
}
@@ -373,25 +394,20 @@ static int elants_i2c_query_fw_version(struct elants_data *ts)
static int elants_i2c_query_test_version(struct elants_data *ts)
{
struct i2c_client *client = ts->client;
- int error, retry_cnt;
+ int error;
u16 version;
const u8 cmd[] = { CMD_HEADER_READ, E_ELAN_INFO_TEST_VER, 0x00, 0x01 };
u8 resp[HEADER_SIZE];
- for (retry_cnt = 0; retry_cnt < MAX_RETRIES; retry_cnt++) {
- error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
- resp, sizeof(resp));
- if (!error) {
- version = elants_i2c_parse_version(resp);
- ts->test_version = version >> 8;
- ts->solution_version = version & 0xff;
+ error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
+ resp, sizeof(resp), MAX_RETRIES,
+ "read test version");
+ if (error >= 0) {
+ version = elants_i2c_parse_version(resp);
+ ts->test_version = version >> 8;
+ ts->solution_version = version & 0xff;
- return 0;
- }
-
- dev_dbg(&client->dev,
- "read test version error rc=%d, buf=%*phC\n",
- error, (int)sizeof(resp), resp);
+ return 0;
}
dev_err(&client->dev, "Failed to read test version\n");
@@ -408,13 +424,10 @@ static int elants_i2c_query_bc_version(struct elants_data *ts)
int error;
error = elants_i2c_execute_command(client, cmd, sizeof(cmd),
- resp, sizeof(resp));
- if (error) {
- dev_err(&client->dev,
- "read BC version error=%d, buf=%*phC\n",
- error, (int)sizeof(resp), resp);
+ resp, sizeof(resp), 1,
+ "read BC version");
+ if (error)
return error;
- }
version = elants_i2c_parse_version(resp);
ts->bc_version = version >> 8;
@@ -446,12 +459,10 @@ static int elants_i2c_query_ts_info(struct elants_data *ts)
error = elants_i2c_execute_command(client,
get_resolution_cmd,
sizeof(get_resolution_cmd),
- resp, sizeof(resp));
- if (error) {
- dev_err(&client->dev, "get resolution command failed: %d\n",
- error);
+ resp, sizeof(resp), 1,
+ "get resolution");
+ if (error)
return error;
- }
rows = resp[2] + resp[6] + resp[10];
cols = resp[3] + resp[7] + resp[11];
@@ -459,36 +470,29 @@ static int elants_i2c_query_ts_info(struct elants_data *ts)
/* Process mm_to_pixel information */
error = elants_i2c_execute_command(client,
get_osr_cmd, sizeof(get_osr_cmd),
- resp, sizeof(resp));
- if (error) {
- dev_err(&client->dev, "get osr command failed: %d\n",
- error);
+ resp, sizeof(resp), 1, "get osr");
+ if (error)
return error;
- }
osr = resp[3];
error = elants_i2c_execute_command(client,
get_physical_scan_cmd,
sizeof(get_physical_scan_cmd),
- resp, sizeof(resp));
- if (error) {
- dev_err(&client->dev, "get physical scan command failed: %d\n",
- error);
+ resp, sizeof(resp), 1,
+ "get physical scan");
+ if (error)
return error;
- }
phy_x = get_unaligned_be16(&resp[2]);
error = elants_i2c_execute_command(client,
get_physical_drive_cmd,
sizeof(get_physical_drive_cmd),
- resp, sizeof(resp));
- if (error) {
- dev_err(&client->dev, "get physical drive command failed: %d\n",
- error);
+ resp, sizeof(resp), 1,
+ "get physical drive");
+ if (error)
return error;
- }
phy_y = get_unaligned_be16(&resp[2]);
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 7/9] input: elants: support 0x66 reply opcode for reporting touches
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (5 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command() Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties Michał Mirosław
` (3 subsequent siblings)
10 siblings, 0 replies; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Dmitry Osipenko, Henrik Rydberg,
James Chen, Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
From: Dmitry Osipenko <digetx@gmail.com>
eKTF3624 touchscreen firmware uses two variants of the reply opcodes for
reporting touch events: one is 0x63 (used by older firmware) and other is
0x66 (used by newer firmware). The 0x66 variant is equal to 0x63 of
eKTH3500, while 0x63 needs small adjustment of the touch pressure value.
Nexus 7 tablet device has eKTF3624 touchscreen and it uses 0x66 opcode for
reporting touch events, let's support it now. Other devices, eg. ASUS TF300T,
use 0x63.
Note: CMD_HEADER_REK is used for replying to calibration requests, it has
the same 0x66 opcode number which eKTF3624 uses for reporting touches.
The calibration replies are handled separately from the the rest of the
commands in the driver by entering into ELAN_WAIT_RECALIBRATION state
and thus this change shouldn't change the old behavior.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/input/touchscreen/elants_i2c.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
index 1c3eb49a22e4..d750eb97c912 100644
--- a/drivers/input/touchscreen/elants_i2c.c
+++ b/drivers/input/touchscreen/elants_i2c.c
@@ -60,6 +60,15 @@
#define QUEUE_HEADER_NORMAL 0X63
#define QUEUE_HEADER_WAIT 0x64
+/*
+ * Depending on firmware version, eKTF3624 touchscreens may utilize one of
+ * these opcodes for the touch events: 0x63 and 0x66. The 0x63 is used by
+ * older firmware version and differs from 0x66 such that touch pressure
+ * value needs to be adjusted. The 0x66 opcode of newer firmware is equal
+ * to 0x63 of eKTH3500.
+ */
+#define QUEUE_HEADER_NORMAL2 0x66
+
/* Command header definition */
#define CMD_HEADER_WRITE 0x54
#define CMD_HEADER_READ 0x53
@@ -990,7 +999,6 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
switch (ts->buf[FW_HDR_TYPE]) {
case CMD_HEADER_HELLO:
case CMD_HEADER_RESP:
- case CMD_HEADER_REK:
break;
case QUEUE_HEADER_WAIT:
@@ -1010,6 +1018,7 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
break;
case QUEUE_HEADER_NORMAL:
+ case QUEUE_HEADER_NORMAL2:
report_count = ts->buf[FW_HDR_COUNT];
if (report_count == 0 || report_count > 3) {
dev_err(&client->dev,
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (6 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 7/9] input: elants: support 0x66 reply opcode for reporting touches Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-12 0:58 ` Dmitry Osipenko
2019-12-19 21:39 ` Rob Herring
2019-12-11 16:03 ` [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624 Michał Mirosław
` (2 subsequent siblings)
10 siblings, 2 replies; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, linux-kernel,
Dmitry Osipenko, Henrik Rydberg, James Chen, Johnny Chuang,
Scott Liu
From: Dmitry Osipenko <digetx@gmail.com>
Document support of the common touchscreen properties.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
Documentation/devicetree/bindings/input/elants_i2c.txt | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/elants_i2c.txt b/Documentation/devicetree/bindings/input/elants_i2c.txt
index 5edac8be0802..45fab32bbc19 100644
--- a/Documentation/devicetree/bindings/input/elants_i2c.txt
+++ b/Documentation/devicetree/bindings/input/elants_i2c.txt
@@ -14,9 +14,13 @@ Optional properties:
- reset-gpios: reset gpio the chip is connected to.
- vcc33-supply: a phandle for the regulator supplying 3.3V power.
- vccio-supply: a phandle for the regulator supplying IO power.
+- see [2] for additional properties
+
+For additional optional properties see: touchscreen.txt
[0]: Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
[1]: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
+[2]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
Example:
&i2c1 {
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (7 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties Michał Mirosław
@ 2019-12-11 16:03 ` Michał Mirosław
2019-12-19 21:43 ` Rob Herring
2019-12-12 0:29 ` [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Dmitry Osipenko
2019-12-12 19:24 ` Dmitry Torokhov
10 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-11 16:03 UTC (permalink / raw)
To: linux-input, devicetree
Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, linux-kernel,
Dmitry Osipenko, Henrik Rydberg, James Chen, Johnny Chuang,
Scott Liu
From: Dmitry Osipenko <digetx@gmail.com>
The eKTF3624 hardware is similar to eKTH3500.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
Documentation/devicetree/bindings/input/elants_i2c.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/input/elants_i2c.txt b/Documentation/devicetree/bindings/input/elants_i2c.txt
index 45fab32bbc19..1bc60303f0ea 100644
--- a/Documentation/devicetree/bindings/input/elants_i2c.txt
+++ b/Documentation/devicetree/bindings/input/elants_i2c.txt
@@ -1,7 +1,7 @@
Elantech I2C Touchscreen
Required properties:
-- compatible: must be "elan,ekth3500".
+- compatible: must be "elan,ekth3500" or "elan,ektf3624".
- reg: I2C address of the chip.
- interrupts: interrupt to which the chip is connected (see interrupt
binding[0]).
--
2.20.1
^ permalink raw reply related [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (8 preceding siblings ...)
2019-12-11 16:03 ` [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624 Michał Mirosław
@ 2019-12-12 0:29 ` Dmitry Osipenko
2019-12-12 19:24 ` Dmitry Torokhov
10 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:29 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Scott Liu, James Chen, Johnny Chuang, Dmitry Torokhov,
linux-kernel, Henrik Rydberg, Mark Rutland, Rob Herring
11.12.2019 19:03, Michał Mirosław пишет:
> This series cleans up the driver a bit and implements changes needed to
> support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
>
> ---
> v2: extended with Dmitry's patches (replaced v1 patches 3 and 4)
>
> Dmitry Osipenko (3):
> input: elants: support 0x66 reply opcode for reporting touches
> dt-bindings: input: elants-i2c: Document common touchscreen properties
> dt-bindings: input: elants-i2c: Document eKTF3624
>
> Michał Mirosław (6):
> input: elants: document some registers and values
> input: elants: support old touch report format
> input: elants: remove unused axes
> input: elants: override touchscreen info with DT properties
> input: elants: refactor elants_i2c_execute_command()
> input: elants: read touchscreen size for EKTF3624
>
> .../devicetree/bindings/input/elants_i2c.txt | 6 +-
> drivers/input/touchscreen/elants_i2c.c | 358 ++++++++++++------
> 2 files changed, 239 insertions(+), 125 deletions(-)
>
Hello Michał,
The series works and looks good to me, eKTF3624 touchscreen is working
fine on Nexus 7. Thank you very much!
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command()
2019-12-11 16:03 ` [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command() Michał Mirosław
@ 2019-12-12 0:30 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:30 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Henrik Rydberg, James Chen,
Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> Apply some DRY-ing to elants_i2c_execute_command() callers.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
Could you please explain why this change is needed?
[snip]
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/9] input: elants: document some registers and values
2019-12-11 16:03 ` [PATCH v2 1/9] input: elants: document some registers and values Michał Mirosław
@ 2019-12-12 0:34 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:34 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Henrik Rydberg, James Chen,
Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> Add information found in downstream kernels, to make the code less
> magic.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> drivers/input/touchscreen/elants_i2c.c | 29 +++++++++++++++++++++-----
> 1 file changed, 24 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index d4ad24ea54c8..887888c53996 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -77,7 +77,11 @@
>
> #define HEADER_REPORT_10_FINGER 0x62
>
> -/* Header (4 bytes) plus 3 fill 10-finger packets */
> +/* Power state */
> +#define PWR_STATE_DEEP_SLEEP 0
> +#define PWR_STATE_NORMAL 1
> +
> +/* Header (4 bytes) plus 3 full 10-finger packets */
> #define MAX_PACKET_SIZE 169
>
> #define BOOT_TIME_DELAY_MS 50
> @@ -87,10 +91,21 @@
> #define E_ELAN_INFO_BC_VER 0x10
> #define E_ELAN_INFO_TEST_VER 0xE0
> #define E_ELAN_INFO_FW_ID 0xF0
> +#define E_POWER_MODE 0x40
> +#define E_POWER_STATE 0x50
> +#define E_INFO_X_RES 0x60
> +#define E_INFO_Y_RES 0x63
> #define E_INFO_OSR 0xD6
> #define E_INFO_PHY_SCAN 0xD7
> #define E_INFO_PHY_DRIVER 0xD8
> +/* FW write command, 0x54 0x?? 0x0, 0x01 */
> +#define E_POWER_MODE_BATTERY 0x40
> +#define E_POWER_MODE_AC 0x41
These commands are not utilized yet, but perhaps it's okay to add the
definitions if you're going to add support for power source switching.
> +#define E_POWER_MODE_USB 0x42
> +#define E_POWER_STATE_SLEEP 0x50
> +#define E_POWER_STATE_RESUME 0x58
> +
> #define MAX_RETRIES 3
> #define MAX_FW_UPDATE_RETRIES 30
>
> @@ -231,8 +246,8 @@ static int elants_i2c_calibrate(struct elants_data *ts)
> {
> struct i2c_client *client = ts->client;
> int ret, error;
> - static const u8 w_flashkey[] = { 0x54, 0xC0, 0xE1, 0x5A };
> - static const u8 rek[] = { 0x54, 0x29, 0x00, 0x01 };
> + static const u8 w_flashkey[] = { CMD_HEADER_WRITE, 0xC0, 0xE1, 0x5A };
> + static const u8 rek[] = { CMD_HEADER_WRITE, 0x29, 0x00, 0x01 };
> static const u8 rek_resp[] = { CMD_HEADER_REK, 0x66, 0x66, 0x66 };
>
> disable_irq(client->irq);
> @@ -1295,7 +1310,9 @@ static int __maybe_unused elants_i2c_suspend(struct device *dev)
> {
> struct i2c_client *client = to_i2c_client(dev);
> struct elants_data *ts = i2c_get_clientdata(client);
> - const u8 set_sleep_cmd[] = { 0x54, 0x50, 0x00, 0x01 };
> + const u8 set_sleep_cmd[] = {
> + CMD_HEADER_WRITE, E_POWER_STATE_SLEEP, 0x00, 0x01
> + };
> int retry_cnt;
> int error;
>
> @@ -1332,7 +1349,9 @@ static int __maybe_unused elants_i2c_resume(struct device *dev)
> {
> struct i2c_client *client = to_i2c_client(dev);
> struct elants_data *ts = i2c_get_clientdata(client);
> - const u8 set_active_cmd[] = { 0x54, 0x58, 0x00, 0x01 };
> + const u8 set_active_cmd[] = {
> + CMD_HEADER_WRITE, E_POWER_STATE_RESUME, 0x00, 0x01
> + };
> int retry_cnt;
> int error;
>
>
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Tested-by: Dmitry Osipenko <digetx@gmail.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/9] input: elants: remove unused axes
2019-12-11 16:03 ` [PATCH v2 3/9] input: elants: remove unused axes Michał Mirosław
@ 2019-12-12 0:34 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:34 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Henrik Rydberg, James Chen,
Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> Driver only ever reports MT events. Clear capabilities of all others.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> drivers/input/touchscreen/elants_i2c.c | 11 -----------
> 1 file changed, 11 deletions(-)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index eadd26d5a06f..ab9d63239ff5 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -1251,17 +1251,6 @@ static int elants_i2c_probe(struct i2c_client *client,
> ts->input->name = "Elan Touchscreen";
> ts->input->id.bustype = BUS_I2C;
>
> - __set_bit(BTN_TOUCH, ts->input->keybit);
> - __set_bit(EV_ABS, ts->input->evbit);
> - __set_bit(EV_KEY, ts->input->evbit);
> -
> - /* Single touch input params setup */
> - input_set_abs_params(ts->input, ABS_X, 0, ts->x_max, 0, 0);
> - input_set_abs_params(ts->input, ABS_Y, 0, ts->y_max, 0, 0);
> - input_set_abs_params(ts->input, ABS_PRESSURE, 0, 255, 0, 0);
> - input_abs_set_res(ts->input, ABS_X, ts->x_res);
> - input_abs_set_res(ts->input, ABS_Y, ts->y_res);
> -
> /* Multitouch input params setup */
> error = input_mt_init_slots(ts->input, MAX_CONTACT_NUM,
> INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
>
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Tested-by: Dmitry Osipenko <digetx@gmail.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624
2019-12-11 16:03 ` [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624 Michał Mirosław
@ 2019-12-12 0:39 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:39 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Henrik Rydberg, James Chen,
Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> EKTF3624 as present in Asus TF300T tablet has touchscreen size encoded
> in different registers.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> drivers/input/touchscreen/elants_i2c.c | 82 ++++++++++++++++++++++++--
> 1 file changed, 77 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index 369004678a46..1c3eb49a22e4 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -34,7 +34,7 @@
> #include <linux/input/mt.h>
> #include <linux/input/touchscreen.h>
> #include <linux/acpi.h>
> -#include <linux/of.h>
> +#include <linux/of_device.h>
> #include <linux/gpio/consumer.h>
> #include <linux/regulator/consumer.h>
> #include <asm/unaligned.h>
> @@ -42,6 +42,10 @@
> /* Device, Driver information */
> #define DEVICE_NAME "elants_i2c"
>
> +/* Device IDs */
> +#define EKTH3500 0
> +#define EKTF3624 1
> +
> /* Convert from rows or columns into resolution */
> #define ELAN_TS_RESOLUTION(n, m) (((n) - 1) * (m))
>
> @@ -162,6 +166,7 @@ struct elants_data {
>
> bool wake_irq_enabled;
> bool keep_power_in_suspend;
> + u8 chip_id;
>
> /* Must be last to be used for DMA operations */
> u8 buf[MAX_PACKET_SIZE] ____cacheline_aligned;
> @@ -436,7 +441,58 @@ static int elants_i2c_query_bc_version(struct elants_data *ts)
> return 0;
> }
>
> -static int elants_i2c_query_ts_info(struct elants_data *ts)
> +static int elants_i2c_query_ts_info_ektf(struct elants_data *ts)
> +{
> + struct i2c_client *client = ts->client;
> + int error;
> + u8 resp[4];
> + u16 phy_x, phy_y;
> + const u8 get_xres_cmd[] = {
> + CMD_HEADER_READ, E_INFO_X_RES, 0x00, 0x00
> + };
> + const u8 get_yres_cmd[] = {
> + CMD_HEADER_READ, E_INFO_Y_RES, 0x00, 0x00
> + };
> +
> + /* Get X/Y size in mm */
> + error = elants_i2c_execute_command(client, get_xres_cmd,
> + sizeof(get_xres_cmd),
> + resp, sizeof(resp), 1,
> + "get X size");
> + if (error)
> + return error;
> +
> + phy_x = resp[2] | ((resp[3] & 0xF0) << 4);
> +
> + error = elants_i2c_execute_command(client, get_yres_cmd,
> + sizeof(get_yres_cmd),
> + resp, sizeof(resp), 1,
> + "get Y size");
> + if (error)
> + return error;
> +
> + phy_y = resp[2] | ((resp[3] & 0xF0) << 4);
> +
> + if (!phy_x || !phy_y) {
> + dev_warn(&client->dev,
> + "invalid size data: %d x %d mm\n",
> + phy_x, phy_y);
> + return 0;
> + }
> +
> + dev_dbg(&client->dev, "phy_x=%d, phy_y=%d\n", phy_x, phy_y);
> +
> + /* calculate resolution from size */
> + ts->x_max = 2240-1;
> + ts->x_res = DIV_ROUND_CLOSEST(ts->prop.max_x, phy_x);
> +
> + ts->y_max = 1408-1;
> + ts->y_res = DIV_ROUND_CLOSEST(ts->prop.max_y, phy_y);
> +
> + return 0;
> +}
> +
> +static int elants_i2c_query_ts_info_ekth(struct elants_data *ts)
> {
> struct i2c_client *client = ts->client;
> int error;
> @@ -587,8 +643,20 @@ static int elants_i2c_initialize(struct elants_data *ts)
> error = elants_i2c_query_test_version(ts);
> if (!error)
> error = elants_i2c_query_bc_version(ts);
> - if (!error)
> - error = elants_i2c_query_ts_info(ts);
> +
> + switch (ts->chip_id) {
> + case EKTH3500:
> + if (!error)
> + error = elants_i2c_query_ts_info_ekth(ts);
> + break;
> + case EKTF3624:
> + if (!error)
> + error = elants_i2c_query_ts_info_ektf(ts);
> + break;
> + default:
> + unreachable();
> + break;
> + }
>
> if (error)
> ts->iap_mode = ELAN_IAP_RECOVERY;
> @@ -1185,6 +1253,9 @@ static int elants_i2c_probe(struct i2c_client *client,
> ts->client = client;
> i2c_set_clientdata(client, ts);
>
> + if (client->dev.of_node)
> + ts->chip_id = (uintptr_t)of_device_get_match_data(&client->dev);
> +
> ts->vcc33 = devm_regulator_get(&client->dev, "vcc33");
> if (IS_ERR(ts->vcc33)) {
> error = PTR_ERR(ts->vcc33);
> @@ -1409,7 +1480,8 @@ MODULE_DEVICE_TABLE(acpi, elants_acpi_id);
>
> #ifdef CONFIG_OF
> static const struct of_device_id elants_of_match[] = {
> - { .compatible = "elan,ekth3500" },
> + { .compatible = "elan,ekth3500", .data = (void *)EKTH3500 },
> + { .compatible = "elan,ektf3624", .data = (void *)EKTF3624 },
> { /* sentinel */ }
> };
> MODULE_DEVICE_TABLE(of, elants_of_match);
>
In a comment to v1 I suggested to remove the OF table and use I2C table
for the OF matching, but this variant is okay as well.
Reviewed-by: Dmitry Osipenko <digetx@gmail.com>
Tested-by: Dmitry Osipenko <digetx@gmail.com>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/9] input: elants: support old touch report format
2019-12-11 16:03 ` [PATCH v2 2/9] input: elants: support old touch report format Michał Mirosław
@ 2019-12-12 0:54 ` Dmitry Osipenko
2019-12-12 19:45 ` Michał Mirosław
0 siblings, 1 reply; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:54 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, linux-kernel, Henrik Rydberg, James Chen,
Johnny Chuang, Mark Rutland, Rob Herring, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> Support ELAN touchpad sensor with older firmware as found on eg. Asus
> Transformer Pads.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> drivers/input/touchscreen/elants_i2c.c | 36 ++++++++++++++++++--------
> 1 file changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/input/touchscreen/elants_i2c.c b/drivers/input/touchscreen/elants_i2c.c
> index 887888c53996..eadd26d5a06f 100644
> --- a/drivers/input/touchscreen/elants_i2c.c
> +++ b/drivers/input/touchscreen/elants_i2c.c
> @@ -65,6 +65,7 @@
> #define CMD_HEADER_REK 0x66
>
> /* FW position data */
> +#define PACKET_SIZE_OLD 40
> #define PACKET_SIZE 55
> #define MAX_CONTACT_NUM 10
> #define FW_POS_HEADER 0
> @@ -792,7 +793,8 @@ static int elants_i2c_fw_update(struct elants_data *ts)
> * Event reporting.
> */
>
> -static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
> +static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf,
> + size_t report_len)
> {
> struct input_dev *input = ts->input;
> unsigned int n_fingers;
> @@ -804,7 +806,8 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
> buf[FW_POS_STATE];
>
> dev_dbg(&ts->client->dev,
> - "n_fingers: %u, state: %04x\n", n_fingers, finger_state);
> + "n_fingers: %u, state: %04x, report_len: %zu\n",
> + n_fingers, finger_state, report_len);
>
> for (i = 0; i < MAX_CONTACT_NUM && n_fingers; i++) {
> if (finger_state & 1) {
> @@ -814,8 +817,16 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
> pos = &buf[FW_POS_XY + i * 3];
> x = (((u16)pos[0] & 0xf0) << 4) | pos[1];
> y = (((u16)pos[0] & 0x0f) << 8) | pos[2];
> - p = buf[FW_POS_PRESSURE + i];
> - w = buf[FW_POS_WIDTH + i];
> + if (report_len == PACKET_SIZE_OLD) {
> + w = buf[FW_POS_WIDTH + i / 2];
> + w >>= 4 * (~i & 1); // little-endian-nibbles
> + w |= w << 4;
> + w |= !w;
> + p = w;
Did you copy this from the downstream driver as-is? I'm looking at the
Nexus 7 driver and it does the following for older format:
u8 size_idx[] = { 35, 35, 36, 36, 37, 37, 38, 38, 39, 39 };
unsigned int s;
if (i & 1)
s = buf[size_idx[i]];
else
s = buf[size_idx[i]] / 16;
w = s & 0xf;
p = s * 16;
> + } else {
> + p = buf[FW_POS_PRESSURE + i];
> + w = buf[FW_POS_WIDTH + i];
> + }
>
> dev_dbg(&ts->client->dev, "i=%d x=%d y=%d p=%d w=%d\n",
> i, x, y, p, w);
> @@ -848,7 +859,8 @@ static u8 elants_i2c_calculate_checksum(u8 *buf)
> return checksum;
> }
>
> -static void elants_i2c_event(struct elants_data *ts, u8 *buf)
> +static void elants_i2c_event(struct elants_data *ts, u8 *buf,
> + size_t report_len)
> {
> u8 checksum = elants_i2c_calculate_checksum(buf);
>
> @@ -862,7 +874,7 @@ static void elants_i2c_event(struct elants_data *ts, u8 *buf)
> "%s: unknown packet type: %02x\n",
> __func__, buf[FW_POS_HEADER]);
> else
> - elants_i2c_mt_event(ts, buf);
> + elants_i2c_mt_event(ts, buf, report_len);
> }
>
> static irqreturn_t elants_i2c_irq(int irq, void *_dev)
> @@ -920,7 +932,8 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
> break;
>
> case QUEUE_HEADER_SINGLE:
> - elants_i2c_event(ts, &ts->buf[HEADER_SIZE]);
> + elants_i2c_event(ts, &ts->buf[HEADER_SIZE],
> + ts->buf[FW_HDR_LENGTH]);
> break;
>
> case QUEUE_HEADER_NORMAL:
> @@ -933,17 +946,18 @@ static irqreturn_t elants_i2c_irq(int irq, void *_dev)
> }
>
> report_len = ts->buf[FW_HDR_LENGTH] / report_count;
> - if (report_len != PACKET_SIZE) {
> + if (report_len != PACKET_SIZE &&
> + report_len != PACKET_SIZE_OLD) {
> dev_err(&client->dev,
> - "mismatching report length: %*ph\n",
> + "unsupported report length: %*ph\n",
> HEADER_SIZE, ts->buf);
> break;
> }
>
> for (i = 0; i < report_count; i++) {
> u8 *buf = ts->buf + HEADER_SIZE +
> - i * PACKET_SIZE;
> - elants_i2c_event(ts, buf);
> + i * report_len;
> + elants_i2c_event(ts, buf, report_len);
> }
> break;
>
>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties
2019-12-11 16:03 ` [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties Michał Mirosław
@ 2019-12-12 0:58 ` Dmitry Osipenko
2019-12-12 1:00 ` Dmitry Osipenko
2019-12-19 21:39 ` Rob Herring
1 sibling, 1 reply; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 0:58 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree
Cc: Dmitry Torokhov, Rob Herring, Mark Rutland, linux-kernel,
Henrik Rydberg, James Chen, Johnny Chuang, Scott Liu
11.12.2019 19:03, Michał Mirosław пишет:
> From: Dmitry Osipenko <digetx@gmail.com>
>
> Document support of the common touchscreen properties.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> Documentation/devicetree/bindings/input/elants_i2c.txt | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/elants_i2c.txt b/Documentation/devicetree/bindings/input/elants_i2c.txt
> index 5edac8be0802..45fab32bbc19 100644
> --- a/Documentation/devicetree/bindings/input/elants_i2c.txt
> +++ b/Documentation/devicetree/bindings/input/elants_i2c.txt
> @@ -14,9 +14,13 @@ Optional properties:
> - reset-gpios: reset gpio the chip is connected to.
> - vcc33-supply: a phandle for the regulator supplying 3.3V power.
> - vccio-supply: a phandle for the regulator supplying IO power.
> +- see [2] for additional properties
> +
> +For additional optional properties see: touchscreen.txt
>
> [0]: Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
> [1]: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
> +[2]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
>
> Example:
> &i2c1 {
>
Rob's email address is incorrect: <robh-dt@kernel.org> ->
<robh+dt@kernel.org>
But I suppose he's keeping an eye on the device-tree ML.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties
2019-12-12 0:58 ` Dmitry Osipenko
@ 2019-12-12 1:00 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-12 1:00 UTC (permalink / raw)
To: Michał Mirosław, linux-input, devicetree, Rob Herring
Cc: Dmitry Torokhov, Mark Rutland, linux-kernel, Henrik Rydberg,
James Chen, Johnny Chuang, Scott Liu
12.12.2019 03:58, Dmitry Osipenko пишет:
> 11.12.2019 19:03, Michał Mirosław пишет:
>> From: Dmitry Osipenko <digetx@gmail.com>
>>
>> Document support of the common touchscreen properties.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
>> ---
>> Documentation/devicetree/bindings/input/elants_i2c.txt | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/Documentation/devicetree/bindings/input/elants_i2c.txt b/Documentation/devicetree/bindings/input/elants_i2c.txt
>> index 5edac8be0802..45fab32bbc19 100644
>> --- a/Documentation/devicetree/bindings/input/elants_i2c.txt
>> +++ b/Documentation/devicetree/bindings/input/elants_i2c.txt
>> @@ -14,9 +14,13 @@ Optional properties:
>> - reset-gpios: reset gpio the chip is connected to.
>> - vcc33-supply: a phandle for the regulator supplying 3.3V power.
>> - vccio-supply: a phandle for the regulator supplying IO power.
>> +- see [2] for additional properties
>> +
>> +For additional optional properties see: touchscreen.txt
>>
>> [0]: Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
>> [1]: Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
>> +[2]: Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
>>
>> Example:
>> &i2c1 {
>>
>
> Rob's email address is incorrect: <robh-dt@kernel.org> ->
> <robh+dt@kernel.org>
>
> But I suppose he's keeping an eye on the device-tree ML.
Adding Rob to CC using the correct address.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
` (9 preceding siblings ...)
2019-12-12 0:29 ` [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Dmitry Osipenko
@ 2019-12-12 19:24 ` Dmitry Torokhov
2020-01-07 5:33 ` Dmitry Osipenko
10 siblings, 1 reply; 27+ messages in thread
From: Dmitry Torokhov @ 2019-12-12 19:24 UTC (permalink / raw)
To: Michał Mirosław, Johnny Chuang
Cc: linux-input, devicetree, Scott Liu, James Chen, linux-kernel,
Dmitry Osipenko, Henrik Rydberg, Mark Rutland, Rob Herring
On Wed, Dec 11, 2019 at 05:03:18PM +0100, Michał Mirosław wrote:
> This series cleans up the driver a bit and implements changes needed to
> support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
Johnny, could you please take a look at this patch series?
Thanks!
>
> ---
> v2: extended with Dmitry's patches (replaced v1 patches 3 and 4)
>
> Dmitry Osipenko (3):
> input: elants: support 0x66 reply opcode for reporting touches
> dt-bindings: input: elants-i2c: Document common touchscreen properties
> dt-bindings: input: elants-i2c: Document eKTF3624
>
> Michał Mirosław (6):
> input: elants: document some registers and values
> input: elants: support old touch report format
> input: elants: remove unused axes
> input: elants: override touchscreen info with DT properties
> input: elants: refactor elants_i2c_execute_command()
> input: elants: read touchscreen size for EKTF3624
>
> .../devicetree/bindings/input/elants_i2c.txt | 6 +-
> drivers/input/touchscreen/elants_i2c.c | 358 ++++++++++++------
> 2 files changed, 239 insertions(+), 125 deletions(-)
>
> --
> 2.20.1
>
--
Dmitry
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/9] input: elants: support old touch report format
2019-12-12 0:54 ` Dmitry Osipenko
@ 2019-12-12 19:45 ` Michał Mirosław
2019-12-13 0:06 ` Dmitry Osipenko
0 siblings, 1 reply; 27+ messages in thread
From: Michał Mirosław @ 2019-12-12 19:45 UTC (permalink / raw)
To: Dmitry Osipenko
Cc: linux-input, devicetree, Dmitry Torokhov, linux-kernel,
Henrik Rydberg, James Chen, Johnny Chuang, Mark Rutland,
Rob Herring, Scott Liu
On Thu, Dec 12, 2019 at 03:54:13AM +0300, Dmitry Osipenko wrote:
> 11.12.2019 19:03, Michał Mirosław пишет:
> > Support ELAN touchpad sensor with older firmware as found on eg. Asus
> > Transformer Pads.
[...]
> > @@ -814,8 +817,16 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
> > pos = &buf[FW_POS_XY + i * 3];
> > x = (((u16)pos[0] & 0xf0) << 4) | pos[1];
> > y = (((u16)pos[0] & 0x0f) << 8) | pos[2];
> > - p = buf[FW_POS_PRESSURE + i];
> > - w = buf[FW_POS_WIDTH + i];
> > + if (report_len == PACKET_SIZE_OLD) {
> > + w = buf[FW_POS_WIDTH + i / 2];
> > + w >>= 4 * (~i & 1); // little-endian-nibbles
> > + w |= w << 4;
> > + w |= !w;
> > + p = w;
>
> Did you copy this from the downstream driver as-is? I'm looking at the
> Nexus 7 driver and it does the following for older format:
>
> u8 size_idx[] = { 35, 35, 36, 36, 37, 37, 38, 38, 39, 39 };
> unsigned int s;
>
> if (i & 1)
> s = buf[size_idx[i]];
> else
> s = buf[size_idx[i]] / 16;
>
> w = s & 0xf;
> p = s * 16;
This is the same thing modulo (w), which is scaled here to declared axis
range (1-255 from 0-15, assuming 0 means "no touch" so it should not occur).
OTOH, I admit, that I don't have any software that can verify those
settings. It might be that eg. one of MT_PRESSURE or MT_TOUCH_MAJOR axes
should be dropped in this case, but with no docs I can't be sure what
the reported values really are.
This is from the original (GPL) code dump labeled 'Asus 10_6_1_27_5':
| touch_size = ((i & 0x01) ? buf[size_index[i]] : (buf[size_index[i]] >> 4)) & 0x0F;
| if(touch_size == 0) touch_size = 1;
| if (touch_size <= 7)
| touch_size = touch_size << 5;
| else
| touch_size = 255;
|
| input_report_abs(idev, ABS_MT_TOUCH_MAJOR, touch_size);
| input_report_abs(idev, ABS_MT_PRESSURE, touch_size);
Best Regards,
Michał Mirosław
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/9] input: elants: support old touch report format
2019-12-12 19:45 ` Michał Mirosław
@ 2019-12-13 0:06 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-13 0:06 UTC (permalink / raw)
To: Michał Mirosław
Cc: linux-input, devicetree, Dmitry Torokhov, linux-kernel,
Henrik Rydberg, James Chen, Johnny Chuang, Mark Rutland,
Rob Herring, Scott Liu
12.12.2019 22:45, Michał Mirosław пишет:
> On Thu, Dec 12, 2019 at 03:54:13AM +0300, Dmitry Osipenko wrote:
>> 11.12.2019 19:03, Michał Mirosław пишет:
>>> Support ELAN touchpad sensor with older firmware as found on eg. Asus
>>> Transformer Pads.
> [...]
>>> @@ -814,8 +817,16 @@ static void elants_i2c_mt_event(struct elants_data *ts, u8 *buf)
>>> pos = &buf[FW_POS_XY + i * 3];
>>> x = (((u16)pos[0] & 0xf0) << 4) | pos[1];
>>> y = (((u16)pos[0] & 0x0f) << 8) | pos[2];
>>> - p = buf[FW_POS_PRESSURE + i];
>>> - w = buf[FW_POS_WIDTH + i];
>>> + if (report_len == PACKET_SIZE_OLD) {
>>> + w = buf[FW_POS_WIDTH + i / 2];
>>> + w >>= 4 * (~i & 1); // little-endian-nibbles
>>> + w |= w << 4;
>>> + w |= !w;
>>> + p = w;
>>
>> Did you copy this from the downstream driver as-is? I'm looking at the
>> Nexus 7 driver and it does the following for older format:
>>
>> u8 size_idx[] = { 35, 35, 36, 36, 37, 37, 38, 38, 39, 39 };
>> unsigned int s;
>>
>> if (i & 1)
>> s = buf[size_idx[i]];
>> else
>> s = buf[size_idx[i]] / 16;
>>
>> w = s & 0xf;
>> p = s * 16;
>
> This is the same thing modulo (w), which is scaled here to declared axis
> range (1-255 from 0-15, assuming 0 means "no touch" so it should not occur).
>
> OTOH, I admit, that I don't have any software that can verify those
> settings. It might be that eg. one of MT_PRESSURE or MT_TOUCH_MAJOR axes
> should be dropped in this case, but with no docs I can't be sure what
> the reported values really are.
>
> This is from the original (GPL) code dump labeled 'Asus 10_6_1_27_5':
>
> | touch_size = ((i & 0x01) ? buf[size_index[i]] : (buf[size_index[i]] >> 4)) & 0x0F;
> | if(touch_size == 0) touch_size = 1;
> | if (touch_size <= 7)
> | touch_size = touch_size << 5;
> | else
> | touch_size = 255;
> |
> | input_report_abs(idev, ABS_MT_TOUCH_MAJOR, touch_size);
> | input_report_abs(idev, ABS_MT_PRESSURE, touch_size);
Okay, I also don't know how to test it properly.
If anyone knows, please let us know :)
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties
2019-12-11 16:03 ` [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties Michał Mirosław
2019-12-12 0:58 ` Dmitry Osipenko
@ 2019-12-19 21:39 ` Rob Herring
1 sibling, 0 replies; 27+ messages in thread
From: Rob Herring @ 2019-12-19 21:39 UTC (permalink / raw)
To: Michał Mirosław
Cc: linux-input, devicetree, Dmitry Torokhov, Mark Rutland,
linux-kernel, Dmitry Osipenko, Henrik Rydberg, James Chen,
Johnny Chuang, Scott Liu
On Wed, 11 Dec 2019 17:03:25 +0100, =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= wrote:
> From: Dmitry Osipenko <digetx@gmail.com>
>
> Document support of the common touchscreen properties.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> Documentation/devicetree/bindings/input/elants_i2c.txt | 4 ++++
> 1 file changed, 4 insertions(+)
>
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624
2019-12-11 16:03 ` [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624 Michał Mirosław
@ 2019-12-19 21:43 ` Rob Herring
2019-12-20 1:10 ` Dmitry Osipenko
0 siblings, 1 reply; 27+ messages in thread
From: Rob Herring @ 2019-12-19 21:43 UTC (permalink / raw)
To: Michał Mirosław
Cc: linux-input, devicetree, Dmitry Torokhov, Mark Rutland,
linux-kernel, Dmitry Osipenko, Henrik Rydberg, James Chen,
Johnny Chuang, Scott Liu
On Wed, 11 Dec 2019 17:03:26 +0100, =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= wrote:
> From: Dmitry Osipenko <digetx@gmail.com>
>
> The eKTF3624 hardware is similar to eKTH3500.
>
> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> Documentation/devicetree/bindings/input/elants_i2c.txt | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
Acked-by: Rob Herring <robh@kernel.org>
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624
2019-12-19 21:43 ` Rob Herring
@ 2019-12-20 1:10 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2019-12-20 1:10 UTC (permalink / raw)
To: Rob Herring, Michał Mirosław
Cc: linux-input, devicetree, Dmitry Torokhov, Mark Rutland,
linux-kernel, Henrik Rydberg, James Chen, Johnny Chuang,
Scott Liu
20.12.2019 00:43, Rob Herring пишет:
> On Wed, 11 Dec 2019 17:03:26 +0100, =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= wrote:
>> From: Dmitry Osipenko <digetx@gmail.com>
>>
>> The eKTF3624 hardware is similar to eKTH3500.
>>
>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
>> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
>> ---
>> Documentation/devicetree/bindings/input/elants_i2c.txt | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>
> Acked-by: Rob Herring <robh@kernel.org>
>
Thank you very much!
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
2019-12-12 19:24 ` Dmitry Torokhov
@ 2020-01-07 5:33 ` Dmitry Osipenko
2020-01-08 15:00 ` Johnny.Chuang
0 siblings, 1 reply; 27+ messages in thread
From: Dmitry Osipenko @ 2020-01-07 5:33 UTC (permalink / raw)
To: Dmitry Torokhov, Michał Mirosław, Johnny Chuang
Cc: linux-input, devicetree, Scott Liu, James Chen, linux-kernel,
Henrik Rydberg, Mark Rutland, Rob Herring
12.12.2019 22:24, Dmitry Torokhov пишет:
> On Wed, Dec 11, 2019 at 05:03:18PM +0100, Michał Mirosław wrote:
>> This series cleans up the driver a bit and implements changes needed to
>> support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
>
> Johnny, could you please take a look at this patch series?
>
> Thanks!
Hello Johnny,
Could you please let us know whether you or anyone else from Elan are
going to take a look at this patchset anytime soon?
^ permalink raw reply [flat|nested] 27+ messages in thread
* RE: [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
2020-01-07 5:33 ` Dmitry Osipenko
@ 2020-01-08 15:00 ` Johnny.Chuang
2020-01-08 15:37 ` Dmitry Osipenko
0 siblings, 1 reply; 27+ messages in thread
From: Johnny.Chuang @ 2020-01-08 15:00 UTC (permalink / raw)
To: 'Dmitry Osipenko', 'Dmitry Torokhov',
'Michał Mirosław'
Cc: linux-input, devicetree, 'Scott Liu',
'James Chen', linux-kernel, 'Henrik Rydberg',
'Mark Rutland', 'Rob Herring'
> 12.12.2019 22:24, Dmitry Torokhov пишет:
> > On Wed, Dec 11, 2019 at 05:03:18PM +0100, Michał Mirosław wrote:
> >> This series cleans up the driver a bit and implements changes needed
> >> to support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
> >
> > Johnny, could you please take a look at this patch series?
> >
> > Thanks!
>
> Hello Johnny,
>
> Could you please let us know whether you or anyone else from Elan are going
> to take a look at this patchset anytime soon?
Hi Dmitry Osipenko,
I'm sorry to reply late. James Chen will take a look at this patch set.
^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen
2020-01-08 15:00 ` Johnny.Chuang
@ 2020-01-08 15:37 ` Dmitry Osipenko
0 siblings, 0 replies; 27+ messages in thread
From: Dmitry Osipenko @ 2020-01-08 15:37 UTC (permalink / raw)
To: Johnny.Chuang, 'Dmitry Torokhov',
'Michał Mirosław'
Cc: linux-input, devicetree, 'Scott Liu',
'James Chen', linux-kernel, 'Henrik Rydberg',
'Mark Rutland', 'Rob Herring'
08.01.2020 18:00, Johnny.Chuang пишет:
>> 12.12.2019 22:24, Dmitry Torokhov пишет:
>>> On Wed, Dec 11, 2019 at 05:03:18PM +0100, Michał Mirosław wrote:
>>>> This series cleans up the driver a bit and implements changes needed
>>>> to support EKTF3624-based touchscreen used in eg. Asus TF300T tablet.
>>>
>>> Johnny, could you please take a look at this patch series?
>>>
>>> Thanks!
>>
>> Hello Johnny,
>>
>> Could you please let us know whether you or anyone else from Elan are going
>> to take a look at this patchset anytime soon?
>
> Hi Dmitry Osipenko,
>
> I'm sorry to reply late. James Chen will take a look at this patch set.
>
No problems, thank you very much.
^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2020-01-08 15:37 UTC | newest]
Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-12-11 16:03 [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 3/9] input: elants: remove unused axes Michał Mirosław
2019-12-12 0:34 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 2/9] input: elants: support old touch report format Michał Mirosław
2019-12-12 0:54 ` Dmitry Osipenko
2019-12-12 19:45 ` Michał Mirosław
2019-12-13 0:06 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 1/9] input: elants: document some registers and values Michał Mirosław
2019-12-12 0:34 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 4/9] input: elants: override touchscreen info with DT properties Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 6/9] input: elants: read touchscreen size for EKTF3624 Michał Mirosław
2019-12-12 0:39 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 5/9] input: elants: refactor elants_i2c_execute_command() Michał Mirosław
2019-12-12 0:30 ` Dmitry Osipenko
2019-12-11 16:03 ` [PATCH v2 7/9] input: elants: support 0x66 reply opcode for reporting touches Michał Mirosław
2019-12-11 16:03 ` [PATCH v2 8/9] dt-bindings: input: elants-i2c: Document common touchscreen properties Michał Mirosław
2019-12-12 0:58 ` Dmitry Osipenko
2019-12-12 1:00 ` Dmitry Osipenko
2019-12-19 21:39 ` Rob Herring
2019-12-11 16:03 ` [PATCH v2 9/9] dt-bindings: input: elants-i2c: Document eKTF3624 Michał Mirosław
2019-12-19 21:43 ` Rob Herring
2019-12-20 1:10 ` Dmitry Osipenko
2019-12-12 0:29 ` [PATCH v2 0/9] input: elants: Support Asus TF300T touchscreen Dmitry Osipenko
2019-12-12 19:24 ` Dmitry Torokhov
2020-01-07 5:33 ` Dmitry Osipenko
2020-01-08 15:00 ` Johnny.Chuang
2020-01-08 15:37 ` Dmitry Osipenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).