summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2026-05-05 07:59:45 +0300
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2026-06-12 08:39:29 +0300
commitbcaea0fe87d521c044a3efc4ba3b78914072ed03 (patch)
tree34cf47f6090bfaed867ae8d30ca928eb43f4af4a
parentf764f0f98c35766d2337cfce118731735339358b (diff)
downloadlinux-bcaea0fe87d521c044a3efc4ba3b78914072ed03.tar.xz
Input: rmi4 - use flexible array member for IRQ masks in F12
Use a flexible array member to allocate the IRQ masks at the end of the f12_data structure, and use the struct_size() helper to calculate the allocation size safely. This replaces manual pointer arithmetic. Assisted-by: Gemini:gemini-3.1-pro Link: https://patch.msgid.link/20260505045952.1570713-15-dmitry.torokhov@gmail.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/rmi4/rmi_f12.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/input/rmi4/rmi_f12.c b/drivers/input/rmi4/rmi_f12.c
index 752c1d137da0..b9cd70422b68 100644
--- a/drivers/input/rmi4/rmi_f12.c
+++ b/drivers/input/rmi4/rmi_f12.c
@@ -59,8 +59,7 @@ struct f12_data {
const struct rmi_register_desc_item *data15;
u16 data15_offset;
- unsigned long *abs_mask;
- unsigned long *rel_mask;
+ unsigned long irq_mask[];
};
static int rmi_f12_read_register_descs(struct rmi_function *fn,
@@ -350,17 +349,21 @@ static int rmi_f12_config(struct rmi_function *fn)
{
struct rmi_driver *drv = fn->rmi_dev->driver;
struct f12_data *f12 = dev_get_drvdata(&fn->dev);
+ struct rmi_driver_data *drvdata = dev_get_drvdata(&fn->rmi_dev->dev);
+ int irq_mask_size = BITS_TO_LONGS(drvdata->irq_count);
+ unsigned long *abs_mask = f12->irq_mask;
+ unsigned long *rel_mask = f12->irq_mask + irq_mask_size;
struct rmi_2d_sensor *sensor;
int ret;
sensor = &f12->sensor;
if (!sensor->report_abs)
- drv->clear_irq_bits(fn->rmi_dev, f12->abs_mask);
+ drv->clear_irq_bits(fn->rmi_dev, abs_mask);
else
- drv->set_irq_bits(fn->rmi_dev, f12->abs_mask);
+ drv->set_irq_bits(fn->rmi_dev, abs_mask);
- drv->clear_irq_bits(fn->rmi_dev, f12->rel_mask);
+ drv->clear_irq_bits(fn->rmi_dev, rel_mask);
ret = rmi_f12_write_control_regs(fn);
if (ret)
@@ -383,12 +386,12 @@ static int rmi_f12_probe(struct rmi_function *fn)
struct rmi_driver_data *drvdata = dev_get_drvdata(&rmi_dev->dev);
size_t data_offset = 0;
size_t pkt_size;
- int mask_size;
+ int irq_mask_size;
int i;
rmi_dbg(RMI_DEBUG_FN, &fn->dev, "%s\n", __func__);
- mask_size = BITS_TO_LONGS(drvdata->irq_count) * sizeof(unsigned long);
+ irq_mask_size = BITS_TO_LONGS(drvdata->irq_count);
ret = rmi_read(fn->rmi_dev, query_addr, &buf);
if (ret < 0) {
@@ -404,18 +407,13 @@ static int rmi_f12_probe(struct rmi_function *fn)
return -ENODEV;
}
- f12 = devm_kzalloc(&fn->dev, sizeof(struct f12_data) + mask_size * 2,
- GFP_KERNEL);
+ f12 = devm_kzalloc(&fn->dev, struct_size(f12, irq_mask, irq_mask_size * 2),
+ GFP_KERNEL);
if (!f12)
return -ENOMEM;
- f12->abs_mask = (unsigned long *)((char *)f12
- + sizeof(struct f12_data));
- f12->rel_mask = (unsigned long *)((char *)f12
- + sizeof(struct f12_data) + mask_size);
-
- set_bit(fn->irq_pos, f12->abs_mask);
- set_bit(fn->irq_pos + 1, f12->rel_mask);
+ set_bit(fn->irq_pos, f12->irq_mask);
+ set_bit(fn->irq_pos + 1, f12->irq_mask + irq_mask_size);
f12->has_dribble = !!(buf & BIT(3));