usb: hcd: Remove USB phy if needed
[pandora-kernel.git] / drivers / usb / core / hcd.c
index 6bffb8c..7527c8e 100644 (file)
@@ -44,6 +44,7 @@
 
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
+#include <linux/usb/phy.h>
 
 #include "usb.h"
 
@@ -2603,7 +2604,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
         */
        if ((retval = hcd_buffer_create(hcd)) != 0) {
                dev_dbg(hcd->self.controller, "pool alloc failed\n");
-               return retval;
+               goto err_remove_phy;
        }
 
        if ((retval = usb_register_bus(&hcd->self)) < 0)
@@ -2734,6 +2735,12 @@ err_allocate_root_hub:
        usb_deregister_bus(&hcd->self);
 err_register_bus:
        hcd_buffer_destroy(hcd);
+err_remove_phy:
+       if (hcd->remove_phy && hcd->phy) {
+               usb_phy_shutdown(hcd->phy);
+               usb_put_phy(hcd->phy);
+               hcd->phy = NULL;
+       }
        return retval;
 }
 EXPORT_SYMBOL_GPL(usb_add_hcd);
@@ -2806,6 +2813,11 @@ void usb_remove_hcd(struct usb_hcd *hcd)
        usb_put_dev(hcd->self.root_hub);
        usb_deregister_bus(&hcd->self);
        hcd_buffer_destroy(hcd);
+       if (hcd->remove_phy && hcd->phy) {
+               usb_phy_shutdown(hcd->phy);
+               usb_put_phy(hcd->phy);
+               hcd->phy = NULL;
+       }
 }
 EXPORT_SYMBOL_GPL(usb_remove_hcd);