Use a flexible array member to combine kzalloc and kcalloc. Add an extra counting member to support __counted_by.
Signed-off-by: Rosen Penev <[email protected]> --- v2: add __counted_by. drivers/gpio/gpio-msc313.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/gpio/gpio-msc313.c b/drivers/gpio/gpio-msc313.c index 7345afdc78de..2accf3446cd9 100644 --- a/drivers/gpio/gpio-msc313.c +++ b/drivers/gpio/gpio-msc313.c @@ -483,7 +483,8 @@ MSC313_GPIO_CHIPDATA(ssd20xd); struct msc313_gpio { void __iomem *base; const struct msc313_gpio_data *gpio_data; - u8 *saved; + int nr_saved; + u8 saved[] __counted_by(nr_saved); }; static int msc313_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) @@ -631,16 +632,13 @@ static int msc313_gpio_probe(struct platform_device *pdev) if (!parent_domain) return -ENODEV; - gpio = devm_kzalloc(dev, sizeof(*gpio), GFP_KERNEL); + gpio = devm_kzalloc(dev, struct_size(gpio, saved, match_data->num), GFP_KERNEL); if (!gpio) return -ENOMEM; + gpio->nr_saved = match_data->num; gpio->gpio_data = match_data; - gpio->saved = devm_kcalloc(dev, gpio->gpio_data->num, sizeof(*gpio->saved), GFP_KERNEL); - if (!gpio->saved) - return -ENOMEM; - gpio->base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(gpio->base)) return PTR_ERR(gpio->base); -- 2.53.0

