Turn the separately allocated pinctrl_pin_desc array into a flexible
array member of struct rza2_pinctrl_priv, annotated with
__counted_by(npins). The pin count is now computed before allocation so
struct_size() can size the combined object, collapsing two allocations
into one.

Assisted-by: Claude:Opus-4.7
Signed-off-by: Rosen Penev <[email protected]>
---
 drivers/pinctrl/renesas/pinctrl-rza2.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/pinctrl/renesas/pinctrl-rza2.c 
b/drivers/pinctrl/renesas/pinctrl-rza2.c
index 8618f32ed26a..42c228b860a4 100644
--- a/drivers/pinctrl/renesas/pinctrl-rza2.c
+++ b/drivers/pinctrl/renesas/pinctrl-rza2.c
@@ -44,12 +44,12 @@ struct rza2_pinctrl_priv {
        struct device *dev;
        void __iomem *base;
 
-       struct pinctrl_pin_desc *pins;
        struct pinctrl_desc desc;
        struct pinctrl_dev *pctl;
        struct pinctrl_gpio_range gpio_range;
        int npins;
        struct mutex mutex; /* serialize adding groups and functions */
+       struct pinctrl_pin_desc pins[] __counted_by(npins);
 };
 
 #define RZA2_PDR(port)         (0x0000 + (port) * 2)   /* Direction 16-bit */
@@ -289,21 +289,17 @@ static int rza2_gpio_register(struct rza2_pinctrl_priv 
*priv)
 
 static int rza2_pinctrl_register(struct rza2_pinctrl_priv *priv)
 {
-       struct pinctrl_pin_desc *pins;
+       struct pinctrl_pin_desc *pin;
        unsigned int i;
        int ret;
 
-       pins = devm_kcalloc(priv->dev, priv->npins, sizeof(*pins), GFP_KERNEL);
-       if (!pins)
-               return -ENOMEM;
-
-       priv->pins = pins;
-       priv->desc.pins = pins;
+       priv->desc.pins = priv->pins;
        priv->desc.npins = priv->npins;
 
        for (i = 0; i < priv->npins; i++) {
-               pins[i].number = i;
-               pins[i].name = rza2_gpio_names[i];
+               pin = &priv->pins[i];
+               pin->number = i;
+               pin->name = rza2_gpio_names[i];
        }
 
        ret = devm_pinctrl_register_and_init(priv->dev, &priv->desc, priv,
@@ -482,12 +478,17 @@ static const struct pinmux_ops rza2_pinmux_ops = {
 static int rza2_pinctrl_probe(struct platform_device *pdev)
 {
        struct rza2_pinctrl_priv *priv;
+       int npins;
        int ret;
 
-       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+       npins = (int)(uintptr_t)of_device_get_match_data(&pdev->dev) *
+                     RZA2_PINS_PER_PORT;
+
+       priv = devm_kzalloc(&pdev->dev, struct_size(priv, pins, npins), 
GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
+       priv->npins = npins;
        priv->dev = &pdev->dev;
 
        priv->base = devm_platform_ioremap_resource(pdev, 0);
@@ -498,9 +499,6 @@ static int rza2_pinctrl_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, priv);
 
-       priv->npins = (int)(uintptr_t)of_device_get_match_data(&pdev->dev) *
-                     RZA2_PINS_PER_PORT;
-
        priv->desc.name         = DRIVER_NAME;
        priv->desc.pctlops      = &rza2_pinctrl_ops;
        priv->desc.pmxops       = &rza2_pinmux_ops;
-- 
2.54.0


Reply via email to