From patchwork Tue Sep 23 14:46:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4354 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 581ED3F144 for ; Tue, 23 Sep 2025 16:46:33 +0200 (CEST) Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-b282f0886b0sf50141766b.2 for ; Tue, 23 Sep 2025 07:46:33 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1758638793; cv=pass; d=google.com; s=arc-20240605; b=iCbd9wR4dbe+NY05aBS/+CGR/s6/ghdPeglXbQFRoy/yAi3vI22RjPm9HiEPmaUorV mXIfu3riAgwfHAnOYO0MV7Tk2nsxADkejk2jnkMsx7ZGhLn2HZfhgWmq56YaF67xPnTm B67FZzE6TEkyP6GBLr3mMwxftJepdKgsT8wcaKYIcckTbk3vmErFA7VU0PojG4R4D3Zl hJGHa5bJT8gRgq93tvCk8WuBVme5pMmXL164GSQVSfayS65VCRiyNnyVvJHnofAzrGv5 T9gM/DGrLx/+QEMo0x+Scq3PXFLzqkdCajL4e2uHVY1k6/liUFFxGg6BwNM3hShFxHE5 CLcw== 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=btRzf5obmmu8yqnUKOOAwnMTJVg59cANd+dh6jrSAa8=; fh=kkfghICvRzQOuDuosqPoWSf6NvmqccB2vmCzJkWZ00A=; b=BKJK0HwTGDBUtcGAR2JBimMfva+A2W50GiyP0otyvH9d4MPgz3YR86B2G8eT6MoFcB 2Ru/PGnYSmOhJwdg34t5/UWM/TFJnKi+zJhtjIdcZrVNdf8kJXZ7H80rmz5n+6cbDQJ6 30ZrNltAslXvJBpHXdacJ/R4Dii/TWvEhRa7uVAYPvYVkuotBK51kANwiGNI9SkFpt+p +WwVzAr3bch0fwABM8f5Svm6FsNkoHK/8expiS9H0ZEFbUPM86eZuhKWLUfChYCNXeAK I8Xkmdb3MdkuNzS0yUfUcW0aInFhp5mFiOkl9lyVJSJUXdnq7RI/HQVsGrc/MDjvtiSB Ekug==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=LnMp0y8s; 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=pass header.i=@amarulasolutions.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1758638793; x=1759243593; 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=btRzf5obmmu8yqnUKOOAwnMTJVg59cANd+dh6jrSAa8=; b=lOH5yCQccVBTdev7p/QOmWLNReHM9ASVJLMUwaR+0b1bYmPZrbfJkyM8KuQMLNMIEO 73ukZvkRhp3f2c8UdfnK2MFfZkgNGsfnjK86am+ST/2pDpilTd4EcJHOluGM8wwqTYFE 7wPT+eebwDRgw8gOVLRMDRopSnVlJ7/jXNmrw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758638793; x=1759243593; 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-beenthere:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=btRzf5obmmu8yqnUKOOAwnMTJVg59cANd+dh6jrSAa8=; b=JcGRJnAtoqt9OflBl7ctFPwpq8l3v0tis0W/VKyxcFAiB5eqSk9SQhXLZFgz3lKC9p /tTOoGb5lzfZ5zFGSI4r0BgyZUpdt1KnTx0C7IT6uVyaXd6T40QWza2URWr1YiW+NHmy p6Q1hnHm6QXKTEu9C1sL05TxoHqSwTNZgRXj6LuL8t66FcQzoNLwv1rOTeECDwyCMw4H mOP26i/s6wIqD/gKs5z4aHbE+iZWGrdw0tqgb3UuzyUYizPfSTJC4FDPNayG0f+5GAA7 YWHkLBtjPkR4mCw18AlTfgskWDk0NhXAPevXOmcaOpZqJrReb9oO0lOZ1Krtend9tb5O s2hw== X-Forwarded-Encrypted: i=2; AJvYcCXXaHcaVwHWQ2z/19MNblt48Dm7qTmWfTVboSXoUCNgR2mhjP69KmGdrNrSukRbyMd84J6VQlkHjfDioKvK@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0YwpMVHYaFgKNNHJqTclECDjgepI5/5PsVf7l67buKt1D1BfI2Hx KsS2ZaIG6zCf6nsb/4Gl+W+h0Nos9a3H6QmUOhGp2zB2u0OhbDQ9qNscG3T7sE4tkP+Eng== X-Google-Smtp-Source: AGHT+IFWlhfBW/fyS7gpRelj2WYwzBz5YLuNhBSs/ADp9aYWZr/n5PW2qtFbUBbepzFzIVXMot49Cw== X-Received: by 2002:a05:6402:430c:b0:62f:aaa3:f583 with SMTP id 4fb4d7f45d1cf-6346780c616mr1447706a12.3.1758638792689; Tue, 23 Sep 2025 07:46:32 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com; h=ARHlJd6N/V9qMHjuo6Ur5kT6+7458BreoXCbq6afLyWC8fZnhg== Received: by 2002:a05:6402:218e:20b0:62f:9888:f350 with SMTP id 4fb4d7f45d1cf-633743a1463ls1967552a12.1.-pod-prod-06-eu; Tue, 23 Sep 2025 07:46:30 -0700 (PDT) X-Received: by 2002:a17:907:2d0d:b0:b04:c7c5:499d with SMTP id a640c23a62f3a-b302ba0c154mr245965466b.47.1758638790309; Tue, 23 Sep 2025 07:46:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1758638790; cv=none; d=google.com; s=arc-20240605; b=DdX9YGsmOgsvbdC4l32DvHPoj9BPFrvwChp/b+eCq3T6b8XooH41/ajmtj5HC2yosE cLq3ZtDPye1p9tdCYY3PhSFMxEgSLAj/4x4LNe+ep13e0oSFDojWwRTpPVPqFmFHQYZV x3P4MyM8g/vSfjeBZSZZwBaQgFTL/14rhOrIjYCMY6idoBdgiS9jjA3jIDQrvkJm7kUL bb1dwzdFwXMup2Ec9yD5E5CMl1hzQ2p/tRNOgJRkQtKQHf3WWRJXJyM1dJb/xkx45ohw yIE8/b32GfJlXUMl9T3gjaGHSfs/Pt5dCaU/6l/dTsRbczkTR/NPU6G5AeA3WckdR/hV EVyg== 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=qnpLfXgLidATIzyWgBpv31wOd+0TKVI3i19szauFQ+U=; fh=NYN1LBmZUQwaz/XyVRg2JrFIKRCjoj9uVjTyK0P668g=; b=VQ1qfdIUv5h19dJEbFWEif0aOHqTps1gDFXbdr/RD4VgHYrX4+fTL1/g6v4GEOYCMc uA+jflFLwUDT9Qi9vg7u3Ce6KRVs/oL3eOTJ56O4ofZtedznAxyGH2aJCDZZDhVHI8V1 AIN/27LGSh4jmpTSauwDsc/rCHHd0VCSHByHXoLs9Ym1b43jo+FPAHEjm0a5CN1I/Te+ JY2mRyAzRZF01Skj2sAVI3OGHcF6BSpFRnJHnf0dhmtcoVDlxCKUhsG/DIGy7zmnY88I Y0L4MTFVXR6WNQEVJPC1ZOLzkSY9AHe+wC8onU2IRgAsTueJfTgGs6A8+bRbSxl2x01O f1Bg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=LnMp0y8s; 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=pass 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-b271e75da56sor370941366b.5.2025.09.23.07.46.30 for (Google Transport Security); Tue, 23 Sep 2025 07:46:30 -0700 (PDT) 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: ASbGncu4pzUiqRdmJLXoU5MCIgs1W+hcPIa2lxZfDcH9ha80QMfYQtB/Nj/CKDeucbM iHnYbGfNse6DVc1RrHTNSQLtowo3dMkKhet9ZjwGjKgh9tpu4M6hzW8sr/PmO81GlEvSe9CHe4g s+8L0CTXvDgVP+wuRJ3tUvTnc8vlK93YjEtIcU1FanWhtLWs7W8kxIB/sbTMTs4ULnfcbNj/+C8 Uil58Rt+Kuk+MVR7a9KbOjqM5Y7doO/YX+78J4cVvA0+AeA0TOdpfqAVwJGOrCE4pHYSbWm45a4 RM2iT03rg6kcuwDMwnF/WZDYTHvCYUlhruh9UCvP7nfHmFoHjmYsbLvisZMEQZinphcu4bJYzjf JWW6sdq7gwBgHwIrzDJrNjiQxiQk+WQTGCTe8j2MFe0cF4ngkf77kWPA/mvR8pb/ALL9gXyhXrv fJWh4zOotA2PP3hNVDc63s1cFTnAExEkWGMctLk4rkBVmSLIX7JnsHxCWXalyFzYdA X-Received: by 2002:a17:906:c14c:b0:b04:2212:4211 with SMTP id a640c23a62f3a-b3027a4aa98mr286898366b.16.1758638789462; Tue, 23 Sep 2025 07:46:29 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.homenet.telecomitalia.it (host-82-56-38-125.retail.telecomitalia.it. [82.56.38.125]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b29f45b5384sm691109666b.27.2025.09.23.07.46.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Sep 2025 07:46:29 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: linux-amarula@amarulasolutions.com, Dario Binacchi , Al Viro , Dmitry Torokhov , Jens Reidel , Oliver Graute , Wolfram Sang , Yu Jiaoliang , linux-input@vger.kernel.org Subject: [PATCH v2] Input: edt-ft5x06 - fix report rate handling by sysfs Date: Tue, 23 Sep 2025 16:46:11 +0200 Message-ID: <20250923144622.2858165-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=LnMp0y8s; 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=pass 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,