Hello,
this is v4 of my "Input: goodix - add axis swapping and axis inversion
support" patchset.
The goodix touchscreen driver has gained device-tree support in kernel
4.1, but doesn't currently support the touchscreen-swapped-x-y,
touchscreen-inverted-x and touchscreen-inverted-y properties.
On systems which combine a portrait-mode display with a landscape-mode
touchscreen, such as e.g. the MSI Primo 81 tablet, support for these
features is necessary to have the touchscreen and the display use the
same coordinate system.
With support for axis inversion, the "rotated_screen" flag in the
driver can also be removed, as "rotated_screen" is just a special case
of x/y axis inversion.
This patchset sits on top of the "[PATCH v11 0/8] Goodix touchscreen
enhancements" series by Irina Tirdea:
https://www.spinics.net/lists/linux-input/msg42146.html
The axis swapping has successfully been tested on an MSI Primo 81
tablet and on a Wexler TAB7200 tablet; the x/y inversion resp.
the rotated_screen functionality has successfully been tested on
a WinBook TW100.
Regards,
Karsten
Changelog:
v1: * Initial version (based von v6 of Irina Tirdea's "Goodix
touchscreen enhancements" series).
Reviewed-by: Bastien Nocera <[email protected]>
v2: * Rebase against v8 of Irina Tirdea's "Goodix touchscreen
enhancements" series.
* Fix a typo in the commit message.
* Add an update for the goodix dt bindings documentation
(patch No. 3).
* Reviews/Tests:
Patch 1+2: Tested-by: Bastien Nocera <[email protected]>
Acked-by: Bastien Nocera <[email protected]>
Patch 2+3: Reviewed-by: Irina Tirdea <[email protected]>
v3: * Rebase against v9 of Irina Tirdea's "Goodix touchscreen
enhancements" series.
* Address the review comments for patch No. 1 by Irina Tirdea
(https://www.spinics.net/lists/linux-input/msg41536.html):
- Move reading the dt properties from goodix_ts_probe to
goodix_configure_dev to make them work properly in all
configurations (with and without gpio declarations).
- Use the new unified device properties API (device_property_*)
instead of the classic DT API (of_property_*). This
provides support for ACPI 5.1 DSD properties as well as
for device-tree properties.
* Reviews/Tests:
Tested-by: Irina Tirdea <[email protected]> (with ACPI DSD properties)
Tested-by: Aleksei Mamlin <[email protected]> (with device-tree properties)
v4: * Rebase against v11 of Irina Tirdea's "Goodix touchscreen
enhancements" series (no functional changes).
Karsten Merker (3):
Input: goodix - add axis swapping and axis inversion support
Input: goodix - use "inverted_[xy]" flags instead of "rotated_screen"
Input: goodix - update dt bindings documentation (axis
swapping/inversion)
.../bindings/input/touchscreen/goodix.txt | 5 ++++
drivers/input/touchscreen/goodix.c | 31 ++++++++++++++++++----
2 files changed, 31 insertions(+), 5 deletions(-)
--
2.1.4
Implement support for the following device-tree and ACPI 5.1 DSD
properties in the goodix touchscreen driver:
- touchscreen-inverted-x: X axis is inverted (boolean)
- touchscreen-inverted-y: Y axis is inverted (boolean)
- touchscreen-swapped-x-y: X and Y axis are swapped (boolean)
These are necessary on tablets which have a display in portrait
format while the touchscreen is in landscape format, such as e.g.
the MSI Primo 81.
Signed-off-by: Karsten Merker <[email protected]>
Tested-by: Bastien Nocera <[email protected]>
Tested-by: Irina Tirdea <[email protected]> (with ACPI DSD properties)
Tested-by: Aleksei Mamlin <[email protected]> (with device-tree properties)
---
drivers/input/touchscreen/goodix.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index a793b8c..6985d72 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -2,6 +2,7 @@
* Driver for Goodix Touchscreens
*
* Copyright (c) 2014 Red Hat Inc.
+ * Copyright (c) 2015 K. Merker <[email protected]>
*
* This code is based on gt9xx.c authored by [email protected]:
*
@@ -53,6 +54,9 @@ struct goodix_ts_data {
atomic_t open_count;
/* Protects power management calls and access to suspended flag */
struct mutex mutex;
+ bool swapped_x_y;
+ bool inverted_x;
+ bool inverted_y;
};
#define GOODIX_GPIO_INT_NAME "irq"
@@ -268,6 +272,14 @@ static void goodix_ts_report_touch(struct goodix_ts_data *ts, u8 *coor_data)
input_y = ts->abs_y_max - input_y;
}
+ /* 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)
+ 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);
@@ -673,6 +685,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
error);
ts->abs_x_max = GOODIX_MAX_WIDTH;
ts->abs_y_max = GOODIX_MAX_HEIGHT;
+ if (ts->swapped_x_y)
+ swap(ts->abs_x_max, ts->abs_y_max);
ts->int_trigger_type = GOODIX_INT_TRIGGER;
ts->max_touch_num = GOODIX_MAX_CONTACTS;
return;
@@ -680,6 +694,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
ts->abs_x_max = get_unaligned_le16(&config[RESOLUTION_LOC]);
ts->abs_y_max = get_unaligned_le16(&config[RESOLUTION_LOC + 2]);
+ if (ts->swapped_x_y)
+ swap(ts->abs_x_max, ts->abs_y_max);
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) {
@@ -687,6 +703,8 @@ static void goodix_read_config(struct goodix_ts_data *ts)
"Invalid config, using defaults\n");
ts->abs_x_max = GOODIX_MAX_WIDTH;
ts->abs_y_max = GOODIX_MAX_HEIGHT;
+ if (ts->swapped_x_y)
+ swap(ts->abs_x_max, ts->abs_y_max);
ts->max_touch_num = GOODIX_MAX_CONTACTS;
}
@@ -812,6 +830,13 @@ 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);
--
2.1.4
The goodix touchscreen driver uses a "rotated_screen" flag for
systems on which the touchscreen is mounted rotated by 180
degrees with respect to the display. With the addition of
support for the dt properties "touchscreen-inverted-x" and
"touchscreen-inverted-y", a separate "rotated_screen" flag
is not necessary anymore. This patch replaces it by setting
the inverted_x and inverted_y flags instead.
Signed-off-by: Karsten Merker <[email protected]>
Reviewed-by: Irina Tirdea <[email protected]>
Tested-by: Bastien Nocera <[email protected]>
Acked-by: Bastien Nocera <[email protected]>
---
drivers/input/touchscreen/goodix.c | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 6985d72..2d888ea 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -39,7 +39,6 @@ struct goodix_ts_data {
int abs_y_max;
unsigned int max_touch_num;
unsigned int int_trigger_type;
- bool rotated_screen;
int cfg_len;
struct gpio_desc *gpiod_int;
struct gpio_desc *gpiod_rst;
@@ -267,11 +266,6 @@ 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]);
- if (ts->rotated_screen) {
- input_x = ts->abs_x_max - input_x;
- input_y = ts->abs_y_max - input_y;
- }
-
/* Inversions have to happen before axis swapping */
if (ts->inverted_x)
input_x = ts->abs_x_max - input_x;
@@ -708,10 +702,12 @@ static void goodix_read_config(struct goodix_ts_data *ts)
ts->max_touch_num = GOODIX_MAX_CONTACTS;
}
- ts->rotated_screen = dmi_check_system(rotated_screen);
- if (ts->rotated_screen)
+ 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");
+ }
}
/**
--
2.1.4
The goodix touchscreen driver has gained support for the
optional touchscreen-inverted-x, touchscreen-inverted-y
and touchscreen-swapped-x-y properties as described in
Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt.
Document these properties in the goodix bindings description.
Signed-off-by: Karsten Merker <[email protected]>
Reviewed-by: Irina Tirdea <[email protected]>
---
Documentation/devicetree/bindings/input/touchscreen/goodix.txt | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/Documentation/devicetree/bindings/input/touchscreen/goodix.txt b/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
index a8492e3..ef5f42d 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
+++ b/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
@@ -23,6 +23,11 @@ Optional properties:
device. ESD is disabled if this property is not set
or is set to 0.
+ - touchscreen-inverted-x : X axis is inverted (boolean)
+ - touchscreen-inverted-y : Y axis is inverted (boolean)
+ - touchscreen-swapped-x-y : X and Y axis are swapped (boolean)
+ (swapping is done after inverting the axis)
+
Example:
i2c@00000000 {
--
2.1.4
On Sat, Nov 21, 2015 at 02:30:22PM +0100, Karsten Merker wrote:
> The goodix touchscreen driver has gained support for the
> optional touchscreen-inverted-x, touchscreen-inverted-y
> and touchscreen-swapped-x-y properties as described in
> Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt.
>
> Document these properties in the goodix bindings description.
>
> Signed-off-by: Karsten Merker <[email protected]>
> Reviewed-by: Irina Tirdea <[email protected]>
Acked-by: Rob Herring <[email protected]>
> ---
> Documentation/devicetree/bindings/input/touchscreen/goodix.txt | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/goodix.txt b/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
> index a8492e3..ef5f42d 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
> +++ b/Documentation/devicetree/bindings/input/touchscreen/goodix.txt
> @@ -23,6 +23,11 @@ Optional properties:
> device. ESD is disabled if this property is not set
> or is set to 0.
>
> + - touchscreen-inverted-x : X axis is inverted (boolean)
> + - touchscreen-inverted-y : Y axis is inverted (boolean)
> + - touchscreen-swapped-x-y : X and Y axis are swapped (boolean)
> + (swapping is done after inverting the axis)
> +
> Example:
>
> i2c@00000000 {
> --
> 2.1.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe devicetree" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sat, Nov 21, 2015 at 02:30:19PM +0100, Karsten Merker wrote:
> Hello,
>
> this is v4 of my "Input: goodix - add axis swapping and axis inversion
> support" patchset.
>
> The goodix touchscreen driver has gained device-tree support in kernel
> 4.1, but doesn't currently support the touchscreen-swapped-x-y,
> touchscreen-inverted-x and touchscreen-inverted-y properties.
> On systems which combine a portrait-mode display with a landscape-mode
> touchscreen, such as e.g. the MSI Primo 81 tablet, support for these
> features is necessary to have the touchscreen and the display use the
> same coordinate system.
>
> With support for axis inversion, the "rotated_screen" flag in the
> driver can also be removed, as "rotated_screen" is just a special case
> of x/y axis inversion.
>
> This patchset sits on top of the "[PATCH v11 0/8] Goodix touchscreen
> enhancements" series by Irina Tirdea:
> https://www.spinics.net/lists/linux-input/msg42146.html
>
> The axis swapping has successfully been tested on an MSI Primo 81
> tablet and on a Wexler TAB7200 tablet; the x/y inversion resp.
> the rotated_screen functionality has successfully been tested on
> a WinBook TW100.
Folded 3 into 1 and applied everything, see my goodix branch.
Thanks.
--
Dmitry