Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 226916
b: refs/heads/master
c: 63defa7
h: refs/heads/master
v: v3
  • Loading branch information
Ming Lei authored and Greg Kroah-Hartman committed Nov 16, 2010
1 parent 52a1fef commit cb2ca0d
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 54 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f646cf94520e22cb11eb5d2e9a35b33bfe4bea1b
refs/heads/master: 63defa73c8c1193c1273474440c30d34c2524597
82 changes: 29 additions & 53 deletions trunk/drivers/usb/core/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1612,18 +1612,9 @@ EXPORT_SYMBOL_GPL(usb_autopm_get_interface);
*/
int usb_autopm_get_interface_async(struct usb_interface *intf)
{
int status = 0;
enum rpm_status s;

/* Don't request a resume unless the interface is already suspending
* or suspended. Doing so would force a running suspend timer to be
* cancelled.
*/
pm_runtime_get_noresume(&intf->dev);
s = ACCESS_ONCE(intf->dev.power.runtime_status);
if (s == RPM_SUSPENDING || s == RPM_SUSPENDED)
status = pm_request_resume(&intf->dev);
int status;

status = pm_runtime_get(&intf->dev);
if (status < 0 && status != -EINPROGRESS)
pm_runtime_put_noidle(&intf->dev);
else
Expand Down Expand Up @@ -1717,71 +1708,56 @@ static int autosuspend_check(struct usb_device *udev)

static int usb_runtime_suspend(struct device *dev)
{
int status = 0;
struct usb_device *udev = to_usb_device(dev);
int status;

/* A USB device can be suspended if it passes the various autosuspend
* checks. Runtime suspend for a USB device means suspending all the
* interfaces and then the device itself.
*/
if (is_usb_device(dev)) {
struct usb_device *udev = to_usb_device(dev);

if (autosuspend_check(udev) != 0)
return -EAGAIN;

status = usb_suspend_both(udev, PMSG_AUTO_SUSPEND);
if (autosuspend_check(udev) != 0)
return -EAGAIN;

/* If an interface fails the suspend, adjust the last_busy
* time so that we don't get another suspend attempt right
* away.
*/
if (status) {
udev->last_busy = jiffies +
(udev->autosuspend_delay == 0 ?
HZ/2 : 0);
}
status = usb_suspend_both(udev, PMSG_AUTO_SUSPEND);

/* Prevent the parent from suspending immediately after */
else if (udev->parent)
udev->parent->last_busy = jiffies;
/* If an interface fails the suspend, adjust the last_busy
* time so that we don't get another suspend attempt right
* away.
*/
if (status) {
udev->last_busy = jiffies +
(udev->autosuspend_delay == 0 ? HZ/2 : 0);
}

/* Runtime suspend for a USB interface doesn't mean anything. */
/* Prevent the parent from suspending immediately after */
else if (udev->parent)
udev->parent->last_busy = jiffies;

return status;
}

static int usb_runtime_resume(struct device *dev)
{
struct usb_device *udev = to_usb_device(dev);
int status;

/* Runtime resume for a USB device means resuming both the device
* and all its interfaces.
*/
if (is_usb_device(dev)) {
struct usb_device *udev = to_usb_device(dev);
int status;

status = usb_resume_both(udev, PMSG_AUTO_RESUME);
udev->last_busy = jiffies;
return status;
}

/* Runtime resume for a USB interface doesn't mean anything. */
return 0;
status = usb_resume_both(udev, PMSG_AUTO_RESUME);
udev->last_busy = jiffies;
return status;
}

static int usb_runtime_idle(struct device *dev)
{
struct usb_device *udev = to_usb_device(dev);

/* An idle USB device can be suspended if it passes the various
* autosuspend checks. An idle interface can be suspended at
* any time.
* autosuspend checks.
*/
if (is_usb_device(dev)) {
struct usb_device *udev = to_usb_device(dev);

if (autosuspend_check(udev) != 0)
return 0;
}

pm_runtime_suspend(dev);
if (autosuspend_check(udev) == 0)
pm_runtime_suspend(dev);
return 0;
}

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/usb/core/message.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <linux/ctype.h>
#include <linux/nls.h>
#include <linux/device.h>
#include <linux/pm_runtime.h>
#include <linux/scatterlist.h>
#include <linux/usb/quirks.h>
#include <linux/usb/hcd.h> /* for usbcore internals */
Expand Down Expand Up @@ -1804,6 +1805,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
INIT_WORK(&intf->reset_ws, __usb_queue_reset_device);
intf->minor = -1;
device_initialize(&intf->dev);
pm_runtime_no_callbacks(&intf->dev);
dev_set_name(&intf->dev, "%d-%s:%d.%d",
dev->bus->busnum, dev->devpath,
configuration, alt->desc.bInterfaceNumber);
Expand Down

0 comments on commit cb2ca0d

Please sign in to comment.