lkml.org 
[lkml]   [2022]   [Nov]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.10 06/22] Input: goodix - try resetting the controller when no config is set
    Date
    From: Hans de Goede <hdegoede@redhat.com>

    [ Upstream commit c7e37cc6240767f794678d11704935d49cc81d59 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 b23abde5d7db..b7f87ad4b9a9 100644
    --- a/drivers/input/touchscreen/goodix.c
    +++ b/drivers/input/touchscreen/goodix.c
    @@ -1059,6 +1059,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);

    @@ -1066,6 +1067,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.1
    \
     
     \ /
      Last update: 2022-11-23 13:51    [W:4.066 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site