public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: linux-input@vger.kernel.org
Cc: Marge Yang <Marge.Yang@tw.synaptics.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2 12/20] Input: rmi4 - refactor F12 probe function
Date: Mon,  4 May 2026 21:59:42 -0700	[thread overview]
Message-ID: <20260505045952.1570713-12-dmitry.torokhov@gmail.com> (raw)
In-Reply-To: <20260505045952.1570713-1-dmitry.torokhov@gmail.com>

The F12 probe function contains highly repetitive logic for parsing
register descriptors and their individual data items. Refactor the
function to use loops to eliminate redundancy, and clarify the code.

Assisted-by: Gemini:gemini-3.1-pro
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/rmi4/rmi_f12.c | 197 ++++++++++++++---------------------
 1 file changed, 81 insertions(+), 116 deletions(-)

diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c
index c2b07c6905d7..973288103b6a 100644
--- a/drivers/input/rmi4/rmi_f12.c
+++ b/drivers/input/rmi4/rmi_f12.c
@@ -61,6 +61,36 @@ struct f12_data {
 	unsigned long *rel_mask;
 };
 
+static int rmi_f12_read_register_descs(struct rmi_function *fn,
+				       struct f12_data *f12, u16 query_addr)
+{
+	struct {
+		struct rmi_register_descriptor *desc;
+		const char *name;
+	} descriptors[] = {
+		{ &f12->query_reg_desc, "Query" },
+		{ &f12->control_reg_desc, "Control" },
+		{ &f12->data_reg_desc, "Data" },
+	};
+	struct rmi_device *rmi_dev = fn->rmi_dev;
+	int error;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(descriptors); i++) {
+		error = rmi_read_register_desc(rmi_dev, query_addr,
+					       descriptors[i].desc);
+		if (error) {
+			dev_err(&fn->dev,
+				"Failed to read the %s Register Descriptor: %d\n",
+				descriptors[i].name, error);
+			return error;
+		}
+		query_addr += 3;
+	}
+
+	return 0;
+}
+
 static int rmi_f12_read_sensor_tuning(struct f12_data *f12)
 {
 	const struct rmi_register_desc_item *item;
@@ -351,6 +381,7 @@ static int rmi_f12_probe(struct rmi_function *fn)
 	struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
 	u16 data_offset = 0;
 	int mask_size;
+	int i;
 
 	rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__);
 
@@ -393,35 +424,9 @@ static int rmi_f12_probe(struct rmi_function *fn)
 		f12->sensor_pdata = pdata->sensor_pdata;
 	}
 
-	ret = rmi_read_register_desc(rmi_dev, query_addr,
-					&f12->query_reg_desc);
-	if (ret) {
-		dev_err(&fn->dev,
-			"Failed to read the Query Register Descriptor: %d\n",
-			ret);
-		return ret;
-	}
-	query_addr += 3;
-
-	ret = rmi_read_register_desc(rmi_dev, query_addr,
-						&f12->control_reg_desc);
-	if (ret) {
-		dev_err(&fn->dev,
-			"Failed to read the Control Register Descriptor: %d\n",
-			ret);
-		return ret;
-	}
-	query_addr += 3;
-
-	ret = rmi_read_register_desc(rmi_dev, query_addr,
-						&f12->data_reg_desc);
-	if (ret) {
-		dev_err(&fn->dev,
-			"Failed to read the Data Register Descriptor: %d\n",
-			ret);
+	ret = rmi_f12_read_register_descs(fn, f12, query_addr);
+	if (ret)
 		return ret;
-	}
-	query_addr += 3;
 
 	sensor = &f12->sensor;
 	sensor->fn = fn;
