USB: serial: ftdi_sio: report the valid GPIO lines to gpiolib
authorMarc Zyngier <maz@kernel.org>
Fri, 4 Dec 2020 16:47:37 +0000 (16:47 +0000)
committerJohan Hovold <johan@kernel.org>
Wed, 9 Dec 2020 17:06:30 +0000 (18:06 +0100)
Since it is pretty common for only some of the CBUS lines to be
valid as GPIO lines, let's report such validity to the rest of
the kernel.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20201204164739.781812-3-maz@kernel.org
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/ftdi_sio.c

index e0f4c3d9649cdb482ddd12e56e672eb65666e3ad..13e575f16bcdb563c76f8175d393553a0aecd9a2 100644 (file)
@@ -2002,6 +2002,19 @@ static int ftdi_gpio_direction_output(struct gpio_chip *gc, unsigned int gpio,
        return result;
 }
 
+static int ftdi_gpio_init_valid_mask(struct gpio_chip *gc,
+                                    unsigned long *valid_mask,
+                                    unsigned int ngpios)
+{
+       struct usb_serial_port *port = gpiochip_get_data(gc);
+       struct ftdi_private *priv = usb_get_serial_port_data(port);
+       unsigned long map = priv->gpio_altfunc;
+
+       bitmap_complement(valid_mask, &map, ngpios);
+
+       return 0;
+}
+
 static int ftdi_read_eeprom(struct usb_serial *serial, void *dst, u16 addr,
                                u16 nbytes)
 {
@@ -2173,6 +2186,7 @@ static int ftdi_gpio_init(struct usb_serial_port *port)
        priv->gc.get_direction = ftdi_gpio_direction_get;
        priv->gc.direction_input = ftdi_gpio_direction_input;
        priv->gc.direction_output = ftdi_gpio_direction_output;
+       priv->gc.init_valid_mask = ftdi_gpio_init_valid_mask;
        priv->gc.get = ftdi_gpio_get;
        priv->gc.set = ftdi_gpio_set;
        priv->gc.get_multiple = ftdi_gpio_get_multiple;