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


Reply via email to