On Fri, 15 Nov 2013 15:16:29 +0800 Liu Gang <gang....@freescale.com> wrote:
> For MPC8572/MPC8536, the status of GPIOs defined as output > cannot be determined by reading GPDAT register, so the code > use shadow data register instead. But if the input pins are > asserted high, they will always read high due to the shadow > data, even if the pins are set to low. Could you please add a better description of the problem? I'm having some difficulties to understand the last sentence above. Does the issue appear if some pins were configured as inputs and were asserted high before booting the kernel, and therefore the shadow data has been initialized with these pin values? Or does the issue appear if some pin has been configured as output first and has been set to the high value, then reconfigured as input? Now reading the pin state will always return high even if the actual pin state is low? It seems the issue will appear in both cases. If so, please add this information to the commit message. > So the input pins should be read directly from GPDAT, not > the shadow data. > > Signed-off-by: Liu Gang <gang....@freescale.com> > --- > drivers/gpio/gpio-mpc8xxx.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/gpio/gpio-mpc8xxx.c b/drivers/gpio/gpio-mpc8xxx.c > index 9ae29cc..1d4ac75 100644 > --- a/drivers/gpio/gpio-mpc8xxx.c > +++ b/drivers/gpio/gpio-mpc8xxx.c > @@ -71,6 +71,7 @@ static int mpc8572_gpio_get(struct gpio_chip *gc, unsigned > int gpio) > struct mpc8xxx_gpio_chip *mpc8xxx_gc = to_mpc8xxx_gpio_chip(mm); > > val = in_be32(mm->regs + GPIO_DAT) & ~in_be32(mm->regs + GPIO_DIR); > + mpc8xxx_gc->data &= in_be32(mm->regs + GPIO_DIR); we can reduce one in_be32() call here, i.e. u32 out_mask; ... out_mask = in_be32(mm->regs + GPIO_DIR); val = in_be32(mm->regs + GPIO_DAT) & ~out_mask; mpc8xxx_gc->data &= out_mask; > return (val | mpc8xxx_gc->data) & mpc8xxx_gpio2mask(gpio); > } Thanks, Anatolij -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: off...@denx.de _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev