aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2010-01-08 12:57:28 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-03-02 17:54:12 -0500
commit9bbdf1e0afe771ca7650f9f476769310bee9d8f3 (patch)
tree22852edde0165523d37f045575512f5759040dba /include/linux
parent0c590e2361511997430130e10e372217c1128da6 (diff)
USB: convert to the runtime PM framework
This patch (as1329) converts the USB stack over to the PM core's runtime PM framework. This involves numerous changes throughout usbcore, especially to hub.c and driver.c. Perhaps the most notable change is that CONFIG_USB_SUSPEND now depends on CONFIG_PM_RUNTIME instead of CONFIG_PM. Several fields in the usb_device and usb_interface structures are no longer needed. Some code which used to depend on CONFIG_USB_PM now depends on CONFIG_USB_SUSPEND (requiring some rearrangement of header files). The only visible change in behavior should be that following a system sleep (resume from RAM or resume from hibernation), autosuspended USB devices will be resumed just like everything else. They won't remain suspended. But if they aren't in use then they will naturally autosuspend again in a few seconds. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/usb.h31
1 files changed, 3 insertions, 28 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h
index e6419ac89ea2..ad50fc8a7ad3 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -122,7 +122,6 @@ enum usb_interface_condition {
122 * number from the USB core by calling usb_register_dev(). 122 * number from the USB core by calling usb_register_dev().
123 * @condition: binding state of the interface: not bound, binding 123 * @condition: binding state of the interface: not bound, binding
124 * (in probe()), bound to a driver, or unbinding (in disconnect()) 124 * (in probe()), bound to a driver, or unbinding (in disconnect())
125 * @is_active: flag set when the interface is bound and not suspended.
126 * @sysfs_files_created: sysfs attributes exist 125 * @sysfs_files_created: sysfs attributes exist
127 * @ep_devs_created: endpoint child pseudo-devices exist 126 * @ep_devs_created: endpoint child pseudo-devices exist
128 * @unregistering: flag set when the interface is being unregistered 127 * @unregistering: flag set when the interface is being unregistered
@@ -135,8 +134,7 @@ enum usb_interface_condition {
135 * @dev: driver model's view of this device 134 * @dev: driver model's view of this device
136 * @usb_dev: if an interface is bound to the USB major, this will point 135 * @usb_dev: if an interface is bound to the USB major, this will point
137 * to the sysfs representation for that device. 136 * to the sysfs representation for that device.
138 * @pm_usage_cnt: PM usage counter for this interface; autosuspend is not 137 * @pm_usage_cnt: PM usage counter for this interface
139 * allowed unless the counter is 0.
140 * @reset_ws: Used for scheduling resets from atomic context. 138 * @reset_ws: Used for scheduling resets from atomic context.
141 * @reset_running: set to 1 if the interface is currently running a 139 * @reset_running: set to 1 if the interface is currently running a
142 * queued reset so that usb_cancel_queued_reset() doesn't try to 140 * queued reset so that usb_cancel_queued_reset() doesn't try to
@@ -184,7 +182,6 @@ struct usb_interface {
184 int minor; /* minor number this interface is 182 int minor; /* minor number this interface is
185 * bound to */ 183 * bound to */
186 enum usb_interface_condition condition; /* state of binding */ 184 enum usb_interface_condition condition; /* state of binding */
187 unsigned is_active:1; /* the interface is not suspended */
188 unsigned sysfs_files_created:1; /* the sysfs attributes exist */ 185 unsigned sysfs_files_created:1; /* the sysfs attributes exist */
189 unsigned ep_devs_created:1; /* endpoint "devices" exist */ 186 unsigned ep_devs_created:1; /* endpoint "devices" exist */
190 unsigned unregistering:1; /* unregistration is in progress */ 187 unsigned unregistering:1; /* unregistration is in progress */
@@ -401,7 +398,6 @@ struct usb_tt;
401 * @portnum: parent port number (origin 1) 398 * @portnum: parent port number (origin 1)
402 * @level: number of USB hub ancestors 399 * @level: number of USB hub ancestors
403 * @can_submit: URBs may be submitted 400 * @can_submit: URBs may be submitted
404 * @discon_suspended: disconnected while suspended
405 * @persist_enabled: USB_PERSIST enabled for this device 401 * @persist_enabled: USB_PERSIST enabled for this device
406 * @have_langid: whether string_langid is valid 402 * @have_langid: whether string_langid is valid
407 * @authorized: policy has said we can use it; 403 * @authorized: policy has said we can use it;
@@ -421,20 +417,15 @@ struct usb_tt;
421 * @usbfs_dentry: usbfs dentry entry for the device 417 * @usbfs_dentry: usbfs dentry entry for the device
422 * @maxchild: number of ports if hub 418 * @maxchild: number of ports if hub
423 * @children: child devices - USB devices that are attached to this hub 419 * @children: child devices - USB devices that are attached to this hub
424 * @pm_usage_cnt: usage counter for autosuspend
425 * @quirks: quirks of the whole device 420 * @quirks: quirks of the whole device
426 * @urbnum: number of URBs submitted for the whole device 421 * @urbnum: number of URBs submitted for the whole device
427 * @active_duration: total time device is not suspended 422 * @active_duration: total time device is not suspended
428 * @autosuspend: for delayed autosuspends
429 * @autoresume: for autoresumes requested while in_interrupt
430 * @pm_mutex: protects PM operations
431 * @last_busy: time of last use 423 * @last_busy: time of last use
432 * @autosuspend_delay: in jiffies 424 * @autosuspend_delay: in jiffies
433 * @connect_time: time device was first connected 425 * @connect_time: time device was first connected
434 * @do_remote_wakeup: remote wakeup should be enabled 426 * @do_remote_wakeup: remote wakeup should be enabled
435 * @reset_resume: needs reset instead of resume 427 * @reset_resume: needs reset instead of resume
436 * @autosuspend_disabled: autosuspend disabled by the user 428 * @autosuspend_disabled: autosuspend disabled by the user
437 * @skip_sys_resume: skip the next system resume
438 * @wusb_dev: if this is a Wireless USB device, link to the WUSB 429 * @wusb_dev: if this is a Wireless USB device, link to the WUSB
439 * specific data for the device. 430 * specific data for the device.
440 * @slot_id: Slot ID assigned by xHCI 431 * @slot_id: Slot ID assigned by xHCI
@@ -475,7 +466,6 @@ struct usb_device {
475 u8 level; 466 u8 level;
476 467
477 unsigned can_submit:1; 468 unsigned can_submit:1;
478 unsigned discon_suspended:1;
479 unsigned persist_enabled:1; 469 unsigned persist_enabled:1;
480 unsigned have_langid:1; 470 unsigned have_langid:1;
481 unsigned authorized:1; 471 unsigned authorized:1;
@@ -499,17 +489,12 @@ struct usb_device {
499 int maxchild; 489 int maxchild;
500 struct usb_device *children[USB_MAXCHILDREN]; 490 struct usb_device *children[USB_MAXCHILDREN];
501 491
502 int pm_usage_cnt;
503 u32 quirks; 492 u32 quirks;
504 atomic_t urbnum; 493 atomic_t urbnum;
505 494
506 unsigned long active_duration; 495 unsigned long active_duration;
507 496
508#ifdef CONFIG_PM 497#ifdef CONFIG_PM
509 struct delayed_work autosuspend;
510 struct work_struct autoresume;
511 struct mutex pm_mutex;
512
513 unsigned long last_busy; 498 unsigned long last_busy;
514 int autosuspend_delay; 499 int autosuspend_delay;
515 unsigned long connect_time; 500 unsigned long connect_time;
@@ -517,7 +502,6 @@ struct usb_device {
517 unsigned do_remote_wakeup:1; 502 unsigned do_remote_wakeup:1;
518 unsigned reset_resume:1; 503 unsigned reset_resume:1;
519 unsigned autosuspend_disabled:1; 504 unsigned autosuspend_disabled:1;
520 unsigned skip_sys_resume:1;
521#endif 505#endif
522 struct wusb_dev *wusb_dev; 506 struct wusb_dev *wusb_dev;
523 int slot_id; 507 int slot_id;
@@ -549,17 +533,8 @@ extern int usb_autopm_get_interface(struct usb_interface *intf);
549extern void usb_autopm_put_interface(struct usb_interface *intf); 533extern void usb_autopm_put_interface(struct usb_interface *intf);
550extern int usb_autopm_get_interface_async(struct usb_interface *intf); 534extern int usb_autopm_get_interface_async(struct usb_interface *intf);
551extern void usb_autopm_put_interface_async(struct usb_interface *intf); 535extern void usb_autopm_put_interface_async(struct usb_interface *intf);
552 536extern void usb_autopm_get_interface_no_resume(struct usb_interface *intf);
553static inline void usb_autopm_get_interface_no_resume( 537extern void usb_autopm_put_interface_no_suspend(struct usb_interface *intf);
554 struct usb_interface *intf)
555{
556 atomic_inc(&intf->pm_usage_cnt);
557}
558static inline void usb_autopm_put_interface_no_suspend(
559 struct usb_interface *intf)
560{
561 atomic_dec(&intf->pm_usage_cnt);
562}
563 538
564static inline void usb_mark_last_busy(struct usb_device *udev) 539static inline void usb_mark_last_busy(struct usb_device *udev)
565{ 540{