| From c7e37cc6240767f794678d11704935d49cc81d59 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Thu, 3 Nov 2022 11:31:43 -0700 |
| Subject: [PATCH] Input: goodix - try resetting the controller when no config is set |
| Git-commit: c7e37cc6240767f794678d11704935d49cc81d59 |
| Patch-mainline: v6.1-rc6 |
| References: git-fixes |
| |
| 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> |
| Reviewed-by: Bastien Nocera <hadess@hadess.net> |
| Link: https://lore.kernel.org/r/20221025122930.421377-2-hdegoede@redhat.com |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Acked-by: Takashi Iwai <tiwai@suse.de> |
| |
| |
| drivers/input/touchscreen/goodix.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c |
| index a33cc7950cf5..c281e49826c2 100644 |
| |
| |
| @@ -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); |
| -- |
| 2.35.3 |
| |