If PHY is entering Host mode, we need to enable VBUS.

Signed-off-by: Felipe Balbi <felipe.ba...@linux.intel.com>
---
 drivers/usb/dwc3/core.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 3cbbffaee258..f9d7f2fe76e3 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -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");
@@ -909,6 +922,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)
@@ -918,6 +937,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)
-- 
2.11.0.295.gd7dffce1ce

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to