On Sat, Dec 07, 2019 at 04:20:18PM +0000, Russell King wrote: > 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. > > Suggested-by: Linus Walleij <linus.walleij@xxxxxxxxxx> > Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxx> > --- > drivers/gpio/gpiolib.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index 32c2048deb8c..70c60aac41cc 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -220,6 +220,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; > + What about the FLAG_OPEN_SOURCE case? Kent. > if (!chip->get_direction) > return -ENOTSUPP; > > -- > 2.20.1 >