pinctrl: bcm2712: Fix for sparse GPIOs
authorPhil Elwell <phil@raspberrypi.com>
Wed, 15 Nov 2023 14:49:55 +0000 (14:49 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:35:28 +0000 (11:35 +0000)
BCM2712D0's sparse GPIO map revealed that it is not safe to treat
group_selector as the GPIO number - it is an index into the array of
pinctrl_pin_descs, and the "number" member says which GPIO it refers to.

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
drivers/pinctrl/bcm/pinctrl-bcm2712.c

index fc489bc..5b01c86 100644 (file)
@@ -906,8 +906,13 @@ static int bcm2712_pmx_set(struct pinctrl_dev *pctldev,
                unsigned group_selector)
 {
        struct bcm2712_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
+       const struct pinctrl_desc *pctldesc = &pc->pctl_desc;
+       const struct pinctrl_pin_desc *pindesc;
 
-       bcm2712_pinctrl_fsel_set(pc, group_selector, func_selector);
+       if (group_selector >= pctldesc->npins)
+               return -EINVAL;
+       pindesc = &pctldesc->pins[group_selector];
+       bcm2712_pinctrl_fsel_set(pc, pindesc->number, func_selector);
 
        return 0;
 }