831f54a081648729cea82ddb330e57117664d48f
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.15 / 950-0801-pinctrl-bcm2835-Only-return-non-GPIOs-to-inputs.patch
1 From 55125538eea73e8156f3457ada0756c535400825 Mon Sep 17 00:00:00 2001
2 From: Phil Elwell <phil@raspberrypi.com>
3 Date: Wed, 30 Mar 2022 09:48:41 +0100
4 Subject: [PATCH] pinctrl: bcm2835: Only return non-GPIOs to inputs
5
6 Allowing GPIO state to persist allows the use of gpioset to control
7 GPIO levels without having to use the --mode=wait feature.
8
9 Signed-off-by: Phil Elwell <phil@raspberrypi.com>
10 ---
11 drivers/pinctrl/bcm/pinctrl-bcm2835.c | 12 ++++++------
12 1 file changed, 6 insertions(+), 6 deletions(-)
13
14 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
15 +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
16 @@ -908,9 +908,12 @@ static int bcm2835_pmx_free(struct pinct
17 unsigned offset)
18 {
19 struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
20 + enum bcm2835_fsel fsel = bcm2835_pinctrl_fsel_get(pc, offset);
21 +
22 + /* Return non-GPIOs to GPIO_IN */
23 + if (fsel != BCM2835_FSEL_GPIO_IN && fsel != BCM2835_FSEL_GPIO_OUT)
24 + bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
25
26 - /* disable by setting to GPIO_IN */
27 - bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
28 return 0;
29 }
30
31 @@ -952,10 +955,7 @@ static void bcm2835_pmx_gpio_disable_fre
32 struct pinctrl_gpio_range *range,
33 unsigned offset)
34 {
35 - struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
36 -
37 - /* disable by setting to GPIO_IN */
38 - bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
39 + (void)bcm2835_pmx_free(pctldev, offset);
40 }
41
42 static int bcm2835_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,