| From afaa47dfc89987c171683528f28947df282b2d13 Mon Sep 17 00:00:00 2001 |
| From: Russell King <rmk+kernel@armlinux.org.uk> |
| Date: Sat, 7 Dec 2019 16:20:18 +0000 |
| Subject: [PATCH] gpiolib: fix up emulated open drain outputs |
| |
| commit 256efaea1fdc4e38970489197409a26125ee0aaa upstream. |
| |
| gpiolib has a corner case with open drain outputs that are emulated. |
| When such outputs are outputting a logic 1, emulation will set the |
| hardware to input mode, which will cause gpiod_get_direction() to |
| report that it is in input mode. This is different from the behaviour |
| with a true open-drain output. |
| |
| Unify the semantics here. |
| |
| Cc: <stable@vger.kernel.org> |
| Suggested-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c |
| index e806cd9a14ba..cf55ae4c92f7 100644 |
| --- a/drivers/gpio/gpiolib.c |
| +++ b/drivers/gpio/gpiolib.c |
| @@ -218,6 +218,14 @@ int gpiod_get_direction(struct gpio_desc *desc) |
| chip = gpiod_to_chip(desc); |
| offset = gpio_chip_hwgpio(desc); |
| |
| + /* |
| + * Open drain emulation using input mode may incorrectly report |
| + * input here, fix that up. |
| + */ |
| + if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) && |
| + test_bit(FLAG_IS_OUT, &desc->flags)) |
| + return 0; |
| + |
| if (!chip->get_direction) |
| return -ENOTSUPP; |
| |
| -- |
| 2.7.4 |
| |