]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: dwapb: reduce allocation to single kzalloc
authorRosen Penev <rosenp@gmail.com>
Fri, 20 Mar 2026 00:53:38 +0000 (17:53 -0700)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Mon, 23 Mar 2026 09:55:58 +0000 (10:55 +0100)
Instead of kzalloc + kcalloc, Combine the two using a flexible array
member.

Allows using __counted_by for extra runtime analysis. Move counting
variable to right after allocation as required by __counted_by.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260320005338.30355-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-dwapb.c

index 4986c465c9a8662111c961392125b4483012826c..15cebc8b5d66359f79cbf05539c449fc96d6fc7f 100644 (file)
@@ -75,8 +75,8 @@ struct dwapb_port_property {
 };
 
 struct dwapb_platform_data {
-       struct dwapb_port_property *properties;
        unsigned int nports;
+       struct dwapb_port_property properties[] __counted_by(nports);
 };
 
 /* Store GPIO context across system-wide suspend/resume transitions */
@@ -114,11 +114,11 @@ static inline struct dwapb_gpio *to_dwapb_gpio(struct gpio_chip *gc)
 struct dwapb_gpio {
        struct  device          *dev;
        void __iomem            *regs;
-       struct dwapb_gpio_port  *ports;
        unsigned int            nr_ports;
        unsigned int            flags;
        struct reset_control    *rst;
        struct clk_bulk_data    clks[DWAPB_NR_CLOCKS];
+       struct dwapb_gpio_port  ports[] __counted_by(nr_ports);
 };
 
 static inline u32 gpio_reg_v2_convert(unsigned int offset)
@@ -585,14 +585,10 @@ static struct dwapb_platform_data *dwapb_gpio_get_pdata(struct device *dev)
        if (nports == 0)
                return ERR_PTR(-ENODEV);
 
-       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       pdata = devm_kzalloc(dev, struct_size(pdata, properties, nports), GFP_KERNEL);
        if (!pdata)
                return ERR_PTR(-ENOMEM);
 
-       pdata->properties = devm_kcalloc(dev, nports, sizeof(*pp), GFP_KERNEL);
-       if (!pdata->properties)
-               return ERR_PTR(-ENOMEM);
-
        pdata->nports = nports;
 
        i = 0;
@@ -714,22 +710,17 @@ static int dwapb_gpio_probe(struct platform_device *pdev)
        if (IS_ERR(pdata))
                return PTR_ERR(pdata);
 
-       gpio = devm_kzalloc(&pdev->dev, sizeof(*gpio), GFP_KERNEL);
+       gpio = devm_kzalloc(&pdev->dev, struct_size(gpio, ports, pdata->nports), GFP_KERNEL);
        if (!gpio)
                return -ENOMEM;
 
-       gpio->dev = &pdev->dev;
        gpio->nr_ports = pdata->nports;
+       gpio->dev = &pdev->dev;
 
        err = dwapb_get_reset(gpio);
        if (err)
                return err;
 
-       gpio->ports = devm_kcalloc(&pdev->dev, gpio->nr_ports,
-                                  sizeof(*gpio->ports), GFP_KERNEL);
-       if (!gpio->ports)
-               return -ENOMEM;
-
        gpio->regs = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(gpio->regs))
                return PTR_ERR(gpio->regs);