From nobody Sun Feb 8 13:53:47 2026 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6700E2C0291 for ; Wed, 12 Nov 2025 17:19:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762968001; cv=none; b=btpeC6wlBt6GbH7SEr4qpBVfmOqd/9NveSDj4MG0S8utAo/cmX5DOswwkH8sSq72pLSwGtm2LK0Yq0Xsk76IYtHBbX54K9jdU4fON+FZf5hoAE193qG5gbw+jejv2+tgMf4r+nXurOPwN7Tzn0vi26oLKMOtnrfjKKUvzLwFp38= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762968001; c=relaxed/simple; bh=cIX1HljknQMLtdyrw/7vo4f6+C4rysEqzacl9pFRVCs=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=YhWdi66oI21aGUgZbqycpFXQpJvCcThUbsfR3sGyi9IAqfb5LoYu9fWgWeawRPqRUgwBWYy7kSJP8/aErvSakiyrLI2OC/+Kj0N8AR5XVXG1WOz/yMZeJcMtfteG6ILG9ZKAVAgL/++bdj2C/fyQJENf/1O8rU32k3WmWxnppn4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com; spf=pass smtp.mailfrom=amarulasolutions.com; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b=TwU8osXX; arc=none smtp.client-ip=209.85.208.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=amarulasolutions.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amarulasolutions.com header.i=@amarulasolutions.com header.b="TwU8osXX" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-640bd9039fbso2027453a12.2 for ; Wed, 12 Nov 2025 09:19:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amarulasolutions.com; s=google; t=1762967997; x=1763572797; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=htWCmp/HqOC3LZuhkUtvSCsNEkCvDxqHS6yOGkHh6Qw=; b=TwU8osXXi1u3ZLeck+T/GmHnNqUHvsHvWCBdscw5uGz+cKdeBfybv+aJ0t9PzuN2Xk 0QHAQ03P68tnUfpCYgqz2i2FydWWGInD2rjIN4jBFiYZb6dEW7RzVOx2n3M2B2WPi0bj BKinXKQMQA40gWPzGKhfVD4doT6frwlCWL5w4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762967997; x=1763572797; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=htWCmp/HqOC3LZuhkUtvSCsNEkCvDxqHS6yOGkHh6Qw=; b=fC6mkg89H4YGr7jtWCI9IG+QqvzPJ9DYxX4bn3aY5I9p1RpGt+SJ1U0ZdwnMUed757 GNNP/3ErWxIn2t5iquyBMEc9P6eOkrhv+xGTr/Dxced/g5Cpbj4ZluG6gBSWAezpeKel sA8suITKIUJYnJkGbTlOYaxp8l3izpkNMnosr7AMQfaVwpyACJr171NqIfQlTSxf/JQp 4nwG5d6wi1sAeH27jh6YvyFFQd6OMRtRzbzaSs7CAVB+GasmxcUgGinYYDBqejXcB946 ZQqpatx7NgmEsA4JHT8GzDzJB2tEvc2ICbeCnVocCsh2lWHpNnPMN4Ns83U+mejJl0Zm +F2w== X-Gm-Message-State: AOJu0YyfsoKSJjxuKdjw7lXZsPla1k8V3Z79qTOZOAQ5p5J0NVLyBJxP sB3FrpTTSQQ7u1a9DzTp5rC3g+YEVYY58uwQdQr9rCvkm+9LI3cLe+WoTOsY6Uu+4RZVL1w/hMH /kqT5 X-Gm-Gg: ASbGncvoif8OujZMU/YxkA60180QtBcZ5pKF2XjUQPxX7REJmX81MAQ6biO3Pf5LaFl H9XF4i3Vkr20IbpHcvLR8MAhXCVukAlHHPjlxYRLjYXlxGoS999vut8sT+lajQsO9Vv/7t9lDNS EucaXZMgG0lCV/w61jC5Un6T0kDN0miH/e2+DOsEgI/oKgRzzHmEKy5ut9RiTH6nJc5ryo6MQKR KVzlukTSkhPcHKcpyKaELKsU1oPssYjjW+xfVTcB2b+KFEas62I6SoaGm9whAZHMUAdd4U909Yy RHAoRWQHIXO5mqFWUeIRZ75tp7XN1xhKrjXveer/0KBUu7yVWhQyh4zpVxwa7gYDwNjKP0RFAtC sy96mYeP3MG3VnaWSASsFYs38e9r0s3tRCo9UyJJkbuvHXWHd+JcXJ25mZuJuU4cjs1JCwM6ZPX Yj9Me3gCao6I+5N8Sr85ouo3chU87bPD/+tsjsqqscfaWw2Qp/dv9XS9TGg8D3nlT9UvxYWLhT0 ej98sBX1Y3aRNO0VCkY+/NwoT6korh+ks5FLLIJQBqj X-Google-Smtp-Source: AGHT+IE7bK17fVUuGArh3EaIbNW9IKT2ffAI/pqUeoGXFPfQcnyo5QVy2bNe9piLDFmFF8y6mQJDQw== 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 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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/touchsc= reen/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_REGIS= TER, 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 =3D=3D NO_REGISTER) + return -EOPNOTSUPP; + + error =3D regmap_read(tsdata->regmap, tsdata->reg_addr.reg_report_rate, + &val); + if (error) + return error; + + if (tsdata->version =3D=3D EDT_M06) + val *=3D 10; + + if (val !=3D 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 =3D val; + } + + return 0; +} + +static ssize_t report_rate_show(struct device *dev, + struct device_attribute *dattr, char *buf) +{ + struct i2c_client *client =3D to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata =3D i2c_get_clientdata(client); + size_t count; + int error; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error =3D -EIO; + goto out; + } + + error =3D 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 =3D 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 =3D=3D NO_REGISTER) + return -EOPNOTSUPP; + + if (tsdata->version =3D=3D EDT_M06) + tsdata->report_rate =3D clamp_val(val, 30, 140); + else + tsdata->report_rate =3D clamp_val(val, 1, 255); + + if (val !=3D tsdata->report_rate) { + dev_warn(&tsdata->client->dev, + "report-rate %dHz is unsupported, use %dHz\n", + val, tsdata->report_rate); + val =3D tsdata->report_rate; + } + + if (tsdata->version =3D=3D EDT_M06) + val /=3D 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 =3D to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata =3D i2c_get_clientdata(client); + unsigned int val; + u8 limit_low; + u8 limit_high; + int error; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error =3D -EIO; + goto out; + } + + error =3D kstrtouint(buf, 0, &val); + if (error) + goto out; + + if (tsdata->version =3D=3D EDT_M06) { + limit_low =3D 30; + limit_high =3D 140; + } else { + limit_low =3D 1; + limit_high =3D 255; + } + + if (val < limit_low || val > limit_high) { + error =3D -ERANGE; + goto out; + } + + error =3D 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); =20 static ssize_t model_show(struct device *dev, struct device_attribute *att= r, char *buf) @@ -572,7 +699,7 @@ static struct attribute *edt_ft5x06_attrs[] =3D { &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 ed= t_ft5x06_ts_data *tsdata) if (reg_addr->reg_offset_y !=3D NO_REGISTER) regmap_write(regmap, reg_addr->reg_offset_y, tsdata->offset_y); if (reg_addr->reg_report_rate !=3D NO_REGISTER) - regmap_write(regmap, reg_addr->reg_report_rate, - tsdata->report_rate); + edt_ft5x06_report_rate_set(tsdata, tsdata->report_rate); } =20 #ifdef CONFIG_DEBUG_FS @@ -1029,8 +1155,8 @@ static void edt_ft5x06_ts_get_parameters(struct edt_f= t5x06_ts_data *tsdata) if (reg_addr->reg_offset_y !=3D NO_REGISTER) regmap_read(regmap, reg_addr->reg_offset_y, &tsdata->offset_y); if (reg_addr->reg_report_rate !=3D NO_REGISTER) - regmap_read(regmap, reg_addr->reg_report_rate, - &tsdata->report_rate); + edt_ft5x06_report_rate_get(tsdata); + tsdata->num_x =3D EDT_DEFAULT_NUM_X; if (reg_addr->reg_num_x !=3D 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 *cl= ient) if (tsdata->reg_addr.reg_report_rate !=3D NO_REGISTER && !device_property_read_u32(&client->dev, "report-rate-hz", &report_rate)) { - if (tsdata->version =3D=3D EDT_M06) - tsdata->report_rate =3D clamp_val(report_rate, 30, 140); - else - tsdata->report_rate =3D clamp_val(report_rate, 1, 255); - - if (report_rate !=3D tsdata->report_rate) - dev_warn(&client->dev, - "report-rate %dHz is unsupported, use %dHz\n", - report_rate, tsdata->report_rate); - - if (tsdata->version =3D=3D EDT_M06) - tsdata->report_rate /=3D 10; - - regmap_write(tsdata->regmap, tsdata->reg_addr.reg_report_rate, - tsdata->report_rate); + edt_ft5x06_report_rate_set(tsdata, report_rate); } =20 dev_dbg(&client->dev, --=20 2.43.0 base-commit: 24172e0d79900908cf5ebf366600616d29c9b417 branch: edt-ft5x06-fix-report-rate