Skip to content

Commit 0258fe8

Browse files
nehebBartosz Golaszewski
authored andcommitted
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>
1 parent 8f0aecf commit 0258fe8

1 file changed

Lines changed: 16 additions & 21 deletions

File tree

drivers/gpio/gpio-bcm-kona.c

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,6 @@
5858
#define LOCK_CODE 0xffffffff
5959
#define UNLOCK_CODE 0x00000000
6060

61-
struct bcm_kona_gpio {
62-
void __iomem *reg_base;
63-
int num_bank;
64-
raw_spinlock_t lock;
65-
struct gpio_chip gpio_chip;
66-
struct irq_domain *irq_domain;
67-
struct bcm_kona_gpio_bank *banks;
68-
};
69-
7061
struct bcm_kona_gpio_bank {
7162
int id;
7263
int irq;
@@ -90,6 +81,15 @@ struct bcm_kona_gpio_bank {
9081
struct bcm_kona_gpio *kona_gpio;
9182
};
9283

84+
struct bcm_kona_gpio {
85+
void __iomem *reg_base;
86+
int num_bank;
87+
raw_spinlock_t lock;
88+
struct gpio_chip gpio_chip;
89+
struct irq_domain *irq_domain;
90+
struct bcm_kona_gpio_bank banks[] __counted_by(num_bank);
91+
};
92+
9393
static inline void bcm_kona_gpio_write_lock_regs(void __iomem *reg_base,
9494
int bank_id, u32 lockcode)
9595
{
@@ -584,33 +584,28 @@ static int bcm_kona_gpio_probe(struct platform_device *pdev)
584584
int ret;
585585
int i;
586586

587-
kona_gpio = devm_kzalloc(dev, sizeof(*kona_gpio), GFP_KERNEL);
588-
if (!kona_gpio)
589-
return -ENOMEM;
590-
591-
kona_gpio->gpio_chip = template_chip;
592-
chip = &kona_gpio->gpio_chip;
593587
ret = platform_irq_count(pdev);
594588
if (!ret) {
595589
dev_err(dev, "Couldn't determine # GPIO banks\n");
596590
return -ENOENT;
597591
} else if (ret < 0) {
598592
return dev_err_probe(dev, ret, "Couldn't determine GPIO banks\n");
599593
}
594+
595+
kona_gpio = devm_kzalloc(dev, struct_size(kona_gpio, banks, ret), GFP_KERNEL);
596+
if (!kona_gpio)
597+
return -ENOMEM;
598+
600599
kona_gpio->num_bank = ret;
601600

602601
if (kona_gpio->num_bank > GPIO_MAX_BANK_NUM) {
603602
dev_err(dev, "Too many GPIO banks configured (max=%d)\n",
604603
GPIO_MAX_BANK_NUM);
605604
return -ENXIO;
606605
}
607-
kona_gpio->banks = devm_kcalloc(dev,
608-
kona_gpio->num_bank,
609-
sizeof(*kona_gpio->banks),
610-
GFP_KERNEL);
611-
if (!kona_gpio->banks)
612-
return -ENOMEM;
613606

607+
kona_gpio->gpio_chip = template_chip;
608+
chip = &kona_gpio->gpio_chip;
614609
chip->parent = dev;
615610
chip->ngpio = kona_gpio->num_bank * GPIO_PER_BANK;
616611

0 commit comments

Comments
 (0)