]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/armv7/sunxi/usbc.c
sunxi: common VBUS detection logic in usbc
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / sunxi / usbc.c
index f4f7217a6d448e7e32a8dac25d441ca134e634ce..1c777aac49aba863296323fd91bb6c8b1794ec20 100644 (file)
@@ -41,6 +41,7 @@ static struct sunxi_usbc_hcd {
        int usb_rst_mask;
        int ahb_clk_mask;
        int gpio_vbus;
+       int gpio_vbus_det;
        int irq;
        int id;
 } sunxi_usbc_hcd[] = {
@@ -104,6 +105,14 @@ static int get_vbus_gpio(int index)
        return -1;
 }
 
+static int get_vbus_detect_gpio(int index)
+{
+       switch (index) {
+       case 0: return sunxi_name_to_gpio(CONFIG_USB0_VBUS_DET);
+       }
+       return -1;
+}
+
 static void usb_phy_write(struct sunxi_usbc_hcd *sunxi_usbc, int addr,
                          int data, int len)
 {
@@ -183,22 +192,31 @@ void sunxi_usbc_enable_squelch_detect(int index, int enable)
 int sunxi_usbc_request_resources(int index)
 {
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
+       int ret = 0;
 
        sunxi_usbc->gpio_vbus = get_vbus_gpio(index);
        if (sunxi_usbc->gpio_vbus != -1)
-               return gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
+               ret |= gpio_request(sunxi_usbc->gpio_vbus, "usbc_vbus");
 
-       return 0;
+       sunxi_usbc->gpio_vbus_det = get_vbus_detect_gpio(index);
+       if (sunxi_usbc->gpio_vbus_det != -1)
+               ret |= gpio_request(sunxi_usbc->gpio_vbus_det, "usbc_vbus_det");
+
+       return ret;
 }
 
 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)
-               return gpio_free(sunxi_usbc->gpio_vbus);
+               ret |= gpio_free(sunxi_usbc->gpio_vbus);
+
+       if (sunxi_usbc->gpio_vbus_det != -1)
+               ret |= gpio_free(sunxi_usbc->gpio_vbus_det);
 
-       return 0;
+       return ret;
 }
 
 void sunxi_usbc_enable(int index)
@@ -260,3 +278,20 @@ void sunxi_usbc_vbus_disable(int index)
        if (sunxi_usbc->gpio_vbus != -1)
                gpio_direction_output(sunxi_usbc->gpio_vbus, 0);
 }
+
+int sunxi_usbc_vbus_detect(int index)
+{
+       struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
+       int err;
+
+       if (sunxi_usbc->gpio_vbus_det == -1) {
+               eprintf("Error: invalid vbus detection pin\n");
+               return -1;
+       }
+
+       err = gpio_direction_input(sunxi_usbc->gpio_vbus_det);
+       if (err)
+               return err;
+
+       return gpio_get_value(sunxi_usbc->gpio_vbus_det);
+}