]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: htc-egpio: allocate irq with the main struct
authorRosen Penev <rosenp@gmail.com>
Mon, 9 Mar 2026 22:52:04 +0000 (15:52 -0700)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Wed, 11 Mar 2026 08:45:22 +0000 (09:45 +0100)
Use a flexible array member to combinwe allocations.

Add __counted_by for extra runtime analysis.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260309225204.44789-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-htc-egpio.c

index 72935d6dbebf080242882c43c084bcf64db4a1f3..d15423c718d033e122a631e491b41083e3e732f2 100644 (file)
@@ -46,8 +46,8 @@ struct egpio_info {
        uint              chained_irq;
 
        /* egpio info */
-       struct egpio_chip *chip;
        int               nchips;
+       struct egpio_chip chip[] __counted_by(nchips);
 };
 
 static inline void egpio_writew(u16 value, struct egpio_info *ei, int reg)
@@ -270,10 +270,12 @@ static int __init egpio_probe(struct platform_device *pdev)
        int               i;
 
        /* Initialize ei data structure. */
-       ei = devm_kzalloc(&pdev->dev, sizeof(*ei), GFP_KERNEL);
+       ei = devm_kzalloc(&pdev->dev, struct_size(ei, chip, pdata->num_chips), GFP_KERNEL);
        if (!ei)
                return -ENOMEM;
 
+       ei->nchips = pdata->num_chips;
+
        spin_lock_init(&ei->lock);
 
        /* Find chained irq */
@@ -302,13 +304,6 @@ static int __init egpio_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, ei);
 
-       ei->nchips = pdata->num_chips;
-       ei->chip = devm_kcalloc(&pdev->dev,
-                               ei->nchips, sizeof(struct egpio_chip),
-                               GFP_KERNEL);
-       if (!ei->chip)
-               return -ENOMEM;
-
        for (i = 0; i < ei->nchips; i++) {
                ei->chip[i].reg_start = pdata->chip[i].reg_start;
                ei->chip[i].cached_values = pdata->chip[i].initial_values;