usb: xhci: plat: Add USB phy support
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Tue, 17 Mar 2015 16:32:22 +0000 (18:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Mar 2015 15:21:14 +0000 (16:21 +0100)
The Marvell Armada 385 AP needs a dumb phy in order to enable the USB3 VBUS.

Add a call to retrieve a USB PHY to XHCI plat in order to support this.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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);