On 6/7/20 9:26 PM, Sean Anderson wrote: > 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 <sean...@gmail.com> > --- > 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
...and I just noticed that this breaks the build since dwapb_gpio_get_function is not declared yet. Will revert to the previous version of this patch in the next revision. > > 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) > { > --Sean