linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support
@ 2015-11-21 13:30 Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 1/3] " Karsten Merker
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Karsten Merker @ 2015-11-21 13:30 UTC (permalink / raw)
  To: Bastien Nocera, Dmitry Torokhov, Irina Tirdea, Aleksei Mamlin,
	linux-input, Ian Campbell
  Cc: devicetree, linux-kernel, Chen-Yu Tsai, Karsten Merker

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 <hadess@hadess.net>

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 <hadess@hadess.net>
                 Acked-by: Bastien Nocera <hadess@hadess.net>
      Patch 2+3: Reviewed-by: Irina Tirdea <irina.tirdea@intel.com>

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 <irina.tirdea@intel.com> (with ACPI DSD properties)
      Tested-by: Aleksei Mamlin <mamlinav@gmail.com> (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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH V4 1/3] Input: goodix - add axis swapping and axis inversion support
  2015-11-21 13:30 [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Karsten Merker
@ 2015-11-21 13:30 ` Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 2/3] Input: goodix - use "inverted_[xy]" flags instead of "rotated_screen" Karsten Merker
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Karsten Merker @ 2015-11-21 13:30 UTC (permalink / raw)
  To: Bastien Nocera, Dmitry Torokhov, Irina Tirdea, Aleksei Mamlin,
	linux-input, Ian Campbell
  Cc: devicetree, linux-kernel, Chen-Yu Tsai, Karsten Merker

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 <merker@debian.org>
Tested-by: Bastien Nocera <hadess@hadess.net>
Tested-by: Irina Tirdea <irina.tirdea@intel.com> (with ACPI DSD properties)
Tested-by: Aleksei Mamlin <mamlinav@gmail.com> (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 <merker@debian.org>
  *
  *  This code is based on gt9xx.c authored by andrew@goodix.com:
  *
@@ -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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH V4 2/3] Input: goodix - use "inverted_[xy]" flags instead of "rotated_screen"
  2015-11-21 13:30 [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 1/3] " Karsten Merker
@ 2015-11-21 13:30 ` Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion) Karsten Merker
  2015-12-18  1:15 ` [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Dmitry Torokhov
  3 siblings, 0 replies; 6+ messages in thread
From: Karsten Merker @ 2015-11-21 13:30 UTC (permalink / raw)
  To: Bastien Nocera, Dmitry Torokhov, Irina Tirdea, Aleksei Mamlin,
	linux-input, Ian Campbell
  Cc: devicetree, linux-kernel, Chen-Yu Tsai, Karsten Merker

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 <merker@debian.org>
Reviewed-by: Irina Tirdea <irina.tirdea@intel.com>
Tested-by: Bastien Nocera <hadess@hadess.net>
Acked-by: Bastien Nocera <hadess@hadess.net>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion)
  2015-11-21 13:30 [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 1/3] " Karsten Merker
  2015-11-21 13:30 ` [PATCH V4 2/3] Input: goodix - use "inverted_[xy]" flags instead of "rotated_screen" Karsten Merker
@ 2015-11-21 13:30 ` Karsten Merker
  2015-11-22 22:00   ` Rob Herring
  2015-12-18  1:15 ` [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Dmitry Torokhov
  3 siblings, 1 reply; 6+ messages in thread
From: Karsten Merker @ 2015-11-21 13:30 UTC (permalink / raw)
  To: Bastien Nocera, Dmitry Torokhov, Irina Tirdea, Aleksei Mamlin,
	linux-input, Ian Campbell
  Cc: devicetree, linux-kernel, Chen-Yu Tsai, Karsten Merker

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 <merker@debian.org>
Reviewed-by: Irina Tirdea <irina.tirdea@intel.com>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion)
  2015-11-21 13:30 ` [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion) Karsten Merker
@ 2015-11-22 22:00   ` Rob Herring
  0 siblings, 0 replies; 6+ messages in thread
From: Rob Herring @ 2015-11-22 22:00 UTC (permalink / raw)
  To: Karsten Merker
  Cc: Bastien Nocera, Dmitry Torokhov, Irina Tirdea, Aleksei Mamlin,
	linux-input, Ian Campbell, devicetree, linux-kernel,
	Chen-Yu Tsai

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 <merker@debian.org>
> Reviewed-by: Irina Tirdea <irina.tirdea@intel.com>

Acked-by: Rob Herring <robh@kernel.org>

> ---
>  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 majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support
  2015-11-21 13:30 [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Karsten Merker
                   ` (2 preceding siblings ...)
  2015-11-21 13:30 ` [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion) Karsten Merker
@ 2015-12-18  1:15 ` Dmitry Torokhov
  3 siblings, 0 replies; 6+ messages in thread
From: Dmitry Torokhov @ 2015-12-18  1:15 UTC (permalink / raw)
  To: Karsten Merker
  Cc: Bastien Nocera, Irina Tirdea, Aleksei Mamlin, linux-input,
	Ian Campbell, devicetree, linux-kernel, Chen-Yu Tsai

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-12-18  1:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-21 13:30 [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Karsten Merker
2015-11-21 13:30 ` [PATCH V4 1/3] " Karsten Merker
2015-11-21 13:30 ` [PATCH V4 2/3] Input: goodix - use "inverted_[xy]" flags instead of "rotated_screen" Karsten Merker
2015-11-21 13:30 ` [PATCH V4 3/3] Input: goodix - update dt bindings documentation (axis swapping/inversion) Karsten Merker
2015-11-22 22:00   ` Rob Herring
2015-12-18  1:15 ` [PATCH V4 0/3] Input: goodix - add axis swapping and axis inversion support Dmitry Torokhov

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).