USB: serial: cp210x: fix GPIO in autosuspend
authorKaroly Pados <pados@pados.hu>
Sun, 17 Feb 2019 17:59:01 +0000 (18:59 +0100)
committerJohan Hovold <johan@kernel.org>
Wed, 20 Feb 2019 09:17:22 +0000 (10:17 +0100)
Current GPIO code in cp210x fails to take USB autosuspend into account,
making it practically impossible to use GPIOs with autosuspend enabled
without user configuration. Fix this like for ftdi_sio in a previous patch.
Tested on a CP2102N.

Signed-off-by: Karoly Pados <pados@pados.hu>
Fixes: cf5276ce7867 ("USB: serial: cp210x: Adding GPIO support for CP2105")
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/cp210x.c

index fac7a45..de076e8 100644 (file)
@@ -1370,8 +1370,13 @@ static int cp210x_gpio_get(struct gpio_chip *gc, unsigned int gpio)
        if (priv->partnum == CP210X_PARTNUM_CP2105)
                req_type = REQTYPE_INTERFACE_TO_HOST;
 
+       result = usb_autopm_get_interface(serial->interface);
+       if (result)
+               return result;
+
        result = cp210x_read_vendor_block(serial, req_type,
                                          CP210X_READ_LATCH, &buf, sizeof(buf));
+       usb_autopm_put_interface(serial->interface);
        if (result < 0)
                return result;
 
@@ -1392,6 +1397,10 @@ static void cp210x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
 
        buf.mask = BIT(gpio);
 
+       result = usb_autopm_get_interface(serial->interface);
+       if (result)
+               goto out;
+
        if (priv->partnum == CP210X_PARTNUM_CP2105) {
                result = cp210x_write_vendor_block(serial,
                                                   REQTYPE_HOST_TO_INTERFACE,
@@ -1409,6 +1418,8 @@ static void cp210x_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
                                         NULL, 0, USB_CTRL_SET_TIMEOUT);
        }
 
+       usb_autopm_put_interface(serial->interface);
+out:
        if (result < 0) {
                dev_err(&serial->interface->dev, "failed to set GPIO value: %d\n",
                                result);