From: Dmitry Torokhov Date: Tue, 5 May 2026 04:59:39 +0000 (-0700) Subject: Input: rmi4 - use local presence map in rmi_read_register_desc() X-Git-Tag: v7.2-rc1~44^2^2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4e5336f303e2845a82735b5578f7c0e4a175f8c5;p=thirdparty%2Flinux.git Input: rmi4 - use local presence map in rmi_read_register_desc() 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 --- diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index d15d04a66636d..94b49e4dd0fa2 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -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; diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h index 6952059bf4f51..b93905a6a43ae 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -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; };