pinctrl: iproc: Add 'get_direction' support
authorRayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
Wed, 11 Sep 2019 05:11:25 +0000 (10:41 +0530)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 12 Sep 2019 09:25:38 +0000 (10:25 +0100)
Add 'get_direction' support to the iProc GPIO driver.

Signed-off-by: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
Link: https://lore.kernel.org/r/1568178685-30738-1-git-send-email-rayagonda.kokatanur@broadcom.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/bcm/pinctrl-iproc-gpio.c

index 28d1201..6f7d3a2 100644 (file)
@@ -359,6 +359,15 @@ static int iproc_gpio_direction_output(struct gpio_chip *gc, unsigned gpio,
        return 0;
 }
 
+static int iproc_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
+{
+       struct iproc_gpio *chip = gpiochip_get_data(gc);
+       unsigned int offset = IPROC_GPIO_REG(gpio, IPROC_GPIO_OUT_EN_OFFSET);
+       unsigned int shift = IPROC_GPIO_SHIFT(gpio);
+
+       return !(readl(chip->base + offset) & BIT(shift));
+}
+
 static void iproc_gpio_set(struct gpio_chip *gc, unsigned gpio, int val)
 {
        struct iproc_gpio *chip = gpiochip_get_data(gc);
@@ -835,6 +844,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
        gc->free = iproc_gpio_free;
        gc->direction_input = iproc_gpio_direction_input;
        gc->direction_output = iproc_gpio_direction_output;
+       gc->get_direction = iproc_gpio_get_direction;
        gc->set = iproc_gpio_set;
        gc->get = iproc_gpio_get;