cs5535-gpio: handle GPIO regs where higher (clear) bits are set
authorAndres Salomon <dilinger@queued.net>
Tue, 21 Dec 2010 21:04:52 +0000 (13:04 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 7 Jan 2011 21:58:40 +0000 (13:58 -0800)
commit2ea51982aef2d656e0ce5f0cf725c1c449730cba
treecf29f2518e4969e68a5218b56b1117b137858673
parent4403806037a7eba17c715337b4dd59d39b06cf94
cs5535-gpio: handle GPIO regs where higher (clear) bits are set

commit 44658a11f312fb9217674cb90b1a11cbe17fd18d upstream.

The default for non-READ_BACK GPIO regs is to have the clear bits set;
this means that our original errata fix was too simplistic.  This
changes it to the following behavior:

 - when setting GPIOs, ignore the higher order bits (they're for
   clearing, we don't need to care about them).

 - when clearing GPIOs, keep all the bits, but unset (via XOR) the
   lower order bit that negates the clear bit that we care about.  That
   is, if we're clearing GPIO 26 (val = 0x04000000), we first XOR what's
   currently in the register with 0x0400 (GPIO 26's SET bit), and then
   OR that with the GPIO 26's CLEAR bit.

Tested-by: Daniel Drake <dsd@laptop.org>
Signed-off-by: Andres Salomon <dilinger@queued.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/gpio/cs5535-gpio.c