Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d461095 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman
Browse files

USB: Implement PM FREEZE and PRETHAW



This patch (as884) finally implements the time-saving semantics
possible with the Power Management FREEZE and PRETHAW events.  Their
proper handling requires only that devices be quiesced, with
interrupts and DMA turned off; non-root USB devices don't actually
need to be put in a suspended state.  The patch checks and avoids
doing the suspend call when possible.

Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 784a6e1c
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -1050,8 +1050,15 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg)
				break;
		}
	}
	if (status == 0)
	if (status == 0) {

		/* Non-root devices don't need to do anything for FREEZE
		 * or PRETHAW. */
		if (udev->parent && (msg.event == PM_EVENT_FREEZE ||
				msg.event == PM_EVENT_PRETHAW))
			goto done;
		status = usb_suspend_device(udev, msg);
	}

	/* If the suspend failed, resume interfaces that did get suspended */
	if (status != 0) {
+0 −4
Original line number Diff line number Diff line
@@ -193,10 +193,6 @@ static void generic_disconnect(struct usb_device *udev)

static int generic_suspend(struct usb_device *udev, pm_message_t msg)
{
	/* USB devices enter SUSPEND state through their hubs, but can be
	 * marked for FREEZE as soon as their children are already idled.
	 * But those semantics are useless, so we equate the two (sigh).
	 */
	return usb_port_suspend(udev);
}