]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Input: rmi4 - use flexible array member for IRQ masks in F12
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 5 May 2026 04:59:45 +0000 (21:59 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 12 Jun 2026 05:39:29 +0000 (22:39 -0700)
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>
drivers/input/rmi4/rmi_f12.c

index 752c1d137da005fc1418da50fb6603f6f47a8e71..b9cd70422b6811c43ef5977e13de36e713d5b44c 100644 (file)
@@ -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));