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 <[email protected]>
---
 drivers/gpio/gpio-dwapb.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index 4986c465c9a8..15cebc8b5d66 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -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);
-- 
2.53.0


Reply via email to