diff mbox series

[1/4] Input: goodix - Try resetting the controller when no config is set

Message ID 20221025122930.421377-2-hdegoede@redhat.com (mailing list archive)
State Accepted
Commit c7e37cc6240767f794678d11704935d49cc81d59
Headers show
Series Input: touchscreen - Goodix bugfix + settings mod-param support | expand

Commit Message

Hans de Goede Oct. 25, 2022, 12:29 p.m. UTC
On ACPI systems (irq_pin_access_method == IRQ_PIN_ACCESS_ACPI_*) the driver
does not reset the controller at probe time, because sometimes the system
firmware loads a config and resetting might loose this config.

On the Nanote UMPC-01 device OTOH the config is in flash of the controller,
the controller needs a reset to load this; and the system firmware does not
reset the controller on a cold boot.

To fix the Nanote UMPC-01 touchscreen not working on a cold boot, try
resetting the controller and then re-reading the config when encountering
a config with 0 width/height/max_touch_num value and the controller has
not already been reset by goodix_ts_probe().

This should be safe to do in general because normally we should never
encounter a config with 0 width/height/max_touch_num. Doing this in
general not only avoids the need for a DMI quirk, but also might help
other systems.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/touchscreen/goodix.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Bastien Nocera Oct. 31, 2022, 2:42 p.m. UTC | #1
On Tue, 2022-10-25 at 14:29 +0200, Hans de Goede wrote:
> On ACPI systems (irq_pin_access_method == IRQ_PIN_ACCESS_ACPI_*) the
> driver
> does not reset the controller at probe time, because sometimes the
> system
> firmware loads a config and resetting might loose this config.

"lose".

You can add
Reviewed-by: Bastien Nocera <hadess@hadess.net>
to all 4 patches in this patchset that don't already have it.

Cheers
Hans de Goede Oct. 31, 2022, 6:18 p.m. UTC | #2
Hi,

On 10/31/22 15:42, Bastien Nocera wrote:
> On Tue, 2022-10-25 at 14:29 +0200, Hans de Goede wrote:
>> On ACPI systems (irq_pin_access_method == IRQ_PIN_ACCESS_ACPI_*) the
>> driver
>> does not reset the controller at probe time, because sometimes the
>> system
>> firmware loads a config and resetting might loose this config.
> 
> "lose".
> 
> You can add
> Reviewed-by: Bastien Nocera <hadess@hadess.net>
> to all 4 patches in this patchset that don't already have it.

Thank you.

Dmitry, I assume you can fix the small spelling error in the
commit msg while applying this?

Regards,

Hans
Dmitry Torokhov Nov. 3, 2022, 6:32 p.m. UTC | #3
On Tue, Oct 25, 2022 at 02:29:27PM +0200, Hans de Goede wrote:
> On ACPI systems (irq_pin_access_method == IRQ_PIN_ACCESS_ACPI_*) the driver
> does not reset the controller at probe time, because sometimes the system
> firmware loads a config and resetting might loose this config.
> 
> On the Nanote UMPC-01 device OTOH the config is in flash of the controller,
> the controller needs a reset to load this; and the system firmware does not
> reset the controller on a cold boot.
> 
> To fix the Nanote UMPC-01 touchscreen not working on a cold boot, try
> resetting the controller and then re-reading the config when encountering
> a config with 0 width/height/max_touch_num value and the controller has
> not already been reset by goodix_ts_probe().
> 
> This should be safe to do in general because normally we should never
> encounter a config with 0 width/height/max_touch_num. Doing this in
> general not only avoids the need for a DMI quirk, but also might help
> other systems.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Applied, thank you.
diff mbox series

Patch

diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index a33cc7950cf5..c281e49826c2 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -1158,6 +1158,7 @@  static int goodix_configure_dev(struct goodix_ts_data *ts)
 	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);
 
+retry_read_config:
 	/* Read configuration and apply touchscreen parameters */
 	goodix_read_config(ts);
 
@@ -1165,6 +1166,16 @@  static int goodix_configure_dev(struct goodix_ts_data *ts)
 	touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
 
 	if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) {
+		if (!ts->reset_controller_at_probe &&
+		    ts->irq_pin_access_method != IRQ_PIN_ACCESS_NONE) {
+			dev_info(&ts->client->dev, "Config not set, resetting controller\n");
+			/* Retry after a controller reset */
+			ts->reset_controller_at_probe = true;
+			error = goodix_reset(ts);
+			if (error)
+				return error;
+			goto retry_read_config;
+		}
 		dev_err(&ts->client->dev,
 			"Invalid config (%d, %d, %d), using defaults\n",
 			ts->prop.max_x, ts->prop.max_y, ts->max_touch_num);