From patchwork Wed Nov 12 17:19:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4389 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 12B2C3F09C for ; Wed, 12 Nov 2025 18:20:01 +0100 (CET) Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-b732e399c67sf99082666b.1 for ; Wed, 12 Nov 2025 09:20:01 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1762968000; cv=pass; d=google.com; s=arc-20240605; b=kc37uE9pHq5frTHm6OQXFlHS3YTebPg3UrmUjWzoKdp5P//XJ878yO3Gmsm9pvUhOT EmL1iBN5tqqrXXk5k0FBZvOqn6TC4Awm16kNspLqt6crQ7wzjgUvdV9ToQhbtWRTp6UH gak2A+srBWQhzLbH3aNOzp8cLPyvh4lSdBdnTk3bfGYrgYaAb4sLWRjWGx5MiZKidA3a vG0yEpkLl9B49Oa9t8L1p1qPxH/KwUsGdvMSlkd9Q6goGKjbZiWNtCUrq4ipip5fqx8T uIlu3Z24HRzaqVK36ynOrea3QsJIhKcI/ZDYieNlrA/Xy6Jy/qZWTk1z8kYySPOjQa9w vidA== 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=cUin/Nabcdd9PU148eNl4ej9sXjItSmLqtx1Cg4H1qw=; fh=YXnV4qVSKZHqYjid0m3dDqcVHl+TATENvjBDIQ5l71I=; b=YgxCLX5GMy66ovksiPYt9y2rNy7zr+WHvcxeoUTMdYrqDT2DrWklC1kZoW0lK7kY9t n85jYmCSFtvQsnzi9g8BH76Y1RVt9FM72X/i8ZKDNRXLhYuXzGGQwl4Njhjhb2ZNnFS0 YSpiuDXgrIcEQ8pkA19Kq07Dqt+bX9s+Wvl68Uc7jJNVp7xVSgMhfPhPy6fBMAQPZC8h /Yl+P+pXY4w66+C3KeYrGL9GLD3sj/BZwC62lyyTzlEjk/Th24KR+8640tiZVkIS5VQr 1Mh3BQHBGP9NO73TWX1Zcw5J1kWMknEcjbDZLrRqAb6crw8KHV0GBGFlGPSeyOgldWQ2 ePtA==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=I2ZGlHFu; 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=1762968000; x=1763572800; 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=cUin/Nabcdd9PU148eNl4ej9sXjItSmLqtx1Cg4H1qw=; b=FRUL/yfUglDAIWeioHWW5TmmB1A9x8ao8+sJ2glftuO6YE5OzOfMe9g5doZVnxWYkT xqzcVcQ6pPf1Ui8k7AC0FBbFzImbnAxz/NbZgfXsf+RpuxDf0L7+1UaU6vgnQL2TXbJG vp3nEdnkC+Z926+0o2IHAORjAjRf0O4/NhEnM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762968000; x=1763572800; 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=cUin/Nabcdd9PU148eNl4ej9sXjItSmLqtx1Cg4H1qw=; b=V4Sa/vDeRLjWzW9oqvMW2z+38gz2FK7+wflTRw4cgh2E7JvtyrRmPZ7y05Ut//g+gl 8pIRfmlpdQQm/cHUJER92Qc6jLOl6HMt+AB+E3uX2j5x71GE7IEpB083SegUdshE6B9Z P6sJxPwjkzS+pZKXSBEqPoWfu7LTCQZKZUhjbhwVVBUIFlEYg5t8PEB7LLnkvUSkPDNV xM/7RjJnwZZSt2hikECG7/kWDmwm2LMkewGrksfqbuC0IvqSTcBU1rBsfY1j1zhHDM+K vww+EHA8HOdsuVT5zyi+/kGNoDfuIjmUeHh9LVp+P4eSVd3P03aZbqtfEi5t3/iDwCs1 CyxQ== X-Forwarded-Encrypted: i=2; AJvYcCVi3e4QrFDLkOUHx24740RF+K3nouJxpT0bqZya9IoTcuyEXqRTkG+AIuLUTnUyVcW/UhPV4m76PPZeFZ08@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0Yz0R5qvOSHkejFPp6uJGBiaDil3YSS7596/L72bSwk7wz2QHpMt iUn5D8zsOqZ/OOYdw3jVF+jzTIXM+dCtiPxJU4TAXdr42nNmRTcNHox73TSmcJ8exkBrrg== X-Google-Smtp-Source: AGHT+IHeU32GCM/wCP7rr4oih+vZExsh9poEsSRPwaXiix2y+1JCcshroFy85z5eJp/JkdzZJgi/QQ== X-Received: by 2002:a17:906:f597:b0:b04:32ff:5d3a with SMTP id a640c23a62f3a-b73317a7930mr397311766b.0.1762968000603; Wed, 12 Nov 2025 09:20:00 -0800 (PST) X-BeenThere: linux-amarula@amarulasolutions.com; h="Ae8XA+ZZ3u4jYhb6eYapA3vH53QoAgVF2SLCFKGVnS3lQFg8rw==" Received: by 2002:aa7:c055:0:b0:641:8be9:1ff6 with SMTP id 4fb4d7f45d1cf-643350c6165ls39342a12.2.-pod-prod-01-eu; Wed, 12 Nov 2025 09:19:58 -0800 (PST) X-Received: by 2002:a17:907:3d04:b0:b70:8519:44a3 with SMTP id a640c23a62f3a-b733197ed72mr422465866b.21.1762967997980; Wed, 12 Nov 2025 09:19:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1762967997; cv=none; d=google.com; s=arc-20240605; b=EmZ+zhEpJS63FERMY12rIIObbi2QkT+zlL8LgQs9FnnlYZy2w9uAPa6oi2CABCJew1 /+KLuC4ANpy97OleptgJZjw2kBJJ/Jm9k1BRYpiHXwwu1Ymep111k47BMwB9LrMb6I8t 0UL7uWCO97MP/P4HGvhILIK/p52eH+JTmGha5oAt9/GZEtMhs/FfPSyli29RTAhQEpVZ 6dIJpu9YGfe1uiEzFlxjc03xogc/SKmqSjRMCtaXxSsMdVPb2NUYOBohRBpW3Mf5iqzZ cwUK1fNg2TbZl9Z4Af0bNaDbjWCoVNwlh6GOoJa4x3/yOMgdtM3JKSxIIbz4V1Hbz85i 8lDQ== 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=htWCmp/HqOC3LZuhkUtvSCsNEkCvDxqHS6yOGkHh6Qw=; fh=xX3+bj9q+hdGppSo8sV0O20vMBXQtndd2swhLwiVzRA=; b=C8M0ehTFPlqF9H3+st/7HMGmV2ndCzH0M24/p2S0u7UGcPog6MXH5so5CacXHfdvPI NeInqDLoJSLn/jmV8vbZmRrc7EqplPz8H3kj21+2flS13/xHgK8uEWqjFtjIFB96JtUe r0MD3Q31V4hQkPojMy/Fv1oYsXz/zQu9Bg1q3Pl6Wzw3xRigLlQcV5UbM8TFzIEJnO+H gHs25s9cupyN10vU9lo6yXzKq2LEOohN/j1pIG/Vi8LWdfbyVR22Snggln7ixJl2LFrW t24R7LCcG4CBL2RQw9dGPjwj1iNjHotMhPT7sLuE4gnfdAaJRzRPGMsA2sThan+N28Bh llxg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=I2ZGlHFu; 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-b728e15b665sor663821666b.4.2025.11.12.09.19.57 for (Google Transport Security); Wed, 12 Nov 2025 09:19:57 -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: ASbGncuEDD90MJGUC0neqGy8J/lp6+4pQAteyBX4hWd7WW+KPq056ytzgizHdlrNDss 4ALRHENw9g4RAf/mXHFlho03/vVMb/stGqbA354JIa7V4C26dRsXKq0LiGdIQjHspjE/Ai4ZmcC Q54y2Oiby6wYiOxmWC2et1Esk9gOPbG1FAll5Ip+6TmheQLWkFJFmV6KRdN4z+Lm076AOT08ycn pf+mFqcjLp6p/JV0l3paYHNa9blLCLts7jwnLP+5/G+YOSN1wnZgzs1C/BnnLkDGJn4rrfAUIWJ 3+y1YESw0pdN1mJ4Rlggv20yQkCSnYqRyUwY8kvlxNH7F5Yg64SRPf/Nomhneg5eEJhJxuMuXkU 6+RVWYLwteG6qRJQZD5I8d5mpIXtVs7Hs5ItjRvj82iEJ+lx6bmOI9uLtJt9IaS4d5rqnyr5aI5 GgMuNZ2NcxQC4TB2Z6opC0g/n24bTeoMF7pr2Opd+19WxjRc2UqYBN2FoQIeIjduB7veepEqlwB nmmdeZdjUXcZMgfxeKf/7aI3AOrWTgKmGe8dYyBRBhm X-Received: by 2002:a17:906:c78b:b0:b72:b97b:b6fc with SMTP id a640c23a62f3a-b7331a5ac30mr292584666b.30.1762967997438; Wed, 12 Nov 2025 09:19:57 -0800 (PST) Received: from dario-ThinkPad-P14s-Gen-5.homenet.telecomitalia.it (host-79-54-71-163.retail.telecomitalia.it. [79.54.71.163]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b72bfa11367sm1619860266b.68.2025.11.12.09.19.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Nov 2025 09:19:57 -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: Wed, 12 Nov 2025 18:19:50 +0100 Message-ID: <20251112171953.4046990-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=I2ZGlHFu; 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,