[PATCH v2 12/20] Input: rmi4 - refactor F12 probe function
From: Dmitry Torokhov
Date: Tue May 05 2026 - 01:05:04 EST
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@xxxxxxxxx>
---
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