Commit 75f87f5d authored by Bartosz Golaszewski's avatar Bartosz Golaszewski Committed by Linus Walleij
Browse files

pinctrl: bcm2835: don't -EINVAL on alternate funcs from get_direction()



Since commit 9d846b1a ("gpiolib: check the return value of
gpio_chip::get_direction()") we check the return value of the
get_direction() callback as per its API contract. This driver returns
-EINVAL if the pin in question is set to one of the alternative
(non-GPIO) functions. This isn't really an error that should be
communicated to GPIOLIB so default to returning the "safe" value of
INPUT in this case. The GPIO subsystem does not have the notion of
"unknown" direction.

Fixes: 9d846b1a ("gpiolib: check the return value of gpio_chip::get_direction()")
Reported-by: default avatarMark Brown <broonie@kernel.org>
Closes: https://lore.kernel.org/all/Z7VFB1nST6lbmBIo@finisterre.sirena.org.uk/


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: default avatarStefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/20250219102750.38519-1-brgl@bgdev.pl


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent a5e4cde6
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -346,14 +346,14 @@ static int bcm2835_gpio_get_direction(struct gpio_chip *chip, unsigned int offse
	struct bcm2835_pinctrl *pc = gpiochip_get_data(chip);
	enum bcm2835_fsel fsel = bcm2835_pinctrl_fsel_get(pc, offset);

	/* Alternative function doesn't clearly provide a direction */
	if (fsel > BCM2835_FSEL_GPIO_OUT)
		return -EINVAL;
	if (fsel == BCM2835_FSEL_GPIO_OUT)
		return GPIO_LINE_DIRECTION_OUT;

	if (fsel == BCM2835_FSEL_GPIO_IN)
	/*
	 * Alternative function doesn't clearly provide a direction. Default
	 * to INPUT.
	 */
	return GPIO_LINE_DIRECTION_IN;

	return GPIO_LINE_DIRECTION_OUT;
}

static void bcm2835_gpio_set(struct gpio_chip *chip, unsigned offset, int value)