Skip to content

Commit

Permalink
pinctrl-bcm2835: don't call pinctrl_gpio_direction()
Browse files Browse the repository at this point in the history
Set the direction directly without calling pinctrl_gpio_direction().
This avoids the mutex_lock() calls in that function, which would
invalid the can_sleep = false.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20211206131648.1521868-3-hverkuil-cisco@xs4all.nl
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Hans Verkuil authored and Linus Walleij committed Dec 16, 2021
1 parent dc1b242 commit 1a4541b
Showing 1 changed file with 9 additions and 3 deletions.
12 changes: 9 additions & 3 deletions drivers/pinctrl/bcm/pinctrl-bcm2835.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,10 @@ static inline void bcm2835_pinctrl_fsel_set(

static int bcm2835_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
{
return pinctrl_gpio_direction_input(chip->base + offset);
struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);

bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_IN);
return 0;
}

static int bcm2835_gpio_get(struct gpio_chip *chip, unsigned offset)
Expand Down Expand Up @@ -348,8 +351,11 @@ static void bcm2835_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
static int bcm2835_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int value)
{
bcm2835_gpio_set(chip, offset, value);
return pinctrl_gpio_direction_output(chip->base + offset);
struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);

bcm2835_gpio_set_bit(pc, value ? GPSET0 : GPCLR0, offset);
bcm2835_pinctrl_fsel_set(pc, offset, BCM2835_FSEL_GPIO_OUT);
return 0;
}

static const struct gpio_chip bcm2835_gpio_chip = {
Expand Down

0 comments on commit 1a4541b

Please sign in to comment.