@@ -452,101 +457,61 @@ static int rmi_f12_probe(struct rmi_function *fn)
 		return ret;
 
 	/*
-	 * Figure out what data is contained in the data registers. HID devices
-	 * may have registers defined, but their data is not reported in the
-	 * HID attention report. Registers which are not reported in the HID
-	 * attention report check to see if the device is receiving data from
-	 * HID attention reports.
+	 * Identify available data registers and calculate their offsets within
+	 * the attention report. For HID devices, only Data1 and Data5 are
+	 * included in the report; other registers may be described but are
+	 * not transmitted in the attention packet and thus skipped here.
 	 */
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 0);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 1);
-	if (item) {
-		f12->data1 = item;
-		f12->data1_offset = data_offset;
-		data_offset += item->reg_size;
-
-		if (item->num_subpackets > 255) {
-			dev_err(&fn->dev, "Too many fingers declared: %d\n",
-				item->num_subpackets);
-			return -EINVAL;
-		}
-
-		sensor->nbr_fingers = item->num_subpackets;
-		sensor->report_abs = 1;
-		sensor->attn_size += item->reg_size;
-	}
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 2);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 3);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 4);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 5);
-	if (item) {
-		f12->data5 = item;
-		f12->data5_offset = data_offset;
-		data_offset += item->reg_size;
-		sensor->attn_size += item->reg_size;
-	}
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 6);
-	if (item && !drvdata->attn_data.data) {
-		f12->data6 = item;
-		f12->data6_offset = data_offset;
-		data_offset += item->reg_size;
-	}
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 7);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 8);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
-
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 9);
-	if (item && !drvdata->attn_data.data) {
-		f12->data9 = item;
-		f12->data9_offset = data_offset;
-		data_offset += item->reg_size;
-		if (!sensor->report_abs)
-			sensor->report_rel = 1;
-	}
+	for (i = 0; i < 16; i++) {
+		item = rmi_get_register_desc_item(&f12->data_reg_desc, i);
+		if (!item)
+			continue;
+
+		/* HID attention reports only contain Data1 and Data5 */
+		if (drvdata->attn_data.data && i != 1 && i != 5)
+			continue;
+
+		switch (i) {
+		case 1:
+			f12->data1 = item;
+			f12->data1_offset = data_offset;
+
+			if (item->num_subpackets > 255) {
+				dev_err(&fn->dev,
+					"Too many fingers declared: %d\n",
+					item->num_subpackets);
+				return -EINVAL;
+			}
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 10);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
+			sensor->nbr_fingers = item->num_subpackets;
+			sensor->report_abs = 1;
+			sensor->attn_size += item->reg_size;
+			break;
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 11);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
+		case 5:
+			f12->data5 = item;
+			f12->data5_offset = data_offset;
+			sensor->attn_size += item->reg_size;
+			break;
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 12);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
+		case 6:
+			f12->data6 = item;
+			f12->data6_offset = data_offset;
+			break;
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 13);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
+		case 9:
+			f12->data9 = item;
+			f12->data9_offset = data_offset;
+			if (!sensor->report_abs)
+				sensor->report_rel = 1;
+			break;
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 14);
-	if (item && !drvdata->attn_data.data)
-		data_offset += item->reg_size;
+		case 15:
+			f12->data15 = item;
+			f12->data15_offset = data_offset;
+			break;
+		}
 
-	item = rmi_get_register_desc_item(&f12->data_reg_desc, 15);
-	if (item && !drvdata->attn_data.data) {
-		f12->data15 = item;
-		f12->data15_offset = data_offset;
 		data_offset += item->reg_size;
 	}
 
-- 
2.54.0.545.g6539524ca2-goog


  parent reply	other threads:[~2026-05-05  5:00 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-05  4:59 [PATCH v2 01/20] Input: rmi4 - fix register descriptor address calculation Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 02/20] Input: rmi4 - refactor register descriptor parsing Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 03/20] Input: rmi4 - fix type overflow in register counts Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 04/20] Input: rmi4 - fix num_subpackets overflow in register descriptor Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 05/20] Input: rmi4 - fix memory leak in rmi_set_attn_data() Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 06/20] Input: rmi4 - iterative IRQ handler Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 07/20] Input: rmi4 - fix bit count in bitmap_copy() Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 08/20] Input: rmi4 - fix limit in rmi_register_desc_has_subpacket() Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 09/20] Input: rmi4 - use local presence map in rmi_read_register_desc() Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 10/20] Input: rmi4 - refactor function allocation and registration Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 11/20] Input: rmi4 - use kzalloc_flex() for struct rmi_function Dmitry Torokhov
2026-05-05  4:59 ` Dmitry Torokhov [this message]
2026-05-05  4:59 ` [PATCH v2 13/20] Input: rmi4 - change reg_size type to u32 Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 14/20] Input: rmi4 - use unaligned access helpers in F12 Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 15/20] Input: rmi4 - use flexible array member for IRQ masks " Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 16/20] Input: rmi4 - use devm_kmalloc for F12 data packet buffer Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 17/20] Input: rmi4 - use sizeof(*ptr) and idiomatic checks in f12 allocators Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 18/20] Input: rmi4 - simplify size calculations in F12 Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 19/20] Input: rmi4 - propagate proper error code in F12 sensor tuning Dmitry Torokhov
2026-05-05  4:59 ` [PATCH v2 20/20] Input: rmi4 - update formatting in F12 Dmitry Torokhov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260505045952.1570713-12-dmitry.torokhov@gmail.com \
    --to=dmitry.torokhov@gmail.com \
    --cc=Marge.Yang@tw.synaptics.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox