pinctrl: lynxpoint: Implement intel_gpio_get_direction callback
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 19 Nov 2019 15:36:48 +0000 (17:36 +0200)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Fri, 13 Dec 2019 14:48:48 +0000 (16:48 +0200)
Allows querying GPIO direction from the pad config register.
If the pad is not in GPIO mode, return an error.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/pinctrl/intel/pinctrl-lynxpoint.c

index 3b0dfe9..3c1b712 100644 (file)
@@ -197,6 +197,16 @@ static int lp_gpio_direction_output(struct gpio_chip *chip, unsigned int offset,
        return 0;
 }
 
+static int lp_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
+{
+       void __iomem *reg = lp_gpio_reg(chip, offset, LP_CONFIG1);
+
+       if (ioread32(reg) & DIR_BIT)
+               return GPIO_LINE_DIRECTION_IN;
+
+       return GPIO_LINE_DIRECTION_OUT;
+}
+
 static void lp_gpio_irq_handler(struct irq_desc *desc)
 {
        struct irq_data *data = irq_desc_get_irq_data(desc);
@@ -391,6 +401,7 @@ static int lp_gpio_probe(struct platform_device *pdev)
        gc->direction_output = lp_gpio_direction_output;
        gc->get = lp_gpio_get;
        gc->set = lp_gpio_set;
+       gc->get_direction = lp_gpio_get_direction;
        gc->base = -1;
        gc->ngpio = LP_NUM_GPIO;
        gc->can_sleep = false;