|
@@ -3557,10 +3557,21 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|
|
{
|
|
|
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
|
struct xhci_virt_device *virt_dev;
|
|
|
+ struct device *dev = hcd->self.controller;
|
|
|
unsigned long flags;
|
|
|
u32 state;
|
|
|
int i, ret;
|
|
|
|
|
|
+#ifndef CONFIG_USB_DEFAULT_PERSIST
|
|
|
+ /*
|
|
|
+ * We called pm_runtime_get_noresume when the device was attached.
|
|
|
+ * Decrement the counter here to allow controller to runtime suspend
|
|
|
+ * if no devices remain.
|
|
|
+ */
|
|
|
+ if (xhci->quirks & XHCI_RESET_ON_RESUME)
|
|
|
+ pm_runtime_put_noidle(dev);
|
|
|
+#endif
|
|
|
+
|
|
|
ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__);
|
|
|
/* If the host is halted due to driver unload, we still need to free the
|
|
|
* device.
|
|
@@ -3634,6 +3645,7 @@ static int xhci_reserve_host_control_ep_resources(struct xhci_hcd *xhci)
|
|
|
int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|
|
{
|
|
|
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
|
+ struct device *dev = hcd->self.controller;
|
|
|
unsigned long flags;
|
|
|
int timeleft;
|
|
|
int ret;
|
|
@@ -3686,6 +3698,16 @@ int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev)
|
|
|
goto disable_slot;
|
|
|
}
|
|
|
udev->slot_id = xhci->slot_id;
|
|
|
+
|
|
|
+#ifndef CONFIG_USB_DEFAULT_PERSIST
|
|
|
+ /*
|
|
|
+ * If resetting upon resume, we can't put the controller into runtime
|
|
|
+ * suspend if there is a device attached.
|
|
|
+ */
|
|
|
+ if (xhci->quirks & XHCI_RESET_ON_RESUME)
|
|
|
+ pm_runtime_get_noresume(dev);
|
|
|
+#endif
|
|
|
+
|
|
|
/* Is this a LS or FS device under a HS hub? */
|
|
|
/* Hub or peripherial? */
|
|
|
return 1;
|