|
@@ -37,6 +37,7 @@
|
|
|
#include <linux/usb/otg.h>
|
|
|
|
|
|
#include "usb.h"
|
|
|
+#include "phy.h"
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
@@ -2260,6 +2261,9 @@ int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)
|
|
|
usb_set_device_state(rhdev, USB_STATE_SUSPENDED);
|
|
|
hcd->state = HC_STATE_SUSPENDED;
|
|
|
|
|
|
+ if (!PMSG_IS_AUTO(msg))
|
|
|
+ usb_phy_roothub_power_off(hcd->phy_roothub);
|
|
|
+
|
|
|
/* Did we race with a root-hub wakeup event? */
|
|
|
if (rhdev->do_remote_wakeup) {
|
|
|
char buffer[6];
|
|
@@ -2296,6 +2300,13 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
|
|
|
dev_dbg(&rhdev->dev, "skipped %s of dead bus\n", "resume");
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+ if (!PMSG_IS_AUTO(msg)) {
|
|
|
+ status = usb_phy_roothub_power_on(hcd->phy_roothub);
|
|
|
+ if (status)
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
if (!hcd->driver->bus_resume)
|
|
|
return -ENOENT;
|
|
|
if (HCD_RH_RUNNING(hcd))
|
|
@@ -2333,6 +2344,7 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
|
|
|
}
|
|
|
} else {
|
|
|
hcd->state = old_state;
|
|
|
+ usb_phy_roothub_power_off(hcd->phy_roothub);
|
|
|
dev_dbg(&rhdev->dev, "bus %s fail, err %d\n",
|
|
|
"resume", status);
|
|
|
if (status != -ESHUTDOWN)
|
|
@@ -2769,6 +2781,18 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!hcd->skip_phy_initialization) {
|
|
|
+ hcd->phy_roothub = usb_phy_roothub_init(hcd->self.sysdev);
|
|
|
+ if (IS_ERR(hcd->phy_roothub)) {
|
|
|
+ retval = PTR_ERR(hcd->phy_roothub);
|
|
|
+ goto err_phy_roothub_init;
|
|
|
+ }
|
|
|
+
|
|
|
+ retval = usb_phy_roothub_power_on(hcd->phy_roothub);
|
|
|
+ if (retval)
|
|
|
+ goto err_usb_phy_roothub_power_on;
|
|
|
+ }
|
|
|
+
|
|
|
dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
|
|
|
|
|
|
/* Keep old behaviour if authorized_default is not in [0, 1]. */
|
|
@@ -2933,6 +2957,10 @@ err_allocate_root_hub:
|
|
|
err_register_bus:
|
|
|
hcd_buffer_destroy(hcd);
|
|
|
err_create_buf:
|
|
|
+ usb_phy_roothub_power_off(hcd->phy_roothub);
|
|
|
+err_usb_phy_roothub_power_on:
|
|
|
+ usb_phy_roothub_exit(hcd->phy_roothub);
|
|
|
+err_phy_roothub_init:
|
|
|
if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->remove_phy && hcd->phy) {
|
|
|
phy_power_off(hcd->phy);
|
|
|
phy_exit(hcd->phy);
|
|
@@ -3017,6 +3045,9 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
|
|
usb_deregister_bus(&hcd->self);
|
|
|
hcd_buffer_destroy(hcd);
|
|
|
|
|
|
+ usb_phy_roothub_power_off(hcd->phy_roothub);
|
|
|
+ usb_phy_roothub_exit(hcd->phy_roothub);
|
|
|
+
|
|
|
if (IS_ENABLED(CONFIG_GENERIC_PHY) && hcd->remove_phy && hcd->phy) {
|
|
|
phy_power_off(hcd->phy);
|
|
|
phy_exit(hcd->phy);
|