diff options
| author | Rosen Penev <rosenp@gmail.com> | 2026-03-11 03:34:31 +0300 |
|---|---|---|
| committer | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-03-11 11:43:23 +0300 |
| commit | 0258fe8721f541bbd3949cac2f4971b98e1fe4ed (patch) | |
| tree | 0c59fa9776b5efe8e55b29a75d6e76dba52d440b | |
| parent | 8f0aecf2957e7dba78603544368846133bf6d22e (diff) | |
| download | linux-0258fe8721f541bbd3949cac2f4971b98e1fe4ed.tar.xz | |
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 <rosenp@gmail.com>
Link: https://patch.msgid.link/20260311003431.31881-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
| -rw-r--r-- | drivers/gpio/gpio-bcm-kona.c | 37 |
1 files 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; |
