mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
gpio: dwapb: reduce allocation to single kzalloc
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>
This commit is contained in:
parent
a6e53d05ab
commit
9a5bf2f53b
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user