gpio: mpc8xxx: don't do RMW on gpdat register when setting value
authorRasmus Villemoes <rasmus.villemoes@prevas.dk>
Tue, 28 Jan 2020 12:04:34 +0000 (12:04 +0000)
committerTom Rini <trini@konsulko.com>
Tue, 31 Mar 2020 14:06:52 +0000 (10:06 -0400)
commitdd4cf53f9864362d9e92472298ad60dcbb8b7e72
treee3db02712e3e2f24409d69e9ca13f25b4304a55b
parent1d7ad9fa051e5b3057bccb6384ab62e4f9c206b2
gpio: mpc8xxx: don't do RMW on gpdat register when setting value

The driver correctly handles reading back the value of an output gpio
by reading from the shadow register for output, and from gpdat for
inputs.

Unfortunately, when setting the value of some gpio, we do a RMW cycle
on the gpdat register without taking the shadow register into account,
thus accidentally setting other output gpios (at least those whose
value cannot be read back) to 0 at the same time.

When changing a gpio from input to output, we still need to make sure
it initially has the requested value. So, the procedure is

- update the shadow register
- compute the new gpdir register
- write the bitwise and of the shadow and new gpdir register to gpdat
- write the new gpdir register

Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
drivers/gpio/mpc8xxx_gpio.c