ARM: 6060/1: PL061 GPIO: Setting gpio val after changing direction to OUT.
authorviresh kumar <viresh.kumar@st.com>
Wed, 21 Apr 2010 08:42:05 +0000 (09:42 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 22 Apr 2010 11:30:14 +0000 (12:30 +0100)
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>
drivers/gpio/pl061.c

index cc3b5e0b595a9e4f6962d99904ac6d6b90e99806..2196f318114c19b36c4ca28e8baa5c51dc8b7606 100644 (file)
@@ -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;