]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpio: vf610: add get_direction() support
authorHaibo Chen <haibo.chen@nxp.com>
Thu, 1 Aug 2024 09:30:28 +0000 (17:30 +0800)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 5 Aug 2024 09:49:54 +0000 (11:49 +0200)
For IP which do not contain PDDR, currently use the pinmux API
pinctrl_gpio_direction_input() to config the output/input, pinmux
currently do not support get_direction(). So here add the GPIO
get_direction() support only for the IP which has Port Data
Direction Register (PDDR).

Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
Link: https://lore.kernel.org/r/20240801093028.732338-3-haibo.chen@nxp.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-vf610.c

index db68d85415970ac3b8d1278671b4a2a2e0c6610b..27eff741fe9a2af62539f7101b8fd839934a7557 100644 (file)
@@ -151,6 +151,19 @@ static int vf610_gpio_direction_output(struct gpio_chip *chip, unsigned int gpio
        return pinctrl_gpio_direction_output(chip, gpio);
 }
 
+static int vf610_gpio_get_direction(struct gpio_chip *gc, unsigned int gpio)
+{
+       struct vf610_gpio_port *port = gpiochip_get_data(gc);
+       u32 mask = BIT(gpio);
+
+       mask &= vf610_gpio_readl(port->gpio_base + GPIO_PDDR);
+
+       if (mask)
+               return GPIO_LINE_DIRECTION_OUT;
+
+       return GPIO_LINE_DIRECTION_IN;
+}
+
 static void vf610_gpio_irq_handler(struct irq_desc *desc)
 {
        struct vf610_gpio_port *port =
@@ -362,6 +375,12 @@ static int vf610_gpio_probe(struct platform_device *pdev)
        gc->get = vf610_gpio_get;
        gc->direction_output = vf610_gpio_direction_output;
        gc->set = vf610_gpio_set;
+       /*
+        * only IP has Port Data Direction Register(PDDR) can
+        * support get direction
+        */
+       if (port->sdata->have_paddr)
+               gc->get_direction = vf610_gpio_get_direction;
 
        /* Mask all GPIO interrupts */
        for (i = 0; i < gc->ngpio; i++)