From: Rosen Penev Date: Wed, 11 Mar 2026 00:34:31 +0000 (-0700) Subject: gpio: bcm-kona: reduce the number of memory allocations X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0258fe8721f541bbd3949cac2f4971b98e1fe4ed;p=thirdparty%2Fkernel%2Flinux.git gpio: bcm-kona: reduce the number of memory allocations 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 Link: https://patch.msgid.link/20260311003431.31881-1-rosenp@gmail.com Signed-off-by: Bartosz Golaszewski --- diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c index 208b71c59d585..b1d32d590cf83 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;