sunxi: musb: Power off OTG port VBUS when disabled
authorChen-Yu Tsai <wens@csie.org>
Wed, 7 Sep 2016 06:25:21 +0000 (14:25 +0800)
committerHans de Goede <hdegoede@redhat.com>
Sat, 17 Sep 2016 12:37:40 +0000 (14:37 +0200)
The Linux kernel musb driver expects VBUS to be off while initializing
musb. Having it on results in a repeating string of warnings, followed
by an unusable peripheral. The peripheral is only usable after
physically removing the OTG adapter, letting musb reset its state.

This partially reverts commit c9f8947e6604 ("sunxi: usb-phy: Never
power off the usb ports")

Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
arch/arm/include/asm/arch-sunxi/usb_phy.h
arch/arm/mach-sunxi/usb_phy.c
drivers/usb/musb-new/sunxi.c

index 6a14cad3ff393d4b9c0acf466e17683e82a13822..cef6c985bc8d46c74dd11cdaac712e1b45f7975f 100644 (file)
@@ -16,7 +16,6 @@ void sunxi_usb_phy_init(int index);
 void sunxi_usb_phy_exit(int index);
 void sunxi_usb_phy_power_on(int index);
 void sunxi_usb_phy_power_off(int index);
-int sunxi_usb_phy_power_is_on(int index);
 int sunxi_usb_phy_vbus_detect(int index);
 int sunxi_usb_phy_id_detect(int index);
 void sunxi_usb_phy_enable_squelch_detect(int index, int enable);
index f9993d28755149717095e31a4b847c6a30f58cc7..bd1bbee410ba35bc6c17a539d4ae38422c82093f 100644 (file)
@@ -296,13 +296,6 @@ void sunxi_usb_phy_power_off(int index)
                gpio_set_value(phy->gpio_vbus, 0);
 }
 
-int sunxi_usb_phy_power_is_on(int index)
-{
-       struct sunxi_usb_phy *phy = &sunxi_usb_phy[index];
-
-       return phy->power_on_count > 0;
-}
-
 int sunxi_usb_phy_vbus_detect(int index)
 {
        struct sunxi_usb_phy *phy = &sunxi_usb_phy[index];
index c016a0bb544dd82a86a6a6dfe780d58c5bcc426f..dece7818dc3ae1528cf2c830816070a7bc97a3e5 100644 (file)
@@ -205,6 +205,8 @@ static struct musb *sunxi_musb;
 
 static int sunxi_musb_enable(struct musb *musb)
 {
+       int ret;
+
        pr_debug("%s():\n", __func__);
 
        musb_ep_select(musb->mregs, 0);
@@ -217,26 +219,17 @@ static int sunxi_musb_enable(struct musb *musb)
        musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0);
 
        if (is_host_enabled(musb)) {
-               int id = sunxi_usb_phy_id_detect(0);
-
-               if (id == 1 && sunxi_usb_phy_power_is_on(0))
-                       sunxi_usb_phy_power_off(0);
-
-               if (!sunxi_usb_phy_power_is_on(0)) {
-                       int vbus = sunxi_usb_phy_vbus_detect(0);
-                       if (vbus == 1) {
-                               printf("A charger is plugged into the OTG: ");
-                               return -ENODEV;
-                       }
+               ret = sunxi_usb_phy_vbus_detect(0);
+               if (ret == 1) {
+                       printf("A charger is plugged into the OTG: ");
+                       return -ENODEV;
                }
-
-               if (id == 1) {
+               ret = sunxi_usb_phy_id_detect(0);
+               if (ret == 1) {
                        printf("No host cable detected: ");
                        return -ENODEV;
                }
-
-               if (!sunxi_usb_phy_power_is_on(0))
-                       sunxi_usb_phy_power_on(0);
+               sunxi_usb_phy_power_on(0); /* port power on */
        }
 
        USBC_ForceVbusValidToHigh(musb->mregs);
@@ -252,6 +245,9 @@ static void sunxi_musb_disable(struct musb *musb)
        if (!enabled)
                return;
 
+       if (is_host_enabled(musb))
+               sunxi_usb_phy_power_off(0); /* port power off */
+
        USBC_ForceVbusValidToLow(musb->mregs);
        mdelay(200); /* Wait for the current session to timeout */