From patchwork Mon Sep 15 20:16:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dario Binacchi X-Patchwork-Id: 4303 Return-Path: X-Original-To: linux-amarula@patchwork.amarulasolutions.com Delivered-To: linux-amarula@patchwork.amarulasolutions.com Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by ganimede.amarulasolutions.com (Postfix) with ESMTPS id 40D2E3F080 for ; Mon, 15 Sep 2025 22:18:07 +0200 (CEST) Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-45dd5c1b67dsf29231735e9.2 for ; Mon, 15 Sep 2025 13:18:07 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1757967487; cv=pass; d=google.com; s=arc-20240605; b=KV2EmGHiax+pMufbbrl7NBsjdnzxb9QjejbLcwl6PoZ4B2vRjQDP/54ATrO2NW/9Vt Txngvm6cx1P+ycVbz110u6JcxgbpLlFaDXeBA+GAwqhZKTjCmiDJrFkBja234bDH1ozF /Jf0ZMIqmibCOWYshjSkrDmYKDMV9QzzmaT0gYMrCnQ/HTet2NRQpa0eU6UA0PilwIwG khFBrjYJPE0ndLZg0rRebfihHwAudTK+CfyawG40pFd6B3rN/amnst3STZD3o2l9Urtk INtlgL8x0kPGIAbuqcgWB8fVQ5/H82RorqQ2n7GfTjcyPang3OBRaVUniaJGko39q5Pl W/zg== 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=HKSy6UV83vkgLungnTJmh1RlbHcAJEQrAENhGNTqBlM=; fh=qKzj8DHu4ByDemVuL7OEkW+f88a5ib6+VQUwJJf0KGM=; b=CHmTroCvM34RqIQ6NfHB0ia+k402oj9RLfR6j6+9I0Q8h4Yg1QrCtWiYnnZX4NlKj/ i9Pw3e9T0zUc+h+BTffCSjSlK7uw3XB1O0qh8RAqTtZMyEUjOHVsc1Qe2UqA37bBv+tf n1gcNTsClzNW925ZBKWiJN6Vqhrfgm49t2xQblLF++C8FjagOsg/JEDE4xd+bsjoMXph Ns/0nXTUyPvYbhWHebzKfZT9D9f04dNU4YEfAvPeJD41seDLxkE8aD7GymULid/AFIxB Q6jEwWhHJIGXbpUKO37WcAKVdYz5g+vUeLPuVv6Xjw7L2A91sQ1U6yzkbmoa1O8/nxyW qCKA==; darn=patchwork.amarulasolutions.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=n2zSszpx; 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=1757967487; x=1758572287; 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=HKSy6UV83vkgLungnTJmh1RlbHcAJEQrAENhGNTqBlM=; b=luLDaQz9F1PsoohIDQCmKCSzQNOifGwBu9JsC2sX00SeqMmvFIJWVab26NhGIrvF1Q sfdNJU7WWgosAWqYTwZPXkF+tnfp2nHcQqoERGWSG6Dlp3emS2C9dTWzmvF2uGO33Yzr IAY7z66yh7FVUGy+7m9zqQLuIhf+Z7mLB48S8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1757967487; x=1758572287; 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=HKSy6UV83vkgLungnTJmh1RlbHcAJEQrAENhGNTqBlM=; b=FkpIQwHbQamSEn1PR+OX2XVOLrOVdvWwNGeOZlLv8hT+IMSOD3lpJTHo6XDab4aDPi aezc+jOwklKPYPFtPe4+gJl5Ri1UV+5mHjI8hLrYScAmS0zQsbfOxxUUiX+C81LTq4ZM QDwXtNTgohJW2sp0mzCETvPp951akpDhe8tudZBjmufRIRe3hU8xlSGLspUgIczbwssi wqm2Thh+S1dMe+Us2og5fkwOdWoeBSh0pf7XnFZiB6lcmxlzzv2eugpa82ddvMD0eyXX Nrm9Gf3WM7VkRvM7T1uNzKkhAPAldsqQb80f5sEisgVQZHoJ8P9UdrsoKazcCKIuQlJb krcQ== X-Forwarded-Encrypted: i=2; AJvYcCX0XtEDdjxUvKno4+8DVG43rXzzjycr1F7TZZP6ZyG1Gb5QIQkUqnbjcKwmZ1ELNxqvWWj2f6e43tKa4K0Y@patchwork.amarulasolutions.com X-Gm-Message-State: AOJu0Yx+LZM7G0SHUgsICwMH3nEi5YkH0QreaPaQVwQX6qgntZlVKxv7 E0etzlXEMUEwH+oPjbQcGn5uxiq+cDxqhn67mI18vvlpzaH75gLdyR0RGX4gmNqR0QTxeg== X-Google-Smtp-Source: AGHT+IH0Eyq5xvKcW7MALsgX3Azlc5IcuYe9IWQNw3rv3/Dk36vJa+EG3xUorGyi+ssMhpaovD03xw== X-Received: by 2002:a05:600c:5813:b0:45d:d96e:6176 with SMTP id 5b1f17b1804b1-45f211fe9d2mr98320505e9.25.1757967486371; Mon, 15 Sep 2025 13:18:06 -0700 (PDT) X-BeenThere: linux-amarula@amarulasolutions.com; h=AZMbMZfu4b55cuKDOjS1FN8N6heBqfkdEJMGh0yyLHx9WfxVOw== Received: by 2002:a05:600c:1c11:b0:45d:f7df:26cf with SMTP id 5b1f17b1804b1-45f29ca8d8cls13622285e9.0.-pod-prod-04-eu; Mon, 15 Sep 2025 13:18:04 -0700 (PDT) X-Received: by 2002:a05:600c:3b8f:b0:45f:29e4:92fc with SMTP id 5b1f17b1804b1-45f29e493ebmr59686575e9.20.1757967483881; Mon, 15 Sep 2025 13:18:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1757967483; cv=none; d=google.com; s=arc-20240605; b=D3krftsyqs0PPZUYlsYHyhuZ9G4m1ATVwaKp49D0oWwYJNtehxV2rRGMVjgAtw/JXN 2JwEjstsYSkr4+rapeCRtxnyVzgSZ7a4LYiBhZ2TTYJJx1UxpTruIGlY+bPDhREkqJdR xcf71jPIXXhLoM/OSL6FhXmTPMF0HBlQkDl5IZMGMqu1XK42tN31YjPfj0GSYFQbIF7N /J86gLuZoI/lmdP7DFIGDe9WtSEEzn4dQ41za0z8yn/qMqJ8J30QqvKLH7a7yG1/6VhD g8fawkcjh6nRNtfuxbIXhUok+/y3g797ipF6qXcXGqEgimqDr++QPWrAQIUqTd3wSxdK wOgQ== 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=sJJhpppygvVmFx5yZMKGD+Tn+q1juVpsqVaPDYy/WKI=; fh=MAz4EeQcDARwHi47cRAHWWErDXfTeuPFQXyTOIfQcQs=; b=BDXJIDdqdKC12Hr0FosBh3x6XYwSvyuPb77fGmhBorrw1JBNAyMQZ9ygnR4MYtHUPx MvPSx0fHtv2rNO8XnniPQpQzQ20nyNN8BWP7XTGNZFqgENm8YzEJWo2zHFsmF7OQBwHR P17XKQXHx3TvbSailFNDTP36Gsgz7XUyfC9NkDr6HjZ+6BCm4mqzAKTm/Mgqwkz9DXcB g3RbaGV0E//YzsJqoHPzLx5bNfRb0XaqeFhSl6O0aFFyyQE850y3KCoZlw9U7cNUa/+v MM0QuvVyq/kPqxEuinWtkpySs+4o7fBXpgpRpgUQOTBUedw8m5vglE5/AE0VFwSsU6KK Ueuw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@amarulasolutions.com header.s=google header.b=n2zSszpx; 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 ffacd0b85a97d-3e7608185cesor2802007f8f.13.2025.09.15.13.18.03 for (Google Transport Security); Mon, 15 Sep 2025 13:18:03 -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: ASbGncvK4iOY3JtzpX5yBnaGZnLFPVxbD1fhTmY3N2CItrb6xq++4XtZRKL5QxcbBNZ 76P5cYAHsYmmxpldkfLMTJgDFEEMZBX+xFnt4UJ29+Z0m8sJvYxQTD0PM34f/n2TRpbOcoJiiF2 gZhbGt37vWWLLYMrrC+0tczWFHBUSG3wiLlwL8Hqz+i51/7KUkFXAkWuryFm8KHjEOuxqsb6YyJ VpNT67V2OFmwt8mFzKKZvFIxgVjWOagW3kGeJ72rBWCJwEnVwPNMUocpeL9uEsE744zTUaG4vjk N9EPR5rT1+fo9s+xbUQIVOLbRgZ7cfcK+I7/PMztVltAx8I4mVRLoXLkLNmdoKT/3SpvnAMGUZk vwcL4etun2lIo8UVtvI/+HMrcMMqWytzoUGhEJ5VbQSfRmxjuMZqPtSAaXIRWZ2c= X-Received: by 2002:a05:6000:438a:b0:3eb:5ff:cb2e with SMTP id ffacd0b85a97d-3eb05ffcfdbmr2622016f8f.29.1757967483330; Mon, 15 Sep 2025 13:18:03 -0700 (PDT) Received: from dario-ThinkPad-T14s-Gen-2i.. ([2.196.40.230]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3e7d369ea3bsm13724160f8f.0.2025.09.15.13.18.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Sep 2025 13:18:02 -0700 (PDT) From: Dario Binacchi To: linux-kernel@vger.kernel.org Cc: linux-amarula@amarulasolutions.com, Dario Binacchi , Al Viro , Dmitry Torokhov , Oliver Graute , Wolfram Sang , Yu Jiaoliang , linux-input@vger.kernel.org Subject: [PATCH 1/2] Input: edt-ft5x06 - fix report rate handling by sysfs Date: Mon, 15 Sep 2025 22:16:31 +0200 Message-ID: <20250915201748.1712822-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=n2zSszpx; 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 --- 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,