* [PATCH v2 0/3] Input: goodix - fixes and conversion to touchscreen_properties
@ 2017-11-14 12:42 Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 1/3] Input: goodix - fix reported range Marcin Niestroj
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Marcin Niestroj @ 2017-11-14 12:42 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Bastien Nocera, Antonio Ospite, linux-input, Marcin Niestroj
Hi,
This patch series originates from single patch [1], which is now patch
number 3. Fixes for swapping inverted axis and reporting supported range
are now moved to separate patches (1 and 2 in series), which make it
possible to backport these fixes to stable kernel releases.
Patches were developed and tested on kernel/git/dtor/input.git next
branch.
[1] https://www.spinics.net/lists/linux-input/msg53698.html
Marcin Niestroj (3):
Input: goodix - fix reported range
Input: goodix - fix simultaneous axes inversion and swap
Input: goodix - use generic touchscreen_properties
drivers/input/touchscreen/goodix.c | 87 +++++++++++++++-----------------------
1 file changed, 33 insertions(+), 54 deletions(-)
--
2.15.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 1/3] Input: goodix - fix reported range
2017-11-14 12:42 [PATCH v2 0/3] Input: goodix - fixes and conversion to touchscreen_properties Marcin Niestroj
@ 2017-11-14 12:42 ` Marcin Niestroj
2017-11-14 14:08 ` Bastien Nocera
2017-11-14 12:42 ` [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties Marcin Niestroj
2 siblings, 1 reply; 9+ messages in thread
From: Marcin Niestroj @ 2017-11-14 12:42 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Bastien Nocera, Antonio Ospite, linux-input, Marcin Niestroj
Touchscreen with x and y resolution should report (0:x-1), (0:y-1) as
it's range. Fix driver to do that.
Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
Fixes: ca96ea86eed4 ("Input: add driver for the Goodix touchpanel")
---
Changes v1 -> v2: patch splitted off from patch 3 (suggested by Bastien)
drivers/input/touchscreen/goodix.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 69d0b8cbc71f..7896097ca69b 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -587,8 +587,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
dev_warn(&ts->client->dev,
"Error reading config (%d), using defaults\n",
error);
- ts->abs_x_max = GOODIX_MAX_WIDTH;
- ts->abs_y_max = GOODIX_MAX_HEIGHT;
+ ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
+ ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
if (ts->swapped_x_y)
swap(ts->abs_x_max, ts->abs_y_max);
ts->int_trigger_type = GOODIX_INT_TRIGGER;
@@ -596,8 +596,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
return;
}
- ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
- ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]);
+ ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC]) - 1;
+ ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]) - 1;
if (ts->swapped_x_y)
swap(ts->abs_x_max, ts->abs_y_max);
ts->int_trigger_type = config[TRIGGER_LOC] & 0x03;
@@ -605,8 +605,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
if (!ts->abs_x_max || !ts->abs_y_max || !ts->max_touch_num) {
dev_err(&ts->client->dev,
"Invalid config, using defaults\n");
- ts->abs_x_max = GOODIX_MAX_WIDTH;
- ts->abs_y_max = GOODIX_MAX_HEIGHT;
+ ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
+ ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
if (ts->swapped_x_y)
swap(ts->abs_x_max, ts->abs_y_max);
ts->max_touch_num = GOODIX_MAX_CONTACTS;
--
2.15.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap
2017-11-14 12:42 [PATCH v2 0/3] Input: goodix - fixes and conversion to touchscreen_properties Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 1/3] Input: goodix - fix reported range Marcin Niestroj
@ 2017-11-14 12:42 ` Marcin Niestroj
2017-11-14 14:17 ` Bastien Nocera
2017-11-14 12:42 ` [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties Marcin Niestroj
2 siblings, 1 reply; 9+ messages in thread
From: Marcin Niestroj @ 2017-11-14 12:42 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Bastien Nocera, Antonio Ospite, linux-input, Marcin Niestroj
goodix_ts_data structure contains abs_x_max and abs_y_max members,
which contain already swapped maximum ranges. That causes reporting
touch events with invalid position (out of range values).
Take into account that abs_x_max and abs_y_max are already swapped
in goodix_ts_report_touch(), so position for inverted axes will be
calculated correctly.
Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
Fixes: ad48cf5e9597 ("Input: goodix - add axis swapping and axis inversion support")
---
Changes v1 -> v2: patch splitted off from patch 3 (suggested by Bastien)
drivers/input/touchscreen/goodix.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 7896097ca69b..dc832890f6d3 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -296,12 +296,18 @@ static void goodix_ts_report_touch(struct goodix_ts_data *ts, u8 *coor_data)
int input_w = get_unaligned_le16(&coor_data[5]);
/* Inversions have to happen before axis swapping */
- if (ts->inverted_x)
- input_x = ts->abs_x_max - input_x;
- if (ts->inverted_y)
- input_y = ts->abs_y_max - input_y;
- if (ts->swapped_x_y)
+ if (!ts->swapped_x_y) {
+ if (ts->inverted_x)
+ input_x = ts->abs_x_max - input_x;
+ if (ts->inverted_y)
+ input_y = ts->abs_y_max - input_y;
+ } else {
+ if (ts->inverted_x)
+ input_x = ts->abs_y_max - input_x;
+ if (ts->inverted_y)
+ input_y = ts->abs_x_max - input_y;
swap(input_x, input_y);
+ }
input_mt_slot(ts->input_dev, id);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);
--
2.15.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties
2017-11-14 12:42 [PATCH v2 0/3] Input: goodix - fixes and conversion to touchscreen_properties Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 1/3] Input: goodix - fix reported range Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap Marcin Niestroj
@ 2017-11-14 12:42 ` Marcin Niestroj
2017-11-14 14:37 ` Bastien Nocera
2 siblings, 1 reply; 9+ messages in thread
From: Marcin Niestroj @ 2017-11-14 12:42 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Bastien Nocera, Antonio Ospite, linux-input, Marcin Niestroj
Use touchscreen_properties structure instead of implementing all
properties by our own. It allows to reuse generic code for parsing
device-tree properties (which was implemented manually in the driver
for now). Additionally, it allows us to report events using generic
touchscreen_report_pos(), which automatically handles inverted and
swapped axes.
Developed and tested on custom DT-based device with gt1151 touch
panel.
Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
---
Changes v1 -> v2:
* rebased on patches 1 and 2 in series
* added description of test board in changelog (suggested by Bastien)
drivers/input/touchscreen/goodix.c | 93 ++++++++++++++------------------------
1 file changed, 33 insertions(+), 60 deletions(-)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index dc832890f6d3..f82101cd9c04 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -22,6 +22,7 @@
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/input/mt.h>
+#include <linux/input/touchscreen.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/irq.h>
@@ -43,11 +44,7 @@ struct goodix_ts_data {
struct i2c_client *client;
struct input_dev *input_dev;
const struct goodix_chip_data *chip;
- int abs_x_max;
- int abs_y_max;
- bool swapped_x_y;
- bool inverted_x;
- bool inverted_y;
+ struct touchscreen_properties prop;
unsigned int max_touch_num;
unsigned int int_trigger_type;
struct gpio_desc *gpiod_int;
@@ -295,24 +292,10 @@ static void goodix_ts_report_touch(struct goodix_ts_data *ts, u8 *coor_data)
int input_y = get_unaligned_le16(&coor_data[3]);
int input_w = get_unaligned_le16(&coor_data[5]);
- /* Inversions have to happen before axis swapping */
- if (!ts->swapped_x_y) {
- if (ts->inverted_x)
- input_x = ts->abs_x_max - input_x;
- if (ts->inverted_y)
- input_y = ts->abs_y_max - input_y;
- } else {
- if (ts->inverted_x)
- input_x = ts->abs_y_max - input_x;
- if (ts->inverted_y)
- input_y = ts->abs_x_max - input_y;
- swap(input_x, input_y);
- }
-
input_mt_slot(ts->input_dev, id);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true);
- input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);
- input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y);
+ touchscreen_report_pos(ts->input_dev, &ts->prop, input_x, input_y,
+ true);
input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, input_w);
input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, input_w);
}
@@ -585,6 +568,7 @@ static int goodix_get_gpio_config(struct goodix_ts_data *ts)
static void goodix_read_config(struct goodix_ts_data *ts)
{
u8 config[GOODIX_CONFIG_MAX_LENGTH];
+ int x_max, y_max;
int error;
error = goodix_i2c_read(ts->client, ts->chip->config_addr,
@@ -593,37 +577,34 @@ static void goodix_read_config(struct goodix_ts_data *ts)
dev_warn(&ts->client->dev,
"Error reading config (%d), using defaults\n",
error);
- ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
- ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
- if (ts->swapped_x_y)
- swap(ts->abs_x_max, ts->abs_y_max);
+ x_max = GOODIX_MAX_WIDTH;
+ y_max = GOODIX_MAX_HEIGHT;
ts->int_trigger_type = GOODIX_INT_TRIGGER;
ts->max_touch_num = GOODIX_MAX_CONTACTS;
- return;
+ goto input_set_params;
}
- ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC]) - 1;
- ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]) - 1;
- if (ts->swapped_x_y)
- swap(ts->abs_x_max, ts->abs_y_max);
+ x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
+ y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]);
ts->int_trigger_type = config[TRIGGER_LOC] & 0x03;
ts->max_touch_num = config[MAX_CONTACTS_LOC] & 0x0f;
- if (!ts->abs_x_max || !ts->abs_y_max || !ts->max_touch_num) {
+ if (!x_max || !y_max || !ts->max_touch_num) {
dev_err(&ts->client->dev,
"Invalid config, using defaults\n");
- ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
- ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
- if (ts->swapped_x_y)
- swap(ts->abs_x_max, ts->abs_y_max);
+ x_max = GOODIX_MAX_WIDTH;
+ y_max = GOODIX_MAX_HEIGHT;
ts->max_touch_num = GOODIX_MAX_CONTACTS;
}
- if (dmi_check_system(rotated_screen)) {
- ts->inverted_x = true;
- ts->inverted_y = true;
- dev_dbg(&ts->client->dev,
- "Applying '180 degrees rotated screen' quirk\n");
- }
+input_set_params:
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
+ 0, x_max - 1, 0, 0);
+ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
+ 0, y_max - 1, 0, 0);
+ input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
+ input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
+ input_mt_init_slots(ts->input_dev, ts->max_touch_num,
+ INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
}
/**
@@ -698,16 +679,6 @@ static int goodix_request_input_dev(struct goodix_ts_data *ts)
return -ENOMEM;
}
- input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
- 0, ts->abs_x_max, 0, 0);
- input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
- 0, ts->abs_y_max, 0, 0);
- input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
- input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
-
- input_mt_init_slots(ts->input_dev, ts->max_touch_num,
- INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
-
ts->input_dev->name = "Goodix Capacitive TouchScreen";
ts->input_dev->phys = "input/ts";
ts->input_dev->id.bustype = BUS_I2C;
@@ -742,19 +713,21 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
{
int error;
- ts->swapped_x_y = device_property_read_bool(&ts->client->dev,
- "touchscreen-swapped-x-y");
- ts->inverted_x = device_property_read_bool(&ts->client->dev,
- "touchscreen-inverted-x");
- ts->inverted_y = device_property_read_bool(&ts->client->dev,
- "touchscreen-inverted-y");
-
- goodix_read_config(ts);
-
error = goodix_request_input_dev(ts);
if (error)
return error;
+ goodix_read_config(ts);
+
+ touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
+
+ if (dmi_check_system(rotated_screen)) {
+ ts->prop.invert_x = true;
+ ts->prop.invert_y = true;
+ dev_dbg(&ts->client->dev,
+ "Applying '180 degrees rotated screen' quirk\n");
+ }
+
ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] | IRQF_ONESHOT;
error = goodix_request_irq(ts);
if (error) {
--
2.15.0
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/3] Input: goodix - fix reported range
2017-11-14 12:42 ` [PATCH v2 1/3] Input: goodix - fix reported range Marcin Niestroj
@ 2017-11-14 14:08 ` Bastien Nocera
0 siblings, 0 replies; 9+ messages in thread
From: Bastien Nocera @ 2017-11-14 14:08 UTC (permalink / raw)
To: Marcin Niestroj, Dmitry Torokhov; +Cc: Antonio Ospite, linux-input
On Tue, 2017-11-14 at 13:42 +0100, Marcin Niestroj wrote:
> Touchscreen with x and y resolution should report (0:x-1), (0:y-1) as
I would say that the coordinates are 0-indexed.
> it's range. Fix driver to do that.
"its".
> Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
> Fixes: ca96ea86eed4 ("Input: add driver for the Goodix touchpanel")
I'm not sure that a Fixes is necessary for the original inclusion of
the driver, is it? Otherwise you're always fixing the inclusion of the
driver.
Looks good otherwise.
> ---
> Changes v1 -> v2: patch splitted off from patch 3 (suggested by
> Bastien)
>
> drivers/input/touchscreen/goodix.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/input/touchscreen/goodix.c
> b/drivers/input/touchscreen/goodix.c
> index 69d0b8cbc71f..7896097ca69b 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -587,8 +587,8 @@ static void goodix_read_config(struct
> goodix_ts_data *ts)
> dev_warn(&ts->client->dev,
> "Error reading config (%d), using
> defaults\n",
> error);
> - ts->abs_x_max = GOODIX_MAX_WIDTH;
> - ts->abs_y_max = GOODIX_MAX_HEIGHT;
> + ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> + ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> if (ts->swapped_x_y)
> swap(ts->abs_x_max, ts->abs_y_max);
> ts->int_trigger_type = GOODIX_INT_TRIGGER;
> @@ -596,8 +596,8 @@ static void goodix_read_config(struct
> goodix_ts_data *ts)
> return;
> }
>
> - ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
> - ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC +
> 2]);
> + ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC])
> - 1;
> + ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC +
> 2]) - 1;
> if (ts->swapped_x_y)
> swap(ts->abs_x_max, ts->abs_y_max);
> ts->int_trigger_type = config[TRIGGER_LOC] & 0x03;
> @@ -605,8 +605,8 @@ static void goodix_read_config(struct
> goodix_ts_data *ts)
> if (!ts->abs_x_max || !ts->abs_y_max || !ts->max_touch_num)
> {
> dev_err(&ts->client->dev,
> "Invalid config, using defaults\n");
> - ts->abs_x_max = GOODIX_MAX_WIDTH;
> - ts->abs_y_max = GOODIX_MAX_HEIGHT;
> + ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> + ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> if (ts->swapped_x_y)
> swap(ts->abs_x_max, ts->abs_y_max);
> ts->max_touch_num = GOODIX_MAX_CONTACTS;
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap
2017-11-14 12:42 ` [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap Marcin Niestroj
@ 2017-11-14 14:17 ` Bastien Nocera
0 siblings, 0 replies; 9+ messages in thread
From: Bastien Nocera @ 2017-11-14 14:17 UTC (permalink / raw)
To: Marcin Niestroj, Dmitry Torokhov; +Cc: Antonio Ospite, linux-input
On Tue, 2017-11-14 at 13:42 +0100, Marcin Niestroj wrote:
> goodix_ts_data structure contains abs_x_max and abs_y_max members,
> which contain already swapped maximum ranges. That causes reporting
> touch events with invalid position (out of range values).
>
> Take into account that abs_x_max and abs_y_max are already swapped
> in goodix_ts_report_touch(), so position for inverted axes will be
> calculated correctly.
Could you please also add an explanation as to when the problem occurs?
>
> Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
> Fixes: ad48cf5e9597 ("Input: goodix - add axis swapping and axis
> inversion support")
> ---
> Changes v1 -> v2: patch splitted off from patch 3 (suggested by
> Bastien)
>
> drivers/input/touchscreen/goodix.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/touchscreen/goodix.c
> b/drivers/input/touchscreen/goodix.c
> index 7896097ca69b..dc832890f6d3 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -296,12 +296,18 @@ static void goodix_ts_report_touch(struct
> goodix_ts_data *ts, u8 *coor_data)
> int input_w = get_unaligned_le16(&coor_data[5]);
>
> /* Inversions have to happen before axis swapping */
> - if (ts->inverted_x)
> - input_x = ts->abs_x_max - input_x;
> - if (ts->inverted_y)
> - input_y = ts->abs_y_max - input_y;
> - if (ts->swapped_x_y)
> + if (!ts->swapped_x_y) {
> + if (ts->inverted_x)
> + input_x = ts->abs_x_max - input_x;
> + if (ts->inverted_y)
> + input_y = ts->abs_y_max - input_y;
> + } else {
> + if (ts->inverted_x)
> + input_x = ts->abs_y_max - input_x;
> + if (ts->inverted_y)
> + input_y = ts->abs_x_max - input_y;
> swap(input_x, input_y);
> + }
>
> input_mt_slot(ts->input_dev, id);
> input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER,
> true);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties
2017-11-14 12:42 ` [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties Marcin Niestroj
@ 2017-11-14 14:37 ` Bastien Nocera
2017-11-14 18:03 ` Dmitry Torokhov
0 siblings, 1 reply; 9+ messages in thread
From: Bastien Nocera @ 2017-11-14 14:37 UTC (permalink / raw)
To: Marcin Niestroj, Dmitry Torokhov; +Cc: Antonio Ospite, linux-input
On Tue, 2017-11-14 at 13:42 +0100, Marcin Niestroj wrote:
> Use touchscreen_properties structure instead of implementing all
> properties by our own. It allows to reuse generic code for parsing
"It allows reusing"
or
"It allows us to reuse".
> device-tree properties (which was implemented manually in the driver
> for now). Additionally, it allows us to report events using generic
> touchscreen_report_pos(), which automatically handles inverted and
> swapped axes.
Looks good otherwise. Yay for code removal.
>
> Developed and tested on custom DT-based device with gt1151 touch
> panel.
>
> Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
> ---
> Changes v1 -> v2:
> * rebased on patches 1 and 2 in series
> * added description of test board in changelog (suggested by
> Bastien)
>
> drivers/input/touchscreen/goodix.c | 93 ++++++++++++++------------
> ------------
> 1 file changed, 33 insertions(+), 60 deletions(-)
>
> diff --git a/drivers/input/touchscreen/goodix.c
> b/drivers/input/touchscreen/goodix.c
> index dc832890f6d3..f82101cd9c04 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -22,6 +22,7 @@
> #include <linux/i2c.h>
> #include <linux/input.h>
> #include <linux/input/mt.h>
> +#include <linux/input/touchscreen.h>
> #include <linux/module.h>
> #include <linux/delay.h>
> #include <linux/irq.h>
> @@ -43,11 +44,7 @@ struct goodix_ts_data {
> struct i2c_client *client;
> struct input_dev *input_dev;
> const struct goodix_chip_data *chip;
> - int abs_x_max;
> - int abs_y_max;
> - bool swapped_x_y;
> - bool inverted_x;
> - bool inverted_y;
> + struct touchscreen_properties prop;
> unsigned int max_touch_num;
> unsigned int int_trigger_type;
> struct gpio_desc *gpiod_int;
> @@ -295,24 +292,10 @@ static void goodix_ts_report_touch(struct
> goodix_ts_data *ts, u8 *coor_data)
> int input_y = get_unaligned_le16(&coor_data[3]);
> int input_w = get_unaligned_le16(&coor_data[5]);
>
> - /* Inversions have to happen before axis swapping */
> - if (!ts->swapped_x_y) {
> - if (ts->inverted_x)
> - input_x = ts->abs_x_max - input_x;
> - if (ts->inverted_y)
> - input_y = ts->abs_y_max - input_y;
> - } else {
> - if (ts->inverted_x)
> - input_x = ts->abs_y_max - input_x;
> - if (ts->inverted_y)
> - input_y = ts->abs_x_max - input_y;
> - swap(input_x, input_y);
> - }
> -
> input_mt_slot(ts->input_dev, id);
> input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER,
> true);
> - input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);
> - input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y);
> + touchscreen_report_pos(ts->input_dev, &ts->prop, input_x,
> input_y,
> + true);
> input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,
> input_w);
> input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,
> input_w);
> }
> @@ -585,6 +568,7 @@ static int goodix_get_gpio_config(struct
> goodix_ts_data *ts)
> static void goodix_read_config(struct goodix_ts_data *ts)
> {
> u8 config[GOODIX_CONFIG_MAX_LENGTH];
> + int x_max, y_max;
> int error;
>
> error = goodix_i2c_read(ts->client, ts->chip->config_addr,
> @@ -593,37 +577,34 @@ static void goodix_read_config(struct
> goodix_ts_data *ts)
> dev_warn(&ts->client->dev,
> "Error reading config (%d), using
> defaults\n",
> error);
> - ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> - ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> - if (ts->swapped_x_y)
> - swap(ts->abs_x_max, ts->abs_y_max);
> + x_max = GOODIX_MAX_WIDTH;
> + y_max = GOODIX_MAX_HEIGHT;
> ts->int_trigger_type = GOODIX_INT_TRIGGER;
> ts->max_touch_num = GOODIX_MAX_CONTACTS;
> - return;
> + goto input_set_params;
> }
>
> - ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC])
> - 1;
> - ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC +
> 2]) - 1;
> - if (ts->swapped_x_y)
> - swap(ts->abs_x_max, ts->abs_y_max);
> + x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
> + y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]);
> ts->int_trigger_type = config[TRIGGER_LOC] & 0x03;
> ts->max_touch_num = config[MAX_CONTACTS_LOC] & 0x0f;
> - if (!ts->abs_x_max || !ts->abs_y_max || !ts->max_touch_num)
> {
> + if (!x_max || !y_max || !ts->max_touch_num) {
> dev_err(&ts->client->dev,
> "Invalid config, using defaults\n");
> - ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> - ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> - if (ts->swapped_x_y)
> - swap(ts->abs_x_max, ts->abs_y_max);
> + x_max = GOODIX_MAX_WIDTH;
> + y_max = GOODIX_MAX_HEIGHT;
> ts->max_touch_num = GOODIX_MAX_CONTACTS;
> }
>
> - if (dmi_check_system(rotated_screen)) {
> - ts->inverted_x = true;
> - ts->inverted_y = true;
> - dev_dbg(&ts->client->dev,
> - "Applying '180 degrees rotated screen'
> quirk\n");
> - }
> +input_set_params:
> + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
> + 0, x_max - 1, 0, 0);
> + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
> + 0, y_max - 1, 0, 0);
> + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0,
> 255, 0, 0);
> + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0,
> 255, 0, 0);
> + input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> }
>
> /**
> @@ -698,16 +679,6 @@ static int goodix_request_input_dev(struct
> goodix_ts_data *ts)
> return -ENOMEM;
> }
>
> - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
> - 0, ts->abs_x_max, 0, 0);
> - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
> - 0, ts->abs_y_max, 0, 0);
> - input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0,
> 255, 0, 0);
> - input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0,
> 255, 0, 0);
> -
> - input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> - INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> -
> ts->input_dev->name = "Goodix Capacitive TouchScreen";
> ts->input_dev->phys = "input/ts";
> ts->input_dev->id.bustype = BUS_I2C;
> @@ -742,19 +713,21 @@ static int goodix_configure_dev(struct
> goodix_ts_data *ts)
> {
> int error;
>
> - ts->swapped_x_y = device_property_read_bool(&ts->client-
> >dev,
> - "touchscreen-
> swapped-x-y");
> - ts->inverted_x = device_property_read_bool(&ts->client->dev,
> - "touchscreen-
> inverted-x");
> - ts->inverted_y = device_property_read_bool(&ts->client->dev,
> - "touchscreen-
> inverted-y");
> -
> - goodix_read_config(ts);
> -
> error = goodix_request_input_dev(ts);
> if (error)
> return error;
>
> + goodix_read_config(ts);
> +
> + touchscreen_parse_properties(ts->input_dev, true, &ts-
> >prop);
> +
> + if (dmi_check_system(rotated_screen)) {
> + ts->prop.invert_x = true;
> + ts->prop.invert_y = true;
> + dev_dbg(&ts->client->dev,
> + "Applying '180 degrees rotated screen'
> quirk\n");
> + }
> +
> ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] |
> IRQF_ONESHOT;
> error = goodix_request_irq(ts);
> if (error) {
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties
2017-11-14 14:37 ` Bastien Nocera
@ 2017-11-14 18:03 ` Dmitry Torokhov
2017-11-15 13:43 ` Bastien Nocera
0 siblings, 1 reply; 9+ messages in thread
From: Dmitry Torokhov @ 2017-11-14 18:03 UTC (permalink / raw)
To: Bastien Nocera; +Cc: Marcin Niestroj, Antonio Ospite, linux-input
On Tue, Nov 14, 2017 at 03:37:09PM +0100, Bastien Nocera wrote:
> On Tue, 2017-11-14 at 13:42 +0100, Marcin Niestroj wrote:
> > Use touchscreen_properties structure instead of implementing all
> > properties by our own. It allows to reuse generic code for parsing
>
> "It allows reusing"
> or
> "It allows us to reuse".
>
> > device-tree properties (which was implemented manually in the driver
> > for now). Additionally, it allows us to report events using generic
> > touchscreen_report_pos(), which automatically handles inverted and
> > swapped axes.
>
> Looks good otherwise. Yay for code removal.
I am sorry, but I am confused as to why we had to go through all this
pain fixing the custom code in the driver and then replacing it all with
touchscreen helpers?
If generic code is shorter and also fixed the bug I do not see the
reason for intermediate steps...
>
> >
> > Developed and tested on custom DT-based device with gt1151 touch
> > panel.
> >
> > Signed-off-by: Marcin Niestroj <m.niestroj@grinn-global.com>
> > ---
> > Changes v1 -> v2:
> > * rebased on patches 1 and 2 in series
> > * added description of test board in changelog (suggested by
> > Bastien)
> >
> > drivers/input/touchscreen/goodix.c | 93 ++++++++++++++------------
> > ------------
> > 1 file changed, 33 insertions(+), 60 deletions(-)
> >
> > diff --git a/drivers/input/touchscreen/goodix.c
> > b/drivers/input/touchscreen/goodix.c
> > index dc832890f6d3..f82101cd9c04 100644
> > --- a/drivers/input/touchscreen/goodix.c
> > +++ b/drivers/input/touchscreen/goodix.c
> > @@ -22,6 +22,7 @@
> > #include <linux/i2c.h>
> > #include <linux/input.h>
> > #include <linux/input/mt.h>
> > +#include <linux/input/touchscreen.h>
> > #include <linux/module.h>
> > #include <linux/delay.h>
> > #include <linux/irq.h>
> > @@ -43,11 +44,7 @@ struct goodix_ts_data {
> > struct i2c_client *client;
> > struct input_dev *input_dev;
> > const struct goodix_chip_data *chip;
> > - int abs_x_max;
> > - int abs_y_max;
> > - bool swapped_x_y;
> > - bool inverted_x;
> > - bool inverted_y;
> > + struct touchscreen_properties prop;
> > unsigned int max_touch_num;
> > unsigned int int_trigger_type;
> > struct gpio_desc *gpiod_int;
> > @@ -295,24 +292,10 @@ static void goodix_ts_report_touch(struct
> > goodix_ts_data *ts, u8 *coor_data)
> > int input_y = get_unaligned_le16(&coor_data[3]);
> > int input_w = get_unaligned_le16(&coor_data[5]);
> >
> > - /* Inversions have to happen before axis swapping */
> > - if (!ts->swapped_x_y) {
> > - if (ts->inverted_x)
> > - input_x = ts->abs_x_max - input_x;
> > - if (ts->inverted_y)
> > - input_y = ts->abs_y_max - input_y;
> > - } else {
> > - if (ts->inverted_x)
> > - input_x = ts->abs_y_max - input_x;
> > - if (ts->inverted_y)
> > - input_y = ts->abs_x_max - input_y;
> > - swap(input_x, input_y);
> > - }
> > -
> > input_mt_slot(ts->input_dev, id);
> > input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER,
> > true);
> > - input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x);
> > - input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y);
> > + touchscreen_report_pos(ts->input_dev, &ts->prop, input_x,
> > input_y,
> > + true);
> > input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR,
> > input_w);
> > input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR,
> > input_w);
> > }
> > @@ -585,6 +568,7 @@ static int goodix_get_gpio_config(struct
> > goodix_ts_data *ts)
> > static void goodix_read_config(struct goodix_ts_data *ts)
> > {
> > u8 config[GOODIX_CONFIG_MAX_LENGTH];
> > + int x_max, y_max;
> > int error;
> >
> > error = goodix_i2c_read(ts->client, ts->chip->config_addr,
> > @@ -593,37 +577,34 @@ static void goodix_read_config(struct
> > goodix_ts_data *ts)
> > dev_warn(&ts->client->dev,
> > "Error reading config (%d), using
> > defaults\n",
> > error);
> > - ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> > - ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> > - if (ts->swapped_x_y)
> > - swap(ts->abs_x_max, ts->abs_y_max);
> > + x_max = GOODIX_MAX_WIDTH;
> > + y_max = GOODIX_MAX_HEIGHT;
> > ts->int_trigger_type = GOODIX_INT_TRIGGER;
> > ts->max_touch_num = GOODIX_MAX_CONTACTS;
> > - return;
> > + goto input_set_params;
> > }
> >
> > - ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC])
> > - 1;
> > - ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC +
> > 2]) - 1;
> > - if (ts->swapped_x_y)
> > - swap(ts->abs_x_max, ts->abs_y_max);
> > + x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
> > + y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]);
> > ts->int_trigger_type = config[TRIGGER_LOC] & 0x03;
> > ts->max_touch_num = config[MAX_CONTACTS_LOC] & 0x0f;
> > - if (!ts->abs_x_max || !ts->abs_y_max || !ts->max_touch_num)
> > {
> > + if (!x_max || !y_max || !ts->max_touch_num) {
> > dev_err(&ts->client->dev,
> > "Invalid config, using defaults\n");
> > - ts->abs_x_max = GOODIX_MAX_WIDTH - 1;
> > - ts->abs_y_max = GOODIX_MAX_HEIGHT - 1;
> > - if (ts->swapped_x_y)
> > - swap(ts->abs_x_max, ts->abs_y_max);
> > + x_max = GOODIX_MAX_WIDTH;
> > + y_max = GOODIX_MAX_HEIGHT;
> > ts->max_touch_num = GOODIX_MAX_CONTACTS;
> > }
> >
> > - if (dmi_check_system(rotated_screen)) {
> > - ts->inverted_x = true;
> > - ts->inverted_y = true;
> > - dev_dbg(&ts->client->dev,
> > - "Applying '180 degrees rotated screen'
> > quirk\n");
> > - }
> > +input_set_params:
> > + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
> > + 0, x_max - 1, 0, 0);
> > + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
> > + 0, y_max - 1, 0, 0);
> > + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0,
> > 255, 0, 0);
> > + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0,
> > 255, 0, 0);
> > + input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> > + INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> > }
> >
> > /**
> > @@ -698,16 +679,6 @@ static int goodix_request_input_dev(struct
> > goodix_ts_data *ts)
> > return -ENOMEM;
> > }
> >
> > - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X,
> > - 0, ts->abs_x_max, 0, 0);
> > - input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y,
> > - 0, ts->abs_y_max, 0, 0);
> > - input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0,
> > 255, 0, 0);
> > - input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0,
> > 255, 0, 0);
> > -
> > - input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> > - INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> > -
> > ts->input_dev->name = "Goodix Capacitive TouchScreen";
> > ts->input_dev->phys = "input/ts";
> > ts->input_dev->id.bustype = BUS_I2C;
> > @@ -742,19 +713,21 @@ static int goodix_configure_dev(struct
> > goodix_ts_data *ts)
> > {
> > int error;
> >
> > - ts->swapped_x_y = device_property_read_bool(&ts->client-
> > >dev,
> > - "touchscreen-
> > swapped-x-y");
> > - ts->inverted_x = device_property_read_bool(&ts->client->dev,
> > - "touchscreen-
> > inverted-x");
> > - ts->inverted_y = device_property_read_bool(&ts->client->dev,
> > - "touchscreen-
> > inverted-y");
> > -
> > - goodix_read_config(ts);
> > -
> > error = goodix_request_input_dev(ts);
> > if (error)
> > return error;
> >
> > + goodix_read_config(ts);
> > +
> > + touchscreen_parse_properties(ts->input_dev, true, &ts-
> > >prop);
> > +
> > + if (dmi_check_system(rotated_screen)) {
> > + ts->prop.invert_x = true;
> > + ts->prop.invert_y = true;
> > + dev_dbg(&ts->client->dev,
> > + "Applying '180 degrees rotated screen'
> > quirk\n");
> > + }
> > +
> > ts->irq_flags = goodix_irq_flags[ts->int_trigger_type] |
> > IRQF_ONESHOT;
> > error = goodix_request_irq(ts);
> > if (error) {
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties
2017-11-14 18:03 ` Dmitry Torokhov
@ 2017-11-15 13:43 ` Bastien Nocera
0 siblings, 0 replies; 9+ messages in thread
From: Bastien Nocera @ 2017-11-15 13:43 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: Marcin Niestroj, Antonio Ospite, linux-input
On Tue, 2017-11-14 at 10:03 -0800, Dmitry Torokhov wrote:
> On Tue, Nov 14, 2017 at 03:37:09PM +0100, Bastien Nocera wrote:
> > On Tue, 2017-11-14 at 13:42 +0100, Marcin Niestroj wrote:
> > > Use touchscreen_properties structure instead of implementing all
> > > properties by our own. It allows to reuse generic code for
> > > parsing
> >
> > "It allows reusing"
> > or
> > "It allows us to reuse".
> >
> > > device-tree properties (which was implemented manually in the
> > > driver
> > > for now). Additionally, it allows us to report events using
> > > generic
> > > touchscreen_report_pos(), which automatically handles inverted
> > > and
> > > swapped axes.
> >
> > Looks good otherwise. Yay for code removal.
>
> I am sorry, but I am confused as to why we had to go through all this
> pain fixing the custom code in the driver and then replacing it all
> with
> touchscreen helpers?
>
> If generic code is shorter and also fixed the bug I do not see the
> reason for intermediate steps...
Patch 2 and 3 can probably be melded. I'm guessing that an intermediate
change makes it more obvious what the fixes are, and could help with
backporting. Up to you.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2017-11-15 13:43 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-11-14 12:42 [PATCH v2 0/3] Input: goodix - fixes and conversion to touchscreen_properties Marcin Niestroj
2017-11-14 12:42 ` [PATCH v2 1/3] Input: goodix - fix reported range Marcin Niestroj
2017-11-14 14:08 ` Bastien Nocera
2017-11-14 12:42 ` [PATCH v2 2/3] Input: goodix - fix simultaneous axes inversion and swap Marcin Niestroj
2017-11-14 14:17 ` Bastien Nocera
2017-11-14 12:42 ` [PATCH v2 3/3] Input: goodix - use generic touchscreen_properties Marcin Niestroj
2017-11-14 14:37 ` Bastien Nocera
2017-11-14 18:03 ` Dmitry Torokhov
2017-11-15 13:43 ` Bastien Nocera
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox