Skip to content

Commit 4386451

Browse files
committed
Merge tag 'pinctrl-v5.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control fixes from Linus Walleij: "Some hopefully final pin control fixes for the v5.16 kernel: - Fix an out-of-bounds bug in the Mediatek driver - Fix an init order bug in the Broadcom BCM2835 driver - Fix a GPIO offset bug in the STM32 driver" * tag 'pinctrl-v5.16-3' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: stm32: consider the GPIO offset to expose all the GPIO lines pinctrl: bcm2835: Change init order for gpio hogs pinctrl: mediatek: fix global-out-of-bounds issue
2 parents e2ae0d4 + b67210c commit 4386451

File tree

3 files changed

+26
-19
lines changed

3 files changed

+26
-19
lines changed

drivers/pinctrl/bcm/pinctrl-bcm2835.c

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,15 +1244,29 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
12441244
raw_spin_lock_init(&pc->irq_lock[i]);
12451245
}
12461246

1247+
pc->pctl_desc = *pdata->pctl_desc;
1248+
pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
1249+
if (IS_ERR(pc->pctl_dev)) {
1250+
gpiochip_remove(&pc->gpio_chip);
1251+
return PTR_ERR(pc->pctl_dev);
1252+
}
1253+
1254+
pc->gpio_range = *pdata->gpio_range;
1255+
pc->gpio_range.base = pc->gpio_chip.base;
1256+
pc->gpio_range.gc = &pc->gpio_chip;
1257+
pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
1258+
12471259
girq = &pc->gpio_chip.irq;
12481260
girq->chip = &bcm2835_gpio_irq_chip;
12491261
girq->parent_handler = bcm2835_gpio_irq_handler;
12501262
girq->num_parents = BCM2835_NUM_IRQS;
12511263
girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS,
12521264
sizeof(*girq->parents),
12531265
GFP_KERNEL);
1254-
if (!girq->parents)
1266+
if (!girq->parents) {
1267+
pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
12551268
return -ENOMEM;
1269+
}
12561270

12571271
if (is_7211) {
12581272
pc->wake_irq = devm_kcalloc(dev, BCM2835_NUM_IRQS,
@@ -1307,21 +1321,10 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
13071321
err = gpiochip_add_data(&pc->gpio_chip, pc);
13081322
if (err) {
13091323
dev_err(dev, "could not add GPIO chip\n");
1324+
pinctrl_remove_gpio_range(pc->pctl_dev, &pc->gpio_range);
13101325
return err;
13111326
}
13121327

1313-
pc->pctl_desc = *pdata->pctl_desc;
1314-
pc->pctl_dev = devm_pinctrl_register(dev, &pc->pctl_desc, pc);
1315-
if (IS_ERR(pc->pctl_dev)) {
1316-
gpiochip_remove(&pc->gpio_chip);
1317-
return PTR_ERR(pc->pctl_dev);
1318-
}
1319-
1320-
pc->gpio_range = *pdata->gpio_range;
1321-
pc->gpio_range.base = pc->gpio_chip.base;
1322-
pc->gpio_range.gc = &pc->gpio_chip;
1323-
pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);
1324-
13251328
return 0;
13261329
}
13271330

drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,12 @@ static int mtk_xt_get_gpio_n(void *data, unsigned long eint_n,
285285
desc = (const struct mtk_pin_desc *)hw->soc->pins;
286286
*gpio_chip = &hw->chip;
287287

288-
/* Be greedy to guess first gpio_n is equal to eint_n */
289-
if (desc[eint_n].eint.eint_n == eint_n)
288+
/*
289+
* Be greedy to guess first gpio_n is equal to eint_n.
290+
* Only eint virtual eint number is greater than gpio number.
291+
*/
292+
if (hw->soc->npins > eint_n &&
293+
desc[eint_n].eint.eint_n == eint_n)
290294
*gpio_n = eint_n;
291295
else
292296
*gpio_n = mtk_xt_find_eint_num(hw, eint_n);

drivers/pinctrl/stm32/pinctrl-stm32.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,10 +1251,10 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,
12511251
bank_nr = args.args[1] / STM32_GPIO_PINS_PER_BANK;
12521252
bank->gpio_chip.base = args.args[1];
12531253

1254-
npins = args.args[2];
1255-
while (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3,
1256-
++i, &args))
1257-
npins += args.args[2];
1254+
/* get the last defined gpio line (offset + nb of pins) */
1255+
npins = args.args[0] + args.args[2];
1256+
while (!of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, ++i, &args))
1257+
npins = max(npins, (int)(args.args[0] + args.args[2]));
12581258
} else {
12591259
bank_nr = pctl->nbanks;
12601260
bank->gpio_chip.base = bank_nr * STM32_GPIO_PINS_PER_BANK;

0 commit comments

Comments
 (0)