950-0801-pinctrl-bcm2835-Only-return-non-GPIOs-to-inputs.patch 1.5 KB

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