These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / usb / chipidea / host.c
index 2f8af40..3d24304 100644 (file)
@@ -44,6 +44,7 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable)
        struct ehci_hcd *ehci = hcd_to_ehci(hcd);
        struct ehci_ci_priv *priv = (struct ehci_ci_priv *)ehci->priv;
        struct device *dev = hcd->self.controller;
+       struct ci_hdrc *ci = dev_get_drvdata(dev);
        int ret = 0;
        int port = HCS_N_PORTS(ehci->hcs_params);
 
@@ -64,12 +65,37 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable)
                        return ret;
                }
        }
+
+       if (enable && (ci->platdata->phy_mode == USBPHY_INTERFACE_MODE_HSIC)) {
+               /*
+                * Marvell 28nm HSIC PHY requires forcing the port to HS mode.
+                * As HSIC is always HS, this should be safe for others.
+                */
+               hw_port_test_set(ci, 5);
+               hw_port_test_set(ci, 0);
+       }
        return 0;
 };
 
+static int ehci_ci_reset(struct usb_hcd *hcd)
+{
+       struct device *dev = hcd->self.controller;
+       struct ci_hdrc *ci = dev_get_drvdata(dev);
+       int ret;
+
+       ret = ehci_setup(hcd);
+       if (ret)
+               return ret;
+
+       ci_platform_configure(ci);
+
+       return ret;
+}
+
 static const struct ehci_driver_overrides ehci_ci_overrides = {
        .extra_priv_size = sizeof(struct ehci_ci_priv),
        .port_power      = ehci_ci_portpower,
+       .reset           = ehci_ci_reset,
 };
 
 static irqreturn_t host_irq(struct ci_hdrc *ci)
@@ -141,12 +167,6 @@ static int host_start(struct ci_hdrc *ci)
                }
        }
 
-       if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING)
-               hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
-
-       if (ci->platdata->flags & CI_HDRC_FORCE_FULLSPEED)
-               hw_write(ci, OP_PORTSC, PORTSC_PFSC, PORTSC_PFSC);
-
        return ret;
 
 disable_reg: