usb: xhci: plat: Add USB phy support
[firefly-linux-kernel-4.4.55.git] / drivers / usb / host / xhci-plat.c
index 0e11d61408ff3f95a3110636e858119f4037cf0c..783e819139a78adf233343e2ac95fed9bf19c731 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/usb/phy.h>
 #include <linux/slab.h>
 #include <linux/usb/xhci_pdriver.h>
 
@@ -155,12 +156,27 @@ static int xhci_plat_probe(struct platform_device *pdev)
        if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
                xhci->shared_hcd->can_do_streams = 1;
 
+       hcd->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
+       if (IS_ERR(hcd->usb_phy)) {
+               ret = PTR_ERR(hcd->usb_phy);
+               if (ret == -EPROBE_DEFER)
+                       goto put_usb3_hcd;
+               hcd->usb_phy = NULL;
+       } else {
+               ret = usb_phy_init(hcd->usb_phy);
+               if (ret)
+                       goto put_usb3_hcd;
+       }
+
        ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
        if (ret)
-               goto put_usb3_hcd;
+               goto disable_usb_phy;
 
        return 0;
 
+disable_usb_phy:
+       usb_phy_shutdown(hcd->usb_phy);
+
 put_usb3_hcd:
        usb_put_hcd(xhci->shared_hcd);
 
@@ -184,6 +200,7 @@ static int xhci_plat_remove(struct platform_device *dev)
        struct clk *clk = xhci->clk;
 
        usb_remove_hcd(xhci->shared_hcd);
+       usb_phy_shutdown(hcd->usb_phy);
        usb_put_hcd(xhci->shared_hcd);
 
        usb_remove_hcd(hcd);