From: Rosen Penev Date: Mon, 9 Mar 2026 22:52:04 +0000 (-0700) Subject: gpio: htc-egpio: allocate irq with the main struct X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=223d9a310c7bd785f08320de8d2b66a5af6a25e6;p=thirdparty%2Fkernel%2Flinux.git gpio: htc-egpio: allocate irq with the main struct Use a flexible array member to combinwe allocations. Add __counted_by for extra runtime analysis. Signed-off-by: Rosen Penev Link: https://patch.msgid.link/20260309225204.44789-1-rosenp@gmail.com Signed-off-by: Bartosz Golaszewski --- diff --git a/drivers/gpio/gpio-htc-egpio.c b/drivers/gpio/gpio-htc-egpio.c index 72935d6dbebf0..d15423c718d03 100644 --- a/drivers/gpio/gpio-htc-egpio.c +++ b/drivers/gpio/gpio-htc-egpio.c @@ -46,8 +46,8 @@ struct egpio_info { uint chained_irq; /* egpio info */ - struct egpio_chip *chip; int nchips; + struct egpio_chip chip[] __counted_by(nchips); }; static inline void egpio_writew(u16 value, struct egpio_info *ei, int reg) @@ -270,10 +270,12 @@ static int __init egpio_probe(struct platform_device *pdev) int i; /* Initialize ei data structure. */ - ei = devm_kzalloc(&pdev->dev, sizeof(*ei), GFP_KERNEL); + ei = devm_kzalloc(&pdev->dev, struct_size(ei, chip, pdata->num_chips), GFP_KERNEL); if (!ei) return -ENOMEM; + ei->nchips = pdata->num_chips; + spin_lock_init(&ei->lock); /* Find chained irq */ @@ -302,13 +304,6 @@ static int __init egpio_probe(struct platform_device *pdev) platform_set_drvdata(pdev, ei); - ei->nchips = pdata->num_chips; - ei->chip = devm_kcalloc(&pdev->dev, - ei->nchips, sizeof(struct egpio_chip), - GFP_KERNEL); - if (!ei->chip) - return -ENOMEM; - for (i = 0; i < ei->nchips; i++) { ei->chip[i].reg_start = pdata->chip[i].reg_start; ei->chip[i].cached_values = pdata->chip[i].initial_values;