From patchwork Mon Oct 27 16:16:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4385 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 537EE3F12B for ; Mon, 27 Oct 2025 17:16:29 +0100 (CET) Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-b3ac1632711sf62907166b.3 for ; Mon, 27 Oct 2025 09:16:29 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1761581789; cv=pass; d=google.com; s=arc-20240605; b=AzsglXqOYvDWG2ggY8nt2XKsGBdcTmJVj/CLBZ041UUEYkiQ3dwxnNyCKHGn2MnMSc Pmlw4F+QHsDa/jCTlv80VkHv+ZF6f49xEZBen3c4C9whBq2XYbUe2j8N8VZBy7Vxj9fw GBCiELpCzP/cVqYgkUsoKfWDUscHY+sSgTaSIDRDA7hf2B1sjvVgc66Pfz5A4Hn6lJhe 6TLWlmiGL2ja3UVtjNNm7Mx0yNSCSP34z++jwOxFdxVW9eUVb2BKKDXoU3gug/nNqfU/ QXeXq20MH8o/r1n09WxQFJJeCyb7zWkgXJGtHHkzRI2yy6AnalQKvxo6Rf7Ru2BtD3bb U2hw== 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=XfsoSGTPDOVYGqsjQnGjB7p2SUhjfvlCwq31IRXvuUc=; fh=Jry5DxpL8WIr+X5qgN6wgGlhrliDJkLgYW8sqIJaBww=; b=chj71MiFLyGR2VQ8phpj6tSKsJUqDMCt8wmu7NB4kPeLDL/2PTbcrm3uEEQeYKPwAs Zyvlg7HqG6FXDC1woKMoUWo2WZtEIw3IrUNUgXcy3urV2cby9bBdXNPbZqeyoblz3ojo 3jrud5G8ucWvPPcfn/7MtbZsSF4WXZYm/4kghmlb+UT3vEIZhL6Kw2J46Oz8vYL291Uo I2BkKPMP+obUfm0/GWiIGiHpFGH7xaSKZJ5Y7Y9nzDdsQx338M58VmaLDQA9qF4q740O WvsgSh8/goPR7Vo2gETW6Uh7ZUvZvCoaBVh5pR4+fKUphFAogWMjfj9IFmjC2/AOZBaW VhuA==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Bx5rM6xV; 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=1761581789; x=1762186589; 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=XfsoSGTPDOVYGqsjQnGjB7p2SUhjfvlCwq31IRXvuUc=; b=a+EsoeHRhrqAd78RAWdry2OGhUn1AeNZ0mDGZpBqAOeTzaXPgGYVb+7KpKuleqe6NF Un0vw+sWp2w+C1+i+s2OFAHTjiod9j0qbop+IlSPuhhxkeYtGRBR6u1of2tH9Sr+EsiM 8GRjCIMWfNj6DQf+y9tOtHdI8mlVlEQsuwkJA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761581789; x=1762186589; 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=XfsoSGTPDOVYGqsjQnGjB7p2SUhjfvlCwq31IRXvuUc=; b=PyhaMJsTPfeR5LP9m7me/TanZxmSbRW6HOeqPiNEk4y+66XQZNdf2mZqClaMc8qnD7 Oqho2wAUyzspy4TztZAiyCo5bWlJjqNLIMwwkHSa5xZiLXdYJ74MCMUc8TdD8JMa91C4 48XuJKPf9MZjcuS13ZFn5qEn+mL/UJNMy2PZtgAOxT/5cN1W7+V9fPz72t1SeSU3oBNO f6qhYH33vkZtHtAeDMpb0mHyWoecDr8pdiGrfYzXGhWSjonoMutKg9QtvLtl+k/wnT5h n1MbajedV67VWD+jy2Ar0aYs+4MXVQ3+FIqoXQkS/Ra4xxFrpaoj0QmCTm1tBSdSE7Ds /n2g== X-Forwarded-Encrypted: i=2; AJvYcCXO+lT5U+Un5X0aKSBgeh/VJDK+s95ysOayC4mbc+qNlB4UW5lO8o9PDxLiSsfqeL4oBlQ7p/QDPCYKlG9/@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0YxPz2erTR6sXEu1PGzzXPrUQKkozqYDUXGPwbxlvdU9sKHZb4se 701jQHAbY1xBRH8gLOpY+TLFOH1PLDr/syv2Y+4LD73mlsB9lAHqERZlFzJ9aknx5y2AZg== X-Google-Smtp-Source: AGHT+IFEmVTrsKdRGe9EuFfgYXU7T58RV3m1vlJV5pxJ3U/s7Q4GiEM6gB9Mn36yixMOlwOqoOGoKA== X-Received: by 2002:a05:6402:26cc:b0:639:c9c2:3964 with SMTP id 4fb4d7f45d1cf-63ed7e128e1mr256986a12.1.1761581788885; Mon, 27 Oct 2025 09:16:28 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com; h="Ae8XA+YnkS8t3qtTQVY45TmSMwsgAp5jC2HH9xAEIbJSzGy89w==" Received: by 2002:a05:6402:3258:10b0:63b:f5ce:2fff with SMTP id 4fb4d7f45d1cf-63e3eb6bbfbls949650a12.1.-pod-prod-02-eu; Mon, 27 Oct 2025 09:16:26 -0700 (PDT) X-Received: by 2002:a17:906:9fcf:b0:b6d:6a44:5fd9 with SMTP id a640c23a62f3a-b6dba55bae8mr60128666b.48.1761581786189; Mon, 27 Oct 2025 09:16:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1761581786; cv=none; d=google.com; s=arc-20240605; b=jJfd3lQrIQhuG+NK3cjNekGXUGtut2l0a12V+2OiZFp2JdY234vfVy+Sr0S09uijEA 6hjE9fHLQCCJ04VoZrlM+ewa+c6hyncBDLzSPPNnQGOoOaYVwsP60ZaLMonGTDvegcAZ +24u96QLVmHep0i2RkfmWkBxIIAQAiyfNFQfG/gkPHwfHl/8n3qC3VJW6qQmWsmP6See 6b59pdjTdBR+ezI4ajP3RTu0/uwoTtmYuUG6/aGMbcp6HcWsEtSDRycG1IisVEMjqn4o LP+IeVaRhxB9k1WQxR2fafY9WZBCRnLjkfmJs9masJ4o/z5hcHFLmpQRA2ucFOUodgRu qOrQ== 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=dPYho8Qu09IQiF/d4ybgLxhO4EcHqRatvEGSDjzG4FM=; fh=xX3+bj9q+hdGppSo8sV0O20vMBXQtndd2swhLwiVzRA=; b=j3j3RI1ygStRKy0/omXQ4CpmeaaUm/aA9aj1cL06J1dQ2XvWJpzsoL2y0B/F1dEpFx 1acWV3kyHmKFDwzA9B4GAyCxqGJx8ro7JuQS6x9cGHIaWjRpxQEBHYG5OCTrsrZZqt54 pR/CIvgNqNJKroCogVWNtqFa0O39YpYZ7c24Zi6zIYvRRV+5vj0dUUTAy7es+5RIcfW8 C3Whbhp5+r72QQuSzWRPgPEl8qH/d9eg5PAt0wBr2CmbLH1ucF7NLa9LTg2uk6/Dsg8x C/RQQaV43PNLRS1p/n/xc6dRps8nD0/Uzs+dbBb5EwXY9wvBEHO6ak+kajKiuje6DF6z ZOgA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=Bx5rM6xV; 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-b6d872539ecsor185468166b.8.2025.10.27.09.16.26 for (Google Transport Security); Mon, 27 Oct 2025 09:16:26 -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: ASbGncslHa/h4bokoTu4AtJcqjXd1tcKvSiZvA0GLGV+5gJ2iHb4f4XNoXpIHmPhobF uP2E0E7KZGVzqL1Z0wfIwJj7ZutSMlPLpLzbLEju2e5U3BFGdmnC5AwLaPohmz1VF5LzpitgomE ernuDC3Q7BhQ1UbHsedZcevNjKvJ+8gtTEA1sMzDJSG2SFyVeQxw+LT6Ay7LYjGI07V7BYz4YVu I+QTT/9eWylVWAeeiZl1gifAF6o80li0eRM/kbY0SODkcdofSXagqicu9L5cL8+NRyuYltL7EZS evIQYM1+iyGit/OP6hmfH8rs0Syle34gt+o+6MhcrpO4S7gdju0GLtUtMo3o7WB1Z5EIYU8PhIm 0KqUlW6CPFNCvm45UNGKRBZtxB4df5j8CcC+eSr2yprFEGh3jq6IZIqUjGrcX7KLNVkIMA5at5X UU0FtzTusB09Z+1dPnGaglHynO11wO/GJC0stPkpjvvZGK/rDn+2v/YxhoFv3Dp0spwoOLlMhpO kBDYxAnBpIlN6YY06OGvZ8XkOBkNIdBpAP5E3xHIq7a X-Received: by 2002:a17:907:94c7:b0:b6d:573d:bbc5 with SMTP id a640c23a62f3a-b6dba525d87mr43276466b.37.1761581785729; Mon, 27 Oct 2025 09:16:25 -0700 (PDT) Received: from dario-ThinkPad-P14s-Gen-5.homenet.telecomitalia.it (host-82-50-34-170.retail.telecomitalia.it. [82.50.34.170]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b6d854430dbsm798403666b.63.2025.10.27.09.16.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Oct 2025 09:16:24 -0700 (PDT) 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: Mon, 27 Oct 2025 17:16:05 +0100 Message-ID: <20251027161622.2021180-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=Bx5rM6xV; 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,