summaryrefslogtreecommitdiffstats
path: root/drivers/gpio/pl061.c
diff options
context:
space:
mode:
authorviresh kumar2010-04-21 10:42:05 +0200
committerRussell King2010-04-22 13:30:14 +0200
commit64b997c5142a13373857de09599afd2f079c2f7a (patch)
treed6abc0a71b1e2fa283d73050a0ea45e229c930eb /drivers/gpio/pl061.c
parentARM: 6059/1: PL061 GPIO: Changing *_irq_chip_data with *_irq_data for real irqs. (diff)
downloadkernel-qcow2-linux-64b997c5142a13373857de09599afd2f079c2f7a.tar.gz
kernel-qcow2-linux-64b997c5142a13373857de09599afd2f079c2f7a.tar.xz
kernel-qcow2-linux-64b997c5142a13373857de09599afd2f079c2f7a.zip
ARM: 6060/1: PL061 GPIO: Setting gpio val after changing direction to OUT.
pl061_direction_output doesn't set value of gpio to value passed to it. This patch sets value of GPIO pin to requested value after changing direction to OUT. Signed-off-by: Viresh Kumar <viresh.kumar@st.com> Acked-by: Baruch Siach <baruch@tkos.co.il> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/gpio/pl061.c')
-rw-r--r--drivers/gpio/pl061.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/gpio/pl061.c b/drivers/gpio/pl061.c
index cc3b5e0b595a..2196f318114c 100644
--- a/drivers/gpio/pl061.c
+++ b/drivers/gpio/pl061.c
@@ -91,6 +91,12 @@ static int pl061_direction_output(struct gpio_chip *gc, unsigned offset,
gpiodir = readb(chip->base + GPIODIR);
gpiodir |= 1 << offset;
writeb(gpiodir, chip->base + GPIODIR);
+
+ /*
+ * gpio value is set again, because pl061 doesn't allow to set value of
+ * a gpio pin before configuring it in OUT mode.
+ */
+ writeb(!!value << offset, chip->base + (1 << (offset + 2)));
spin_unlock_irqrestore(&chip->lock, flags);
return 0;