Message ID | CAOMZO5AHGF7hfPOA-XsKQx-dHfXe=Lb4ywgNKOzC+b=3CEnDKg@mail.gmail.com |
---|---|
State | RFC |
Delegated to: | Stefano Babic |
Headers | show |
On Sat, Sep 28, 2013 at 1:35 PM, Fabio Estevam <festevam@gmail.com> wrote: > On Sat, Sep 28, 2013 at 10:12 AM, Eric Bénard <eric@eukrea.com> wrote: > >> Maybe the real fix would be to check why gpio_get_value doesn't return >> the level of the gpio when it's configured as an output. > > I agree with Eric. > > Could you please test the patch below? > > --- a/drivers/gpio/mxc_gpio.c > +++ b/drivers/gpio/mxc_gpio.c > @@ -93,7 +93,7 @@ int gpio_get_value(unsigned gpio) > { > unsigned int port = GPIO_TO_PORT(gpio); > struct gpio_regs *regs; > - u32 val; > + u32 direction; > > if (port >= ARRAY_SIZE(gpio_ports)) > return -1; > @@ -102,9 +102,12 @@ int gpio_get_value(unsigned gpio) > > regs = (struct gpio_regs *)gpio_ports[port]; > > - val = (readl(®s->gpio_psr) >> gpio) & 0x01; > + direction = readl(®s->gpio_dir); > > - return val; > + if ((direction >> gpio) & 0x01) > + return (readl(®s->gpio_dr) >> gpio) & 0x01; /* output mode */ > + else > + return (readl(®s->gpio_psr) >> gpio) & 0x01; /* input mode */ > } This did the trick! I dropped this patch.
--- a/drivers/gpio/mxc_gpio.c +++ b/drivers/gpio/mxc_gpio.c @@ -93,7 +93,7 @@ int gpio_get_value(unsigned gpio) { unsigned int port = GPIO_TO_PORT(gpio); struct gpio_regs *regs; - u32 val; + u32 direction; if (port >= ARRAY_SIZE(gpio_ports)) return -1; @@ -102,9 +102,12 @@ int gpio_get_value(unsigned gpio) regs = (struct gpio_regs *)gpio_ports[port]; - val = (readl(®s->gpio_psr) >> gpio) & 0x01; + direction = readl(®s->gpio_dir); - return val; + if ((direction >> gpio) & 0x01) + return (readl(®s->gpio_dr) >> gpio) & 0x01; /* output mode */ + else + return (readl(®s->gpio_psr) >> gpio) & 0x01; /* input mode */ } _______________________________________________ U-Boot mailing list