From patchwork Thu Nov 27 07:46:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4390 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-ed1-f69.google.com (mail-ed1-f69.google.com [209.85.208.69]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 3B3CD3F143 for ; Thu, 27 Nov 2025 08:46:38 +0100 (CET) Received: by mail-ed1-f69.google.com with SMTP id 4fb4d7f45d1cf-64537824851sf643429a12.1 for ; Wed, 26 Nov 2025 23:46:38 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1764229598; cv=pass; d=google.com; s=arc-20240605; b=AcCzHCkLxTWqZJeEt6hbvS36+PRaJ7aeTGCuTS5fXsjLSUJ/oa7cQsrgNRBT6Ls/pP oztO54y+1j/IQ64YSaXpfvIA035et8LU+o3NNuI8NkUp8FQKofRZx8/3l7LkjK3AufJa dUbX4ZXlc2/QAgOB2cvEeFBqkcCEK0Q1Za2Kikx0PUd1wscFL/XrdgYb/qkpNf4wUvx1 11+qzof7O6CDvH2ey5pY/DcXoaHd+my9sCbsKWKgZ/Gxv+dl1R7xiPA7s709iW3n8QMS H5vrUHCEBUYsSd0arNa3bAZt+1xLh/VFE5ywpXq3Hz6uzUIYIoeNM1RQBW6+IXbRj/R2 Ivkw== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:mime-version:message-id:date:subject:cc:to :from:dkim-signature; bh=RZ3AcAljsVbbZ2I/fqkxfIQEsNFx7yTS9xJxqzquS/E=; fh=ywSR4ZfjHDx5rMHEXi0XKyURg/Lle26kyfpPEx3C+tI=; b=J1flmhcpD17JTY+PQKePPQNz4lYQPMjktXl8okz5CQDl+Y/oCVhE+87WIJMrRmwy36 eW/ni9rUUgWcSXPzGDMf58/9WELSy3j76c9UzZWI7GqoLeFXpIvyZdhD70dimjVewia8 4lUvSnbHGEKUpUTIyLLJ5ZoengeWFf+1G6iIFHvpUs+aZrIjRHAgeHEE9gaih0s7Raq8 bKNansdHrHBINbzdMlAAluPSXk5nxKJOf+8VdRcPPyVhDqmk0skAqR/dpf0es/qSvx/G 6e1/WLe56NmbfOY6ifuGHJ4q2VUqI+PW1ya+nIKSCd+BeNZ7hpp9vAGGJWnaQjhJyyf2 wpRQ==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=b3z7+6NT; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1764229598; x=1764834398; darn=patchwork.amarulasolutions.com; h=list-unsubscribe:list-archive:list-help:list-post:list-id :mailing-list:precedence:x-original-authentication-results :x-original-sender:mime-version:message-id:date:subject:cc:to:from :from:to:cc:subject:date:message-id:reply-to; bh=RZ3AcAljsVbbZ2I/fqkxfIQEsNFx7yTS9xJxqzquS/E=; b=lzYef0+P/WIGdzs2iuNZl0XPpYne4J5+hkGlDeFRjTfJOgcNKCoNXt53ES+csdTQAg OYcgjqrSPIcFoQQFF9E6RZCckSwtOcqBPOfstGTX11G2zPWrhHGOjRHIITSLk/FMp6L9 Wpu8+gQe09AmsnJ8xfTYMamcV3bEx9z8bcNq0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764229598; x=1764834398; h=list-unsubscribe:list-archive:list-help:list-post :x-spam-checked-in-group:list-id:mailing-list:precedence :x-original-authentication-results:x-original-sender:mime-version :message-id:date:subject:cc:to:from:x-gm-gg:x-beenthere :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=RZ3AcAljsVbbZ2I/fqkxfIQEsNFx7yTS9xJxqzquS/E=; b=jHzxuqwRDaxofsT5voFfP9NT2CJeXyJWjTNwwPi5yqT39DxodNcxNe6emdYZNyjWBj DhwosRTRWC06z2ZD0qiTqnJ5WjeppdXq734ajQ6o2Xc5rmc9BMMhN+VO4OkSocz2FGXZ tAc+tFGkXT02pgfQ7MNYpZAEJKc0EjvpiciTK9zHHanXPw6/odXKjLSmcPC68owu+bbf F5a6XQ4KX7gCSEXcrZhIu/TvuW0GfwG6Fv05yUqrafW7A/TcIJj6PORVgX+tPZjPE3pJ CMsHv9DTAEkGxk+oFMYeItTjDWcI7zJwwIcuJjYMRZ0t6d+7i7odS9lrWvJVY1XqwqvO /pwg== X-Forwarded-Encrypted: i=2; AJvYcCWT3q7+wCGKB2xaXufbYh/DA8fsG/a+qR5OXixtjbhjqpQv28mfyMItZ/3/PzKqp4X/FK0hWuFSfXTRsTBR@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0YzDBbdAJmCIKLs5OmrGtdzoAT2ifg94pt8b7AJav+PdLj38wlBj e7zJQa4v0EnB7T21ZaOd8+ANbQNtRUuTon/Cc7kc0nu1I0J2QD/amhqeg/x6bkvnwci3TGpHZ7e x4w== X-Google-Smtp-Source: AGHT+IHvzS2755HvcuOMt2Wsg/mgTI0m6M3CY4Snv6JlOPYzv5ItpwL25mUpn6NL95gK+KJ1xJl0hg== X-Received: by 2002:a05:6402:1462:b0:647:51be:ad9e with SMTP id 4fb4d7f45d1cf-64751beadb6mr583733a12.26.1764229597609; Wed, 26 Nov 2025 23:46:37 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com; h="Ae8XA+a5cDP2vMSC9+Wtae+ixhvLCI/LdVOKATZAl2InVrr3Nw==" Received: by 2002:aa7:d3d2:0:b0:641:9a7d:f30b with SMTP id 4fb4d7f45d1cf-6474c4193cals407006a12.2.-pod-prod-05-eu; Wed, 26 Nov 2025 23:46:35 -0800 (PST) X-Received: by 2002:a17:907:9487:b0:b76:6020:ed2b with SMTP id a640c23a62f3a-b7671898fd8mr2330592466b.45.1764229594932; Wed, 26 Nov 2025 23:46:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1764229594; cv=none; d=google.com; s=arc-20240605; b=DspyAPDCVbKAN3q7oYHAxM9sYZx4qmUVLqKt0B0hIxdr0cXwNt+CQfqU2RZEyAa8lb AlmTsMW9O7IHUzslca6Upn9ddeVAFYHHzVlC9g8XKu7GaBK1ef26aKmL3M3xDGV06XEm MsZ6JH0naoW5IWW/gAXqV4HO4nTJh5yj48DZB0lhn/Xgb7Ep+jK/0UDohRmMGiNPdtjg 3h2lfhQQWJ0wOCBjz3Jz6Fd28WJm9SnoII2kYMgoGByKbB0dkZpCDp7XIdVCt4DR1c1W xakZn6Re7aStPMBTPxOpsiO7w3JaqpNb2/zJxUJLl9oEeI59vSpxaGbZnixSvOAm/0Hg 8OEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:dkim-signature; bh=I57iSPGSJdvo4hExZdg2/yXzMQCRNalZqIfRbvKW8Ek=; fh=xX3+bj9q+hdGppSo8sV0O20vMBXQtndd2swhLwiVzRA=; b=jjAKeFuoU+Xoxmyz8YKTN8JWu5nx2psUpkXeCSFTsjziKJj7pf7k7kqt4WNT446Q9W pb+1xSrFaz45jLP4WC4BPvqjKtUggmYB6zY6aO9yaapJW7yJ4CKJ1zlMR2s1MWy0Q7dB IonV8RgabDcyiTC8Bse3auluWgKCceo0997OKQQHkD6WuJ0+v5rIbp2BWN0Pqzx+DmoC XDgNTXkUgXb3/ECiW1p0aM5WN1vkyub1jL+xAySpUEo/n9jB9piFYKOudIPiENZSm7sm b3f5rSxZNaRG8O2Q8NEpEmVI8NaMozHURx0RsayeJNAXAUW9WxezRxDKSJZA53gm6u+5 rZbA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=b3z7+6NT; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) by mx.google.com with SMTPS id a640c23a62f3a-b76f51b2f3csor18485366b.5.2025.11.26.23.46.34 for (Google Transport Security); Wed, 26 Nov 2025 23:46:34 -0800 (PST) Received-SPF: pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) client-ip=209.85.220.41; X-Gm-Gg: ASbGncsdLUelRe10gOIipIR8K15bVZGt6EiJ3sUDvLBb1Cy3K/LNdnnWgB2dxQ59Rql lBUSJgTnJi2MQOPgRWAsr2+pkqMIIi+m9ci4ZtB5FyH4Rb+w8TB/G8Q9kbyJfMQv+4D1I4nQkbS pKQ4KEayQlGcSQ6V85qUlFao9x0p/Ta/n185LBqpKT0eTbJCpTEfu+kAjn5fylpsfvNtU1v84Qn fpczqhhKQmvWqHgrwyuKPxjOMzsX8w6WPvea5HJbTqTkMMrIQs8UwtfUfNpumsm4iMGennIV1Ck DWwAzrvl4Meu7E/t230Uhidmjz0BCE/N49trSNept46Sc+rog0maHgTGOg5zdFIu4AI+Q31yZKV S+ZbBXq6JB5pEQgTTMU8fDv6xNIKcIXFVsUIQ1mzb14HcHFaRdAemCOu0uy0/f2kHlHMD6u/7jO +J+6SelaKFrD4EafNnR8/09ZtWkiwBHtqhokowfqvOBPArZMGHXrqfMjpHyMucovUGTYWvd3gkT VL2rQYwFClwTyXNUxZs8uiV9znVt+kwJjigflNWPEzL5HM= X-Received: by 2002:a17:907:26c2:b0:b4e:f7cc:72f1 with SMTP id a640c23a62f3a-b76715aba47mr2280426566b.22.1764229594426; Wed, 26 Nov 2025 23:46:34 -0800 (PST) Received: from dario-ThinkPad-P14s-Gen-5.amarulasolutions.com (host-87-4-36-237.retail.telecomitalia.it. [87.4.36.237]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b76f51c55e9sm91435666b.26.2025.11.26.23.46.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Nov 2025 23:46:34 -0800 (PST) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: linux-amarula@amarulasolutions.com, Dario Binacchi , Dmitry Torokhov , Jens Reidel , Wolfram Sang , linux-input@vger.kernel.org Subject: [RESEND PATCH v2] Input: edt-ft5x06 - fix report rate handling by sysfs Date: Thu, 27 Nov 2025 08:46:21 +0100 Message-ID: <20251127074626.1953741-1-dario.binacchi@amarulasolutions.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Original-Sender: dario.binacchi@amarulasolutions.com X-Original-Authentication-Results: mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=b3z7+6NT; spf=pass (google.com: domain of dario.binacchi@amarulasolutions.com designates 209.85.220.41 as permitted sender) smtp.mailfrom=dario.binacchi@amarulasolutions.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=amarulasolutions.com; dara=neutral header.i=@amarulasolutions.com Content-Type: text/plain; charset="UTF-8" Precedence: list Mailing-list: list linux-amarula@amarulasolutions.com; contact linux-amarula+owners@amarulasolutions.com List-ID: X-Spam-Checked-In-Group: linux-amarula@amarulasolutions.com X-Google-Group-Id: 476853432473 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , In the driver probe, the report-rate-hz value from device tree is written directly to the M12 controller register, while for the M06 it is divided by 10 since the controller expects the value in units of 10 Hz. That logic was missing in the sysfs handling, leading to inconsistent behavior depending on whether the value came from device tree or sysfs. This patch makes the report-rate handling consistent by applying the same logic in both cases. Two dedicated functions, report_rate_hz_{show,store}, were added for the following reasons: - Avoid modifying the more generic edt_ft5x06_setting_{show,store} and thus prevent regressions. - Properly enforce lower and upper limits for the M06 case. The previous version accepted invalid values for M06, since it relied on the M12 limits. - Return an error when the property is not supported (e.g. M09), to avoid misleading users into thinking the property is handled by the controller. Signed-off-by: Dario Binacchi --- Changes in v2: - Drop the patch: 1/2 Input: edt-ft5x06 - rename sysfs attribute report_rate to report_rate_hz because not accepted. drivers/input/touchscreen/edt-ft5x06.c | 158 +++++++++++++++++++++---- 1 file changed, 135 insertions(+), 23 deletions(-) diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index bf498bd4dea9..d7a269a0528f 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -516,9 +516,136 @@ static EDT_ATTR(offset_y, S_IWUSR | S_IRUGO, NO_REGISTER, NO_REGISTER, /* m06: range 20 to 80, m09: range 0 to 30, m12: range 1 to 255... */ static EDT_ATTR(threshold, S_IWUSR | S_IRUGO, WORK_REGISTER_THRESHOLD, M09_REGISTER_THRESHOLD, EV_REGISTER_THRESHOLD, 0, 255); -/* m06: range 3 to 14, m12: range 1 to 255 */ -static EDT_ATTR(report_rate, S_IWUSR | S_IRUGO, WORK_REGISTER_REPORT_RATE, - M12_REGISTER_REPORT_RATE, NO_REGISTER, 0, 255); + +static int edt_ft5x06_report_rate_get(struct edt_ft5x06_ts_data *tsdata) +{ + unsigned int val; + int error; + + if (tsdata->reg_addr.reg_report_rate == NO_REGISTER) + return -EOPNOTSUPP; + + error = regmap_read(tsdata->regmap, tsdata->reg_addr.reg_report_rate, + &val); + if (error) + return error; + + if (tsdata->version == EDT_M06) + val *= 10; + + if (val != tsdata->report_rate) { + dev_warn(&tsdata->client->dev, + "report-rate: read (%d) and stored value (%d) differ\n", + val, tsdata->report_rate); + tsdata->report_rate = val; + } + + return 0; +} + +static ssize_t report_rate_show(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + size_t count; + int error; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error = -EIO; + goto out; + } + + error = edt_ft5x06_report_rate_get(tsdata); + if (error) { + dev_err(&tsdata->client->dev, + "Failed to fetch attribute %s, error %d\n", + dattr->attr.name, error); + goto out; + } + + count = sysfs_emit(buf, "%d\n", tsdata->report_rate); +out: + mutex_unlock(&tsdata->mutex); + return error ?: count; +} + +static int edt_ft5x06_report_rate_set(struct edt_ft5x06_ts_data *tsdata, + unsigned int val) +{ + if (tsdata->reg_addr.reg_report_rate == NO_REGISTER) + return -EOPNOTSUPP; + + if (tsdata->version == EDT_M06) + tsdata->report_rate = clamp_val(val, 30, 140); + else + tsdata->report_rate = clamp_val(val, 1, 255); + + if (val != tsdata->report_rate) { + dev_warn(&tsdata->client->dev, + "report-rate %dHz is unsupported, use %dHz\n", + val, tsdata->report_rate); + val = tsdata->report_rate; + } + + if (tsdata->version == EDT_M06) + val /= 10; + + return regmap_write(tsdata->regmap, tsdata->reg_addr.reg_report_rate, + val); +} + +static ssize_t report_rate_store(struct device *dev, + struct device_attribute *dattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + unsigned int val; + u8 limit_low; + u8 limit_high; + int error; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error = -EIO; + goto out; + } + + error = kstrtouint(buf, 0, &val); + if (error) + goto out; + + if (tsdata->version == EDT_M06) { + limit_low = 30; + limit_high = 140; + } else { + limit_low = 1; + limit_high = 255; + } + + if (val < limit_low || val > limit_high) { + error = -ERANGE; + goto out; + } + + error = edt_ft5x06_report_rate_set(tsdata, val); + if (error) { + dev_err(&tsdata->client->dev, + "Failed to update attribute %s, error: %d\n", + dattr->attr.name, error); + goto out; + } + +out: + mutex_unlock(&tsdata->mutex); + return error ?: count; +} + +static DEVICE_ATTR_RW(report_rate); static ssize_t model_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -572,7 +699,7 @@ static struct attribute *edt_ft5x06_attrs[] = { &edt_ft5x06_attr_offset_x.dattr.attr, &edt_ft5x06_attr_offset_y.dattr.attr, &edt_ft5x06_attr_threshold.dattr.attr, - &edt_ft5x06_attr_report_rate.dattr.attr, + &dev_attr_report_rate.attr, &dev_attr_model.attr, &dev_attr_fw_version.attr, &dev_attr_header_errors.attr, @@ -595,8 +722,7 @@ static void edt_ft5x06_restore_reg_parameters(struct edt_ft5x06_ts_data *tsdata) if (reg_addr->reg_offset_y != NO_REGISTER) regmap_write(regmap, reg_addr->reg_offset_y, tsdata->offset_y); if (reg_addr->reg_report_rate != NO_REGISTER) - regmap_write(regmap, reg_addr->reg_report_rate, - tsdata->report_rate); + edt_ft5x06_report_rate_set(tsdata, tsdata->report_rate); } #ifdef CONFIG_DEBUG_FS @@ -1029,8 +1155,8 @@ static void edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) if (reg_addr->reg_offset_y != NO_REGISTER) regmap_read(regmap, reg_addr->reg_offset_y, &tsdata->offset_y); if (reg_addr->reg_report_rate != NO_REGISTER) - regmap_read(regmap, reg_addr->reg_report_rate, - &tsdata->report_rate); + edt_ft5x06_report_rate_get(tsdata); + tsdata->num_x = EDT_DEFAULT_NUM_X; if (reg_addr->reg_num_x != NO_REGISTER) { if (!regmap_read(regmap, reg_addr->reg_num_x, &val)) @@ -1289,21 +1415,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client) if (tsdata->reg_addr.reg_report_rate != NO_REGISTER && !device_property_read_u32(&client->dev, "report-rate-hz", &report_rate)) { - if (tsdata->version == EDT_M06) - tsdata->report_rate = clamp_val(report_rate, 30, 140); - else - tsdata->report_rate = clamp_val(report_rate, 1, 255); - - if (report_rate != tsdata->report_rate) - dev_warn(&client->dev, - "report-rate %dHz is unsupported, use %dHz\n", - report_rate, tsdata->report_rate); - - if (tsdata->version == EDT_M06) - tsdata->report_rate /= 10; - - regmap_write(tsdata->regmap, tsdata->reg_addr.reg_report_rate, - tsdata->report_rate); + edt_ft5x06_report_rate_set(tsdata, report_rate); } dev_dbg(&client->dev,