Hi, This has already been pushed on u-boot master: https://patchwork.ozlabs.org/project/uboot/patch/20200505084318.15307-2-narmstr...@baylibre.com/
Commit: 47bd533e9dd0f967ff7b62f3edfd6c97131e1501 Author: Neil Armstrong <narmstr...@baylibre.com> Date: Tue May 5 10:43:17 2020 +0200 gpio: emulate open drain & open source in dm_gpio_set_value() Handle the GPIOD_OPEN_DRAIN & GPIOD_OPEN_SOURCE flags to emulate open drain and open source by setting the GPIO line as input depending on the requested value. The behaviour is taken from the Linux gpiolib. Signed-off-by: Neil Armstrong <narmstr...@baylibre.com> Reviewed-by: Simon Glass <s...@chromium.org> Neil On 15/01/2021 06:15, Artem Lapkin wrote: > add GPIOD_OPEN_DRAIN flag which cant parsed properly > > Problem: for example cant power video system for sm1 g12a socs > because OPEN_DRAIN flag cant parsed > > DTS examples: > > ``` > $ grep GPIO_OPEN_DRAIN\> arch/arm/dts/meson-*.dt* > arch/arm/dts/meson-g12a-sei510.dts: gpio = <&gpio GPIOH_8 > GPIO_OPEN_DRAIN>; > arch/arm/dts/meson-g12a-u200.dts: gpio = <&gpio GPIOH_8 > GPIO_OPEN_DRAIN>; > arch/arm/dts/meson-gx-libretech-pc.dtsi: gpio = <&gpio GPIOH_3 > GPIO_OPEN_DRAIN>; > arch/arm/dts/meson-khadas-vim3.dtsi: gpio = <&gpio GPIOH_8 > GPIO_OPEN_DRAIN>; > arch/arm/dts/meson-sm1-sei610.dts: gpio = <&gpio GPIOH_8 > GPIO_OPEN_DRAIN>; > ``` > > Signed-off-by: Artem Lapkin <a...@khadas.com> > --- > drivers/gpio/gpio-uclass.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c > index bad6b71e0c..6225f32457 100644 > --- a/drivers/gpio/gpio-uclass.c > +++ b/drivers/gpio/gpio-uclass.c > @@ -574,6 +574,15 @@ int dm_gpio_set_value(const struct gpio_desc *desc, int > value) > if (ret) > return ret; > > + if (desc->flags & GPIOD_OPEN_DRAIN) { > + if (value) > + gpio_get_ops(desc->dev)->direction_input(desc->dev, > desc->offset); > + else > + gpio_get_ops(desc->dev)->direction_output(desc->dev, > desc->offset, 0); > + > + return 0; > + } > + > if (desc->flags & GPIOD_ACTIVE_LOW) > value = !value; > >