]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
sunxi: usbc: Fix vbus gpio handling to work with the driver-model
authorHans de Goede <hdegoede@redhat.com>
Wed, 22 Apr 2015 15:39:59 +0000 (17:39 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 8 Sep 2015 20:35:19 +0000 (22:35 +0200)
The driver-model gpio functions may return another value then -1 as error,
make the sunxi usbc properly handle this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Acked-by: Ian Campbell <ijc@hellion.org.uk>
arch/arm/cpu/armv7/sunxi/usbc.c

index 7b883fbcec0c7beb11c5a4fd741b64503d5f9711..21032aa34839b173254e3a4adc51e33a8c06ffb8 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <common.h>
+#include <errno.h>
 #ifdef CONFIG_AXP152_POWER
 #include <axp152.h>
 #endif
@@ -90,7 +91,7 @@ static int get_vbus_gpio(int index)
        case 1: return sunxi_name_to_gpio(CONFIG_USB1_VBUS_PIN);
        case 2: return sunxi_name_to_gpio(CONFIG_USB2_VBUS_PIN);
        }
-       return -1;
+       return -EINVAL;
 }
 
 static int get_vbus_detect_gpio(int index)
@@ -98,7 +99,7 @@ static int get_vbus_detect_gpio(int index)
        switch (index) {
        case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_DET);
        }
-       return -1;
+       return -EINVAL;
 }
 
 static void usb_phy_write(struct sunxi_usbc_hcd *sunxi_usbc, int addr,
@@ -188,13 +189,13 @@ int sunxi_usbc_request_resources(int index)
        int ret = 0;
 
        sunxi_usbc->gpio_vbus = get_vbus_gpio(index);
-       if (sunxi_usbc->gpio_vbus != -1) {
+       if (sunxi_usbc->gpio_vbus >= 0) {
                ret |= gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
                ret |= gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
        }
 
        sunxi_usbc->gpio_vbus_det = get_vbus_detect_gpio(index);
-       if (sunxi_usbc->gpio_vbus_det != -1) {
+       if (sunxi_usbc->gpio_vbus_det >= 0) {
                ret |= gpio_request(sunxi_usbc->gpio_vbus_det, "usbc_vbus_det");
                ret |= gpio_direction_input(sunxi_usbc->gpio_vbus_det);
        }
@@ -207,10 +208,10 @@ int sunxi_usbc_free_resources(int index)
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
        int ret = 0;
 
-       if (sunxi_usbc->gpio_vbus != -1)
+       if (sunxi_usbc->gpio_vbus >= 0)
                ret |= gpio_free(sunxi_usbc->gpio_vbus);
 
-       if (sunxi_usbc->gpio_vbus_det != -1)
+       if (sunxi_usbc->gpio_vbus_det >= 0)
                ret |= gpio_free(sunxi_usbc->gpio_vbus_det);
 
        return ret;
@@ -264,7 +265,7 @@ void sunxi_usbc_vbus_enable(int index)
 {
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
 
-       if (sunxi_usbc->gpio_vbus != -1)
+       if (sunxi_usbc->gpio_vbus >= 0)
                gpio_set_value(sunxi_usbc->gpio_vbus, 1);
 }
 
@@ -272,7 +273,7 @@ void sunxi_usbc_vbus_disable(int index)
 {
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
 
-       if (sunxi_usbc->gpio_vbus != -1)
+       if (sunxi_usbc->gpio_vbus >= 0)
                gpio_set_value(sunxi_usbc->gpio_vbus, 0);
 }
 
@@ -281,9 +282,9 @@ int sunxi_usbc_vbus_detect(int index)
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
        int err, retries = 3;
 
-       if (sunxi_usbc->gpio_vbus_det == -1) {
+       if (sunxi_usbc->gpio_vbus_det < 0) {
                eprintf("Error: invalid vbus detection pin\n");
-               return -1;
+               return sunxi_usbc->gpio_vbus_det;
        }
 
        err = gpio_get_value(sunxi_usbc->gpio_vbus_det);