Simplify allocation by using a flexible array member. Use __counted_by for extra runtime analysis.
Shuffle some code as __counted_by requires the counting variable to be set right after allocation. Signed-off-by: Rosen Penev <[email protected]> --- drivers/gpio/gpio-bcm-kona.c | 37 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c index 208b71c59d58..b1d32d590cf8 100644 --- a/drivers/gpio/gpio-bcm-kona.c +++ b/drivers/gpio/gpio-bcm-kona.c @@ -58,15 +58,6 @@ #define LOCK_CODE 0xffffffff #define UNLOCK_CODE 0x00000000 -struct bcm_kona_gpio { - void __iomem *reg_base; - int num_bank; - raw_spinlock_t lock; - struct gpio_chip gpio_chip; - struct irq_domain *irq_domain; - struct bcm_kona_gpio_bank *banks; -}; - struct bcm_kona_gpio_bank { int id; int irq; @@ -90,6 +81,15 @@ struct bcm_kona_gpio_bank { struct bcm_kona_gpio *kona_gpio; }; +struct bcm_kona_gpio { + void __iomem *reg_base; + int num_bank; + raw_spinlock_t lock; + struct gpio_chip gpio_chip; + struct irq_domain *irq_domain; + struct bcm_kona_gpio_bank banks[] __counted_by(num_bank); +}; + static inline void bcm_kona_gpio_write_lock_regs(void __iomem *reg_base, int bank_id, u32 lockcode) { @@ -584,12 +584,6 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev) int ret; int i; - kona_gpio = devm_kzalloc(dev, sizeof(*kona_gpio), GFP_KERNEL); - if (!kona_gpio) - return -ENOMEM; - - kona_gpio->gpio_chip = template_chip; - chip = &kona_gpio->gpio_chip; ret = platform_irq_count(pdev); if (!ret) { dev_err(dev, "Couldn't determine # GPIO banks\n"); @@ -597,6 +591,11 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev) } else if (ret < 0) { return dev_err_probe(dev, ret, "Couldn't determine GPIO banks\n"); } + + kona_gpio = devm_kzalloc(dev, struct_size(kona_gpio, banks, ret), GFP_KERNEL); + if (!kona_gpio) + return -ENOMEM; + kona_gpio->num_bank = ret; if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) { @@ -604,13 +603,9 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev) GPIO_MAX_BANK_NUM); return -ENXIO; } - kona_gpio->banks = devm_kcalloc(dev, - kona_gpio->num_bank, - sizeof(*kona_gpio->banks), - GFP_KERNEL); - if (!kona_gpio->banks) - return -ENOMEM; + kona_gpio->gpio_chip = template_chip; + chip = &kona_gpio->gpio_chip; chip->parent = dev; chip->ngpio = kona_gpio->num_bank * GPIO_PER_BANK; -- 2.53.0

