usb: dwc3: core: program PHY for proper DRD modes
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 5 Jun 2017 14:22:10 +0000 (17:22 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Tue, 13 Jun 2017 10:21:06 +0000 (13:21 +0300)
If PHY is entering Host mode, we need to enable VBUS.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/core.c

index 25165a97db5e6c7141b9bfb42ea324e783aaa04a..326b302fc440d89d7aa4b4ea3d5ba9e839005318 100644 (file)
@@ -151,11 +151,24 @@ static void __dwc3_set_mode(struct work_struct *work)
        switch (dwc->desired_dr_role) {
        case DWC3_GCTL_PRTCAP_HOST:
                ret = dwc3_host_init(dwc);
-               if (ret)
+               if (ret) {
                        dev_err(dwc->dev, "failed to initialize host\n");
+               } else {
+                       if (dwc->usb2_phy)
+                               otg_set_vbus(dwc->usb2_phy->otg, true);
+                       if (dwc->usb2_generic_phy)
+                               phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_HOST);
+
+               }
                break;
        case DWC3_GCTL_PRTCAP_DEVICE:
                dwc3_event_buffers_setup(dwc);
+
+               if (dwc->usb2_phy)
+                       otg_set_vbus(dwc->usb2_phy->otg, false);
+               if (dwc->usb2_generic_phy)
+                       phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_DEVICE);
+
                ret = dwc3_gadget_init(dwc);
                if (ret)
                        dev_err(dwc->dev, "failed to initialize peripheral\n");
@@ -915,6 +928,12 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
        switch (dwc->dr_mode) {
        case USB_DR_MODE_PERIPHERAL:
                dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
+
+               if (dwc->usb2_phy)
+                       otg_set_vbus(dwc->usb2_phy->otg, false);
+               if (dwc->usb2_generic_phy)
+                       phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_DEVICE);
+
                ret = dwc3_gadget_init(dwc);
                if (ret) {
                        if (ret != -EPROBE_DEFER)
@@ -924,6 +943,12 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
                break;
        case USB_DR_MODE_HOST:
                dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_HOST);
+
+               if (dwc->usb2_phy)
+                       otg_set_vbus(dwc->usb2_phy->otg, true);
+               if (dwc->usb2_generic_phy)
+                       phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_HOST);
+
                ret = dwc3_host_init(dwc);
                if (ret) {
                        if (ret != -EPROBE_DEFER)