diff options
| author | Rosen Penev <rosenp@gmail.com> | 2026-03-09 15:52:04 -0700 |
|---|---|---|
| committer | Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com> | 2026-03-11 09:45:22 +0100 |
| commit | 223d9a310c7bd785f08320de8d2b66a5af6a25e6 (patch) | |
| tree | a2f9e532ce15cd6b0ad868d99bdf6fbc877047fc | |
| parent | 0258fe8721f541bbd3949cac2f4971b98e1fe4ed (diff) | |
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 <rosenp@gmail.com>
Link: https://patch.msgid.link/20260309225204.44789-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
| -rw-r--r-- | drivers/gpio/gpio-htc-egpio.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/gpio/gpio-htc-egpio.c b/drivers/gpio/gpio-htc-egpio.c index 72935d6dbebf..d15423c718d0 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; |
