Skip to content

Commit 7959dea

Browse files
GseoCLinus Walleij
authored andcommitted
pinctrl: stm32: handle semaphore acquisition when handling pinctrl/pinmux
When a GPIO RIF configuration is in semaphore mode, and the semaphore hasn't been taken before configuring the GPIO, the write operations silently fail. To avoid a silent fail when applying a pinctrl, if the pins that are being configured are in semaphore mode, take the semaphore. Note that there is no proper release of the RIF semaphore yet for pinctrl. Signed-off-by: Gatien Chevallier <gatien.chevallier@foss.st.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
1 parent dbd2317 commit 7959dea

1 file changed

Lines changed: 27 additions & 8 deletions

File tree

drivers/pinctrl/stm32/pinctrl-stm32.c

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -362,11 +362,9 @@ static int stm32_gpio_request(struct gpio_chip *chip, unsigned offset)
362362
return -EINVAL;
363363
}
364364

365-
if (bank->rif_control) {
366-
if (!stm32_gpio_rif_acquire_semaphore(bank, offset)) {
367-
dev_err(pctl->dev, "pin %d not available.\n", pin);
368-
return -EINVAL;
369-
}
365+
if (bank->rif_control && !stm32_gpio_rif_acquire_semaphore(bank, offset)) {
366+
dev_err(pctl->dev, "pin %d not available.\n", offset);
367+
return -EACCES;
370368
}
371369

372370
return pinctrl_gpio_request(chip, offset);
@@ -1040,19 +1038,30 @@ static int stm32_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
10401038
static int stm32_pmx_request(struct pinctrl_dev *pctldev, unsigned int gpio)
10411039
{
10421040
struct stm32_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
1041+
unsigned int offset = stm32_gpio_pin(gpio);
10431042
struct pinctrl_gpio_range *range;
1043+
struct stm32_gpio_bank *bank;
10441044

10451045
range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, gpio);
10461046
if (!range) {
10471047
dev_err(pctl->dev, "No gpio range defined.\n");
10481048
return -EINVAL;
10491049
}
10501050

1051-
if (!gpiochip_line_is_valid(range->gc, stm32_gpio_pin(gpio))) {
1051+
if (!gpiochip_line_is_valid(range->gc, offset)) {
10521052
dev_warn(pctl->dev, "Can't access gpio %d\n", gpio);
10531053
return -EACCES;
10541054
}
10551055

1056+
bank = gpiochip_get_data(range->gc);
1057+
if (!bank)
1058+
return -ENODEV;
1059+
1060+
if (bank->rif_control && !stm32_gpio_rif_acquire_semaphore(bank, offset)) {
1061+
dev_err(pctl->dev, "pin %d not available.\n", offset);
1062+
return -EACCES;
1063+
}
1064+
10561065
return 0;
10571066
}
10581067

@@ -1394,6 +1403,11 @@ static int stm32_pconf_parse_conf(struct pinctrl_dev *pctldev,
13941403
return -EACCES;
13951404
}
13961405

1406+
if (bank->rif_control && !stm32_gpio_rif_acquire_semaphore(bank, offset)) {
1407+
dev_err(pctl->dev, "pin %d not available.\n", offset);
1408+
return -EACCES;
1409+
}
1410+
13971411
switch (param) {
13981412
case PIN_CONFIG_DRIVE_PUSH_PULL:
13991413
ret = stm32_pconf_set_driving(bank, offset, 0);
@@ -2014,16 +2028,21 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
20142028
if (!range)
20152029
return 0;
20162030

2031+
bank = gpiochip_get_data(range->gc);
2032+
20172033
if (!gpiochip_line_is_valid(range->gc, offset))
20182034
return 0;
20192035

2036+
if (bank->rif_control && !stm32_gpio_rif_acquire_semaphore(bank, offset)) {
2037+
dev_err(pctl->dev, "pin %d not available.\n", offset);
2038+
return -EACCES;
2039+
}
2040+
20202041
pin_is_irq = gpiochip_line_is_irq(range->gc, offset);
20212042

20222043
if (!desc || (!pin_is_irq && !desc->gpio_owner))
20232044
return 0;
20242045

2025-
bank = gpiochip_get_data(range->gc);
2026-
20272046
mode = bank->pin_backup[offset].mode;
20282047
ret = stm32_pmx_set_mode(bank, offset, mode, bank->pin_backup[offset].alt);
20292048
if (ret)

0 commit comments

Comments
 (0)