From patchwork Mon Jun 8 01:26:48 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Anderson X-Patchwork-Id: 241887 List-Id: U-Boot discussion From: seanga2 at gmail.com (Sean Anderson) Date: Sun, 7 Jun 2020 21:26:48 -0400 Subject: [PATCH v2 07/10] gpio: dw: Return output value when direction is out In-Reply-To: <20200608012651.1525906-1-seanga2@gmail.com> References: <20200608012651.1525906-1-seanga2@gmail.com> Message-ID: <20200608012651.1525906-8-seanga2@gmail.com> dm_gpio_ops.get_value can be called when the gpio is either input or output. The current dw code always returns the input value, which is invalid if the direction is set to out. Signed-off-by: Sean Anderson Reviewed-by: Ley Foon Tan --- This patch was previously submitted as part of https://patchwork.ozlabs.org/project/uboot/list/?series=161576 Changes in v2: - Reorder changes to minimize diff drivers/gpio/dwapb_gpio.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/gpio/dwapb_gpio.c b/drivers/gpio/dwapb_gpio.c index a52c9e18e3..e2970a83a8 100644 --- a/drivers/gpio/dwapb_gpio.c +++ b/drivers/gpio/dwapb_gpio.c @@ -69,9 +69,14 @@ static int dwapb_gpio_direction_output(struct udevice *dev, unsigned pin, static int dwapb_gpio_get_value(struct udevice *dev, unsigned pin) { struct gpio_dwapb_platdata *plat = dev_get_platdata(dev); - return !!(readl(plat->base + GPIO_EXT_PORT(plat->bank)) & (1 << pin)); -} + u32 value; + if (dwapb_gpio_get_function(dev, pin) == GPIOF_OUTPUT) + value = readl(plat->base + GPIO_SWPORT_DR(plat->bank)); + else + value = readl(plat->base + GPIO_EXT_PORT(plat->bank)); + return !!(value & BIT(pin)); +} static int dwapb_gpio_set_value(struct udevice *dev, unsigned pin, int val) {