From patchwork Wed Apr 29 08:06:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 238856 List-Id: U-Boot discussion From: narmstrong at baylibre.com (Neil Armstrong) Date: Wed, 29 Apr 2020 10:06:34 +0200 Subject: [PATCH] gpio: emulate open drain & open source in dm_gpio_set_value() Message-ID: <20200429080634.355-1-narmstrong@baylibre.com> 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. It notably permits enabling a GPIO regulator used as Open Drain on the Amlogic G12A/g12B/SM1 platforms for HDMI output feature. Signed-off-by: Neil Armstrong --- drivers/gpio/gpio-uclass.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c index 757ab7106e..6b82d02a4d 100644 --- a/drivers/gpio/gpio-uclass.c +++ b/drivers/gpio/gpio-uclass.c @@ -524,8 +524,21 @@ int dm_gpio_set_value(const struct gpio_desc *desc, int value) if (ret) return ret; + /* + * Emulate open drain by not actively driving the line high or + * Emulate open source by not actively driving the line low + */ + if ((desc->flags & GPIOD_OPEN_DRAIN && value) || + (desc->flags & GPIOD_OPEN_SOURCE && !value)) + return gpio_get_ops(desc->dev)->direction_input(desc->dev, + desc->offset); + else if ((desc->flags & (GPIOD_OPEN_DRAIN | GPIOD_OPEN_SOURCE)) + goto set_output_value; + if (desc->flags & GPIOD_ACTIVE_LOW) value = !value; + +set_output_value: gpio_get_ops(desc->dev)->set_value(desc->dev, desc->offset, value); return 0; }