#include <linux/clk.h>
 #include <linux/platform_data/usb-ehci-orion.h>
 #include <linux/of.h>
+#include <linux/phy/phy.h>
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/usb.h>
 
 struct orion_ehci_hcd {
        struct clk *clk;
+       struct phy *phy;
 };
 
 static const char hcd_name[] = "ehci-orion";
        if (!IS_ERR(priv->clk))
                clk_prepare_enable(priv->clk);
 
+       priv->phy = devm_phy_optional_get(&pdev->dev, "usb");
+       if (IS_ERR(priv->phy)) {
+               err = PTR_ERR(priv->phy);
+               goto err_phy_get;
+       } else {
+               err = phy_init(priv->phy);
+               if (err)
+                       goto err_phy_init;
+
+               err = phy_power_on(priv->phy);
+               if (err)
+                       goto err_phy_power_on;
+       }
+
        /*
         * (Re-)program MBUS remapping windows if we are asked to.
         */
        return 0;
 
 err_add_hcd:
+       if (!IS_ERR(priv->phy))
+               phy_power_off(priv->phy);
+err_phy_power_on:
+       if (!IS_ERR(priv->phy))
+               phy_exit(priv->phy);
+err_phy_init:
+err_phy_get:
        if (!IS_ERR(priv->clk))
                clk_disable_unprepare(priv->clk);
        usb_put_hcd(hcd);
 
        usb_remove_hcd(hcd);
 
+       if (!IS_ERR(priv->phy)) {
+               phy_power_off(priv->phy);
+               phy_exit(priv->phy);
+       }
+
        if (!IS_ERR(priv->clk))
                clk_disable_unprepare(priv->clk);