]> git.sur5r.net Git - u-boot/commitdiff
sunxi: usbc: Wait for vbus to fall after disabling it
authorHans de Goede <hdegoede@redhat.com>
Fri, 27 Mar 2015 20:46:00 +0000 (21:46 +0100)
committerHans de Goede <hdegoede@redhat.com>
Wed, 15 Apr 2015 14:17:17 +0000 (16:17 +0200)
When u-boot boots the board may be powering vbus, we turn off vbus in
sunxi_usbc_request_resources, if we are too quick with reading vusb-detect
after this we may see a residual charge and assume we've an external vusb
connected even though we do not. So when we see an external vusb wait a bit
and try again.

Without this when dealing with a pmic controller vbus and doing "reset" on
the u-boot console the musb host will only init once every other boot, because
the other boot it thinks an external vbus is present, this commit fixes this.

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

index 6285fa5ecbade1261de77dc09c836c767b156e88..a0e9604cfae0cf6c95e95e10687ec32739e0432b 100644 (file)
@@ -286,12 +286,23 @@ void sunxi_usbc_vbus_disable(int index)
 int sunxi_usbc_vbus_detect(int index)
 {
        struct sunxi_usbc_hcd *sunxi_usbc = &sunxi_usbc_hcd[index];
-       int err;
+       int err, retries = 3;
 
        if (sunxi_usbc->gpio_vbus_det == -1) {
                eprintf("Error: invalid vbus detection pin\n");
                return -1;
        }
 
-       return gpio_get_value(sunxi_usbc->gpio_vbus_det);
+       err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
+       /*
+        * Vbus may have been provided by the board and just been turned of
+        * some milliseconds ago on reset, what we're measuring then is a
+        * residual charge on Vbus, sleep a bit and try again.
+        */
+       while (err > 0 && retries--) {
+               mdelay(100);
+               err = gpio_get_value(sunxi_usbc->gpio_vbus_det);
+       }
+
+       return err;
 }