#include <linux/usb/otg.h>
 
 #include "usb.h"
+#include "phy.h"
 
 
 /*-------------------------------------------------------------------------*/
                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];
                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))
                }
        } 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)
                }
        }
 
+       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]. */
 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);
        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);