]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Input: rmi4 - use local presence map in rmi_read_register_desc()
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 5 May 2026 04:59:39 +0000 (21:59 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 12 Jun 2026 05:39:28 +0000 (22:39 -0700)
The presence map is only used during the parsing of the register
descriptor, so we can make it a local variable instead of storing it
in struct rmi_register_descriptor.

Also fix the spelling of the constant and the variable name (presence
instead of presense).

Assisted-by: Gemini:gemini-3.1-pro
Link: https://patch.msgid.link/20260505045952.1570713-9-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/rmi4/rmi_driver.c
drivers/input/rmi4/rmi_driver.h

index d15d04a66636dba10065fb732a547926410d3b5f..94b49e4dd0fa29fca897b3e36178e1deca7b0292 100644 (file)
@@ -610,15 +610,16 @@ static int rmi_parse_register_desc_item(struct rmi_register_desc_item *item,
 int rmi_read_register_desc(struct rmi_device *d, u16 addr,
                           struct rmi_register_descriptor *rdesc)
 {
-       int ret;
+       DECLARE_BITMAP(presence_map, RMI_REG_DESC_PRESENCE_BITS);
+       u8 buf[RMI_REG_DESC_PRESENCE_REGS_MAX];
        u8 size_presence_reg;
-       u8 buf[35];
        unsigned int presence_offset;
        unsigned int map_offset;
        unsigned int offset;
        unsigned int reg;
        int i;
        int b;
+       int ret;
 
        /*
         * The first register of the register descriptor is the size of
@@ -629,7 +630,7 @@ int rmi_read_register_desc(struct rmi_device *d, u16 addr,
                return ret;
        ++addr;
 
-       if (size_presence_reg < 1 || size_presence_reg > 35)
+       if (size_presence_reg < 1 || size_presence_reg > RMI_REG_DESC_PRESENCE_REGS_MAX)
                return -EIO;
 
        memset(buf, 0, sizeof(buf));
@@ -654,20 +655,21 @@ int rmi_read_register_desc(struct rmi_device *d, u16 addr,
                rdesc->struct_size = buf[0];
        }
 
+       memset(presence_map, 0, sizeof(presence_map));
        map_offset = 0;
        for (i = presence_offset; i < size_presence_reg; i++) {
                for (b = 0; b < 8; b++) {
                        if (buf[i] & BIT(b)) {
-                               if (map_offset >= RMI_REG_DESC_PRESENSE_BITS)
+                               if (map_offset >= RMI_REG_DESC_PRESENCE_BITS)
                                        return -EIO;
-                               bitmap_set(rdesc->presense_map, map_offset, 1);
+                               bitmap_set(presence_map, map_offset, 1);
                        }
                        ++map_offset;
                }
        }
 
-       rdesc->num_registers = bitmap_weight(rdesc->presense_map,
-                                               RMI_REG_DESC_PRESENSE_BITS);
+       rdesc->num_registers = bitmap_weight(presence_map,
+                                               RMI_REG_DESC_PRESENCE_BITS);
 
        rdesc->registers = devm_kcalloc(&d->dev,
                                        rdesc->num_registers,
@@ -695,7 +697,7 @@ int rmi_read_register_desc(struct rmi_device *d, u16 addr,
        if (ret)
                return ret;
 
-       reg = find_first_bit(rdesc->presense_map, RMI_REG_DESC_PRESENSE_BITS);
+       reg = find_first_bit(presence_map, RMI_REG_DESC_PRESENCE_BITS);
        offset = 0;
        for (i = 0; i < rdesc->num_registers; i++) {
                struct rmi_register_desc_item *item = &rdesc->registers[i];
@@ -714,8 +716,8 @@ int rmi_read_register_desc(struct rmi_device *d, u16 addr,
                        "%s: reg: %d reg size: %ld subpackets: %d\n", __func__,
                        item->reg, item->reg_size, item->num_subpackets);
 
-               reg = find_next_bit(rdesc->presense_map,
-                                   RMI_REG_DESC_PRESENSE_BITS, reg + 1);
+               reg = find_next_bit(presence_map,
+                                   RMI_REG_DESC_PRESENCE_BITS, reg + 1);
        }
 
        return 0;
index 6952059bf4f5194b119619ff26f43831b7c4fb45..b93905a6a43ae4616a9314d7845a00169a084470 100644 (file)
@@ -46,7 +46,8 @@ struct pdt_entry {
        u8 function_number;
 };
 
-#define RMI_REG_DESC_PRESENSE_BITS     (32 * BITS_PER_BYTE)
+#define RMI_REG_DESC_PRESENCE_BITS     (32 * BITS_PER_BYTE)
+#define RMI_REG_DESC_PRESENCE_REGS_MAX (3 + RMI_REG_DESC_PRESENCE_BITS / 8)
 #define RMI_REG_DESC_SUBPACKET_BITS    (37 * BITS_PER_BYTE)
 
 /* describes a single packet register */
@@ -64,7 +65,6 @@ struct rmi_register_desc_item {
  */
 struct rmi_register_descriptor {
        unsigned long struct_size;
-       unsigned long presense_map[BITS_TO_LONGS(RMI_REG_DESC_PRESENSE_BITS)];
        u16 num_registers;
        struct rmi_register_desc_item *registers;
 };