From patchwork Wed Jan 25 10:54:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 647819 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 228A5C54EED for ; Wed, 25 Jan 2023 10:55:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234742AbjAYKzN (ORCPT ); Wed, 25 Jan 2023 05:55:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56710 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235229AbjAYKzM (ORCPT ); Wed, 25 Jan 2023 05:55:12 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 472FF26BC for ; Wed, 25 Jan 2023 02:54:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1674644063; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EHJ7QbuEJCvF5/OpAVlhSNCtx75bh+5UQF4mH8jOT6c=; b=Jnmdp+3nl3j3+30o0J8tzI/gUhWE6MijVI+UQwMYoo9+imeED2oMfe8txe7XlRaXi8APSD ryG/Lx7oBoKG9YrcsbVqu0uSdX8RwPeBFBV2oN/gYGezosanxlxckhg53IQdQGVxhzpjdh o+iN053GMJXMnfioFsC5FWJ2fZ6GKQY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-443-ROovyowFO6OKhy_RO1NK6Q-1; Wed, 25 Jan 2023 05:54:19 -0500 X-MC-Unique: ROovyowFO6OKhy_RO1NK6Q-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 70976858F0E; Wed, 25 Jan 2023 10:54:19 +0000 (UTC) Received: from shalem.redhat.com (unknown [10.39.193.104]) by smtp.corp.redhat.com (Postfix) with ESMTP id 937334085720; Wed, 25 Jan 2023 10:54:18 +0000 (UTC) From: Hans de Goede To: Dmitry Torokhov Cc: Hans de Goede , Bastien Nocera , Gregor Riepl , linux-input@vger.kernel.org Subject: [PATCH resend 1/3] Input: touchscreen - Extend touchscreen_parse_properties() to allow overriding settings with a module option Date: Wed, 25 Jan 2023 11:54:14 +0100 Message-Id: <20230125105416.17406-2-hdegoede@redhat.com> In-Reply-To: <20230125105416.17406-1-hdegoede@redhat.com> References: <20230125105416.17406-1-hdegoede@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org On x86/ACPI platforms touchscreens mostly just work without needing any device/model specific configuration. But in some cases (mostly with Silead and Goodix touchscreens) it is still necessary to manually specify various touchscreen-properties on a per model basis. This is handled by drivers/platform/x86/touchscreen_dmi.c which contains a large list of per-model touchscreen properties which it attaches to the (i2c)device before the touchscreen driver's probe() method gets called. This means that ATM changing these settings requires recompiling the kernel. This makes figuring out what settings/properties a specific touchscreen needs very hard for normal users to do. Add a new, optional, settings_override string argument to touchscreen_parse_properties(), which takes a list of ; separated property-name=value pairs, e.g. : "touchscreen-size-x=1665;touchscreen-size-y=1140;touchscreen-swapped-x-y". This new argument can be used by drivers to implement a module option which allows users to easily specify alternative settings for testing. The 2 new touchscreen_property_read_u32() and touchscreen_property_read_bool() helpers are also exported so that drivers can use these to add settings-override support to the code for driver-specific properties. Reviewed-by: Bastien Nocera Signed-off-by: Hans de Goede --- Changes in v2: - Instead of patching all drivers rename touchscreen_parse_properties() to touchscreen_parse_properties_with_override() and add a static inline wrapper which passes NULL. --- drivers/input/touchscreen.c | 103 ++++++++++++++++++++++++++---- include/linux/input/touchscreen.h | 19 +++++- 2 files changed, 109 insertions(+), 13 deletions(-) diff --git a/drivers/input/touchscreen.c b/drivers/input/touchscreen.c index 4620e20d0190..3b9505d5468d 100644 --- a/drivers/input/touchscreen.c +++ b/drivers/input/touchscreen.c @@ -12,15 +12,80 @@ #include #include +static int touchscreen_get_prop_from_settings_string(const char *settings, + const char *propname, + bool is_boolean, + u32 *val_ret) +{ + char *begin, *end; + u32 val; + + if (!settings) + return -ENOENT; + + begin = strstr(settings, propname); + if (!begin) + return -ENOENT; + + /* begin must be either the begin of settings, or be preceded by a ';' */ + if (begin != settings && begin[-1] != ';') + return -EINVAL; + + end = begin + strlen(propname); + if (*end != '=') { + if (is_boolean && (*end == '\0' || *end == ';')) { + *val_ret = true; + return 0; + } + return -EINVAL; + } + + val = simple_strtoul(end + 1, &end, 0); + if (*end != '\0' && *end != ';') + return -EINVAL; + + *val_ret = val; + return 0; +} + +int touchscreen_property_read_u32(struct device *dev, const char *propname, + const char *settings, u32 *val) +{ + int error; + + error = device_property_read_u32(dev, propname, val); + + if (touchscreen_get_prop_from_settings_string(settings, propname, + false, val) == 0) + error = 0; + + return error; +} +EXPORT_SYMBOL(touchscreen_property_read_u32); + +bool touchscreen_property_read_bool(struct device *dev, const char *propname, + const char *settings) +{ + u32 val; + + val = device_property_read_bool(dev, propname); + + touchscreen_get_prop_from_settings_string(settings, propname, true, &val); + + return val; +} +EXPORT_SYMBOL(touchscreen_property_read_bool); + static bool touchscreen_get_prop_u32(struct device *dev, const char *property, + const char *settings, unsigned int default_value, unsigned int *value) { u32 val; int error; - error = device_property_read_u32(dev, property, &val); + error = touchscreen_property_read_u32(dev, property, settings, &val); if (error) { *value = default_value; return false; @@ -50,20 +115,28 @@ static void touchscreen_set_params(struct input_dev *dev, } /** - * touchscreen_parse_properties - parse common touchscreen properties + * touchscreen_parse_properties_with_settings - parse common touchscreen properties * @input: input device that should be parsed * @multitouch: specifies whether parsed properties should be applied to * single-touch or multi-touch axes * @prop: pointer to a struct touchscreen_properties into which to store * axis swap and invert info for use with touchscreen_report_x_y(); * or %NULL + * @settings: string with ; separated name=value pairs overriding + * the device-properties or %NULL. * * This function parses common properties for touchscreens and sets up the * input device accordingly. The function keeps previously set up default * values if no value is specified. + * + * Callers can optional specify a settings string overriding the + * device-properties, this can be used to implement a module option which + * allows users to easily specify alternative settings for testing. */ -void touchscreen_parse_properties(struct input_dev *input, bool multitouch, - struct touchscreen_properties *prop) +void touchscreen_parse_properties_with_settings(struct input_dev *input, + bool multitouch, + struct touchscreen_properties *prop, + const char *settings) { struct device *dev = input->dev.parent; struct input_absinfo *absinfo; @@ -79,26 +152,32 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, axis_y = multitouch ? ABS_MT_POSITION_Y : ABS_Y; data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-x", + settings, input_abs_get_min(input, axis_x), &minimum); data_present |= touchscreen_get_prop_u32(dev, "touchscreen-size-x", + settings, input_abs_get_max(input, axis_x) + 1, &maximum); data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-x", + settings, input_abs_get_fuzz(input, axis_x), &fuzz); if (data_present) touchscreen_set_params(input, axis_x, minimum, maximum - 1, fuzz); data_present = touchscreen_get_prop_u32(dev, "touchscreen-min-y", + settings, input_abs_get_min(input, axis_y), &minimum); data_present |= touchscreen_get_prop_u32(dev, "touchscreen-size-y", + settings, input_abs_get_max(input, axis_y) + 1, &maximum); data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-y", + settings, input_abs_get_fuzz(input, axis_y), &fuzz); if (data_present) @@ -107,10 +186,12 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, axis = multitouch ? ABS_MT_PRESSURE : ABS_PRESSURE; data_present = touchscreen_get_prop_u32(dev, "touchscreen-max-pressure", + settings, input_abs_get_max(input, axis), &maximum); data_present |= touchscreen_get_prop_u32(dev, "touchscreen-fuzz-pressure", + settings, input_abs_get_fuzz(input, axis), &fuzz); if (data_present) @@ -122,28 +203,28 @@ void touchscreen_parse_properties(struct input_dev *input, bool multitouch, prop->max_x = input_abs_get_max(input, axis_x); prop->max_y = input_abs_get_max(input, axis_y); - prop->invert_x = - device_property_read_bool(dev, "touchscreen-inverted-x"); + prop->invert_x = touchscreen_property_read_bool(dev, "touchscreen-inverted-x", + settings); if (prop->invert_x) { absinfo = &input->absinfo[axis_x]; absinfo->maximum -= absinfo->minimum; absinfo->minimum = 0; } - prop->invert_y = - device_property_read_bool(dev, "touchscreen-inverted-y"); + prop->invert_y = touchscreen_property_read_bool(dev, "touchscreen-inverted-y", + settings); if (prop->invert_y) { absinfo = &input->absinfo[axis_y]; absinfo->maximum -= absinfo->minimum; absinfo->minimum = 0; } - prop->swap_x_y = - device_property_read_bool(dev, "touchscreen-swapped-x-y"); + prop->swap_x_y = touchscreen_property_read_bool(dev, "touchscreen-swapped-x-y", + settings); if (prop->swap_x_y) swap(input->absinfo[axis_x], input->absinfo[axis_y]); } -EXPORT_SYMBOL(touchscreen_parse_properties); +EXPORT_SYMBOL(touchscreen_parse_properties_with_settings); static void touchscreen_apply_prop_to_x_y(const struct touchscreen_properties *prop, diff --git a/include/linux/input/touchscreen.h b/include/linux/input/touchscreen.h index fe66e2b58f62..0023c6e368ba 100644 --- a/include/linux/input/touchscreen.h +++ b/include/linux/input/touchscreen.h @@ -17,8 +17,23 @@ struct touchscreen_properties { bool swap_x_y; }; -void touchscreen_parse_properties(struct input_dev *input, bool multitouch, - struct touchscreen_properties *prop); +void touchscreen_parse_properties_with_settings(struct input_dev *input, + bool multitouch, + struct touchscreen_properties *prop, + const char *settings); + +static inline void touchscreen_parse_properties(struct input_dev *input, + bool multitouch, + struct touchscreen_properties *prop) +{ + touchscreen_parse_properties_with_settings(input, multitouch, prop, NULL); +} + +int touchscreen_property_read_u32(struct device *dev, const char *propname, + const char *settings, u32 *val); + +bool touchscreen_property_read_bool(struct device *dev, const char *propname, + const char *settings); void touchscreen_set_mt_pos(struct input_mt_pos *pos, const struct touchscreen_properties *prop, From patchwork Wed Jan 25 10:54:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 646795 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3E29FC54E94 for ; Wed, 25 Jan 2023 10:55:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235174AbjAYKzM (ORCPT ); Wed, 25 Jan 2023 05:55:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234742AbjAYKzL (ORCPT ); Wed, 25 Jan 2023 05:55:11 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B266869F for ; Wed, 25 Jan 2023 02:54:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1674644062; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=h8hjiUdmWKbRjstnVkO3nGCIkLWjJfvzNFCbTa5J148=; b=GDhbdwEupRgdt0zfqWy5SSCcgRqKFK1yoN5gAauMnmpavgAxrgsquvber97jbyzKwh1X+/ 3nXkxdaG9L0NxljYHWGrJA+b9N92zKK6bb9lkDCe3Ijd6gEHP12aa9jxzTHeKxxTCaFAJ6 s86wP2NIGPqHXQWl6L5vwgI0fCDqyLE= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-9-lNMKYDx7O8qlceNn4kIM4w-1; Wed, 25 Jan 2023 05:54:21 -0500 X-MC-Unique: lNMKYDx7O8qlceNn4kIM4w-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8CEA3811E9C; Wed, 25 Jan 2023 10:54:20 +0000 (UTC) Received: from shalem.redhat.com (unknown [10.39.193.104]) by smtp.corp.redhat.com (Postfix) with ESMTP id ABE2C40C945A; Wed, 25 Jan 2023 10:54:19 +0000 (UTC) From: Hans de Goede To: Dmitry Torokhov Cc: Hans de Goede , Bastien Nocera , Gregor Riepl , linux-input@vger.kernel.org Subject: [PATCH resend 2/3] Input: silead - Add a settings module-parameter Date: Wed, 25 Jan 2023 11:54:15 +0100 Message-Id: <20230125105416.17406-3-hdegoede@redhat.com> In-Reply-To: <20230125105416.17406-1-hdegoede@redhat.com> References: <20230125105416.17406-1-hdegoede@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Add a settings module-parameter which can be allowed to specify/override various device-properties. Unlike most other touchscreen controllers Silead touchscreens don't tell us the ranges of the reported x and y coordinates and Silead touchscreens also often need to have their axis inverted and/or swapped to match the display coordinates. Being able to specify the necessary properties through a module parameter, allows users of new device-models to help us with bringing up support for new devices without them needing to do a local kernel-build just to modify these settings. Reviewed-by: Bastien Nocera Signed-off-by: Hans de Goede Reviewed-by: Jeff LaBundy --- drivers/input/touchscreen/silead.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c index 8a7351c4414c..22cee8d1bb22 100644 --- a/drivers/input/touchscreen/silead.c +++ b/drivers/input/touchscreen/silead.c @@ -58,6 +58,10 @@ #define SILEAD_MAX_FINGERS 10 +static char *settings; +module_param(settings, charp, 0444); +MODULE_PARM_DESC(settings, "Override touchscreen settings using a ; separated key=value list, e.g. \"touchscreen-size-x=1665;touchscreen-size-y=1140;touchscreen-swapped-x-y\""); + enum silead_ts_power { SILEAD_POWER_ON = 1, SILEAD_POWER_OFF = 0 @@ -133,14 +137,15 @@ static int silead_ts_request_input_dev(struct silead_ts_data *data) input_set_abs_params(data->input, ABS_MT_POSITION_X, 0, 4095, 0, 0); input_set_abs_params(data->input, ABS_MT_POSITION_Y, 0, 4095, 0, 0); - touchscreen_parse_properties(data->input, true, &data->prop); + touchscreen_parse_properties_with_settings(data->input, true, + &data->prop, settings); silead_apply_efi_fw_min_max(data); input_mt_init_slots(data->input, data->max_fingers, INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK); - if (device_property_read_bool(dev, "silead,home-button")) + if (touchscreen_property_read_bool(dev, "silead,home-button", settings)) input_set_capability(data->input, EV_KEY, KEY_LEFTMETA); data->input->name = SILEAD_TS_NAME; @@ -173,7 +178,8 @@ static int silead_ts_request_pen_input_dev(struct silead_ts_data *data) input_set_capability(data->pen_input, EV_KEY, BTN_TOUCH); input_set_capability(data->pen_input, EV_KEY, BTN_TOOL_PEN); set_bit(INPUT_PROP_DIRECT, data->pen_input->propbit); - touchscreen_parse_properties(data->pen_input, false, &data->prop); + touchscreen_parse_properties_with_settings(data->pen_input, false, + &data->prop, settings); input_abs_set_res(data->pen_input, ABS_X, data->pen_x_res); input_abs_set_res(data->pen_input, ABS_Y, data->pen_y_res); @@ -523,8 +529,8 @@ static int silead_ts_setup(struct i2c_client *client) * this. */ - if (device_property_read_bool(&client->dev, - "silead,stuck-controller-bug")) { + if (touchscreen_property_read_bool(&client->dev, "silead,stuck-controller-bug", + settings)) { pm_runtime_set_active(&client->dev); pm_runtime_enable(&client->dev); pm_runtime_allow(&client->dev); @@ -591,8 +597,8 @@ static void silead_ts_read_props(struct i2c_client *client) const char *str; int error; - error = device_property_read_u32(dev, "silead,max-fingers", - &data->max_fingers); + error = touchscreen_property_read_u32(dev, "silead,max-fingers", settings, + &data->max_fingers); if (error) { dev_dbg(dev, "Max fingers read error %d\n", error); data->max_fingers = 5; /* Most devices handle up-to 5 fingers */ @@ -605,9 +611,9 @@ static void silead_ts_read_props(struct i2c_client *client) else dev_dbg(dev, "Firmware file name read error. Using default."); - data->pen_supported = device_property_read_bool(dev, "silead,pen-supported"); - device_property_read_u32(dev, "silead,pen-resolution-x", &data->pen_x_res); - device_property_read_u32(dev, "silead,pen-resolution-y", &data->pen_y_res); + data->pen_supported = touchscreen_property_read_bool(dev, "silead,pen-supported", settings); + touchscreen_property_read_u32(dev, "silead,pen-resolution-x", settings, &data->pen_x_res); + touchscreen_property_read_u32(dev, "silead,pen-resolution-y", settings, &data->pen_y_res); } #ifdef CONFIG_ACPI From patchwork Wed Jan 25 10:54:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hans de Goede X-Patchwork-Id: 647820 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C484FC27C76 for ; Wed, 25 Jan 2023 10:55:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232999AbjAYKzF (ORCPT ); Wed, 25 Jan 2023 05:55:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56716 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234742AbjAYKzE (ORCPT ); Wed, 25 Jan 2023 05:55:04 -0500 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B15B3271A for ; Wed, 25 Jan 2023 02:54:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1674644065; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TKij3fyxoq/8VKQCHkV4iCLox0kN040mdy7eiQPNDYA=; b=Baf7jXK7s/zpTEwAoK3GUDMiP55W5qyhG4h8GP5kPMTC7CMmvhZpSvyxj7igEKqlmxei8h PNZPoHP1mXmR8qO8m4tu3rYPd1z6HXy9QXYcLtHMZpRTH5cmBxwHbp08tSKAlhicg0urfr 6h3dwwDYSE6ilkKVo7zcPJZAAS+TLGI= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-393-0qDC1HfDPK6yUlFBcX2mhg-1; Wed, 25 Jan 2023 05:54:22 -0500 X-MC-Unique: 0qDC1HfDPK6yUlFBcX2mhg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id A31A185C6E3; Wed, 25 Jan 2023 10:54:21 +0000 (UTC) Received: from shalem.redhat.com (unknown [10.39.193.104]) by smtp.corp.redhat.com (Postfix) with ESMTP id C4AB540C1141; Wed, 25 Jan 2023 10:54:20 +0000 (UTC) From: Hans de Goede To: Dmitry Torokhov Cc: Hans de Goede , Bastien Nocera , Gregor Riepl , linux-input@vger.kernel.org Subject: [PATCH resend 3/3] Input: goodix - Add a settings module-parameter Date: Wed, 25 Jan 2023 11:54:16 +0100 Message-Id: <20230125105416.17406-4-hdegoede@redhat.com> In-Reply-To: <20230125105416.17406-1-hdegoede@redhat.com> References: <20230125105416.17406-1-hdegoede@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Add a settings module-parameter which can be allowed to specify/override various device-properties. Usuually Goodix touchscreens on x86 devices (where there is no devicetree to specify the properties) just work. But in some cases the touchscreen is mounted 90 or 180 degrees rotated vs the display, requiring setting the touchscreen-x/y-inverted or touchscreen-swapped-x-y properties. Being able to specify the necessary properties through a module parameter, allows users of new device-models to help us with bringing up support for new devices without them needing to do a local kernel-build just to modify these settings. Reviewed-by: Bastien Nocera Signed-off-by: Hans de Goede --- drivers/input/touchscreen/goodix.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c index 620f5ec0962f..a105dee04156 100644 --- a/drivers/input/touchscreen/goodix.c +++ b/drivers/input/touchscreen/goodix.c @@ -53,6 +53,10 @@ #define ACPI_GPIO_SUPPORT #endif +static char *settings; +module_param(settings, charp, 0444); +MODULE_PARM_DESC(settings, "Override touchscreen settings using a ; separated key=value list, e.g. \"touchscreen-fuzz-x=5;touchscreen-fuzz-y=5;touchscreen-swapped-x-y\""); + struct goodix_chip_id { const char *id; const struct goodix_chip_data *data; @@ -1197,7 +1201,8 @@ static int goodix_configure_dev(struct goodix_ts_data *ts) goodix_read_config(ts); /* Try overriding touchscreen parameters via device properties */ - touchscreen_parse_properties(ts->input_dev, true, &ts->prop); + touchscreen_parse_properties_with_settings(ts->input_dev, true, + &ts->prop, settings); if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) { if (!ts->reset_controller_at_probe &&