summaryrefslogtreecommitdiff
path: root/drivers/gpio/gpio-sa1100.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2016-08-31 08:49:44 +0100
committerLinus Walleij <linus.walleij@linaro.org>2017-03-24 14:04:37 +0100
commitc65d1fd350fa28de79e86e18ef73b902a67c791a (patch)
treea9af6c70bb9fb1f784bb73e2912836c4237e6807 /drivers/gpio/gpio-sa1100.c
parent07242b248119a9388a67975aa7fae7c23afc7a07 (diff)
gpio: sa1100: implement get_direction method
Allow gpiolib to read back the current IO direction configuration by implementing the .get_direction callback. This, in part, allows debugfs to report the complete true hardware state rather than the software state. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio/gpio-sa1100.c')
-rw-r--r--drivers/gpio/gpio-sa1100.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-sa1100.c b/drivers/gpio/gpio-sa1100.c
index bad0169524c9..249f433aa62d 100644
--- a/drivers/gpio/gpio-sa1100.c
+++ b/drivers/gpio/gpio-sa1100.c
@@ -52,6 +52,13 @@ static void sa1100_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
writel_relaxed(BIT(offset), sa1100_gpio_chip(chip)->membase + reg);
}
+static int sa1100_get_direction(struct gpio_chip *chip, unsigned offset)
+{
+ void __iomem *gpdr = sa1100_gpio_chip(chip)->membase + R_GPDR;
+
+ return !(readl_relaxed(gpdr) & BIT(offset));
+}
+
static int sa1100_direction_input(struct gpio_chip *chip, unsigned offset)
{
void __iomem *gpdr = sa1100_gpio_chip(chip)->membase + R_GPDR;
@@ -85,6 +92,7 @@ static int sa1100_to_irq(struct gpio_chip *chip, unsigned offset)
static struct sa1100_gpio_chip sa1100_gpio_chip = {
.chip = {
.label = "gpio",
+ .get_direction = sa1100_get_direction,
.direction_input = sa1100_direction_input,
.direction_output = sa1100_direction_output,
.set = sa1100_gpio_set,