mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
979d5199fe
This patch collects various small updates related to root hubs, to shrink later patches which build on them. - For root hub suspend/resume support: * Make the existing usb_hcd_resume_root_hub() routine respect pmcore locking, exporting and using the dpm_runtime_resume() method. * Add a new usb_hcd_suspend_root_hub() to pair with that routine. (Essential to make OHCI autosuspend behave again...) * HC_SUSPENDED by itself only refers to the root hub's downstream ports. So let HCDs see root hub URBs unless the parent device is suspended. - Remove an assertion we no longer need (and now, also don't want). - Generic suspend/resume updates to work better with swsusp. * Ignore the FREEZE vs SUSPEND distinction for hardware; trying to use it breaks the swsusp snapshots it's supposed to help (sigh). * On resume, mark devices as resumed right away, but then do nothing else if the device is marked NOTATTACHED. These changes shouldn't be very noticable by themselves. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> drivers/base/power/runtime.c | 1 drivers/usb/core/hcd.c | 64 ++++++++++++++++++++++++++++++++++++++----- drivers/usb/core/hcd.h | 1 drivers/usb/core/hub.c | 45 ++++++++++++++++++++++++------ drivers/usb/core/usb.c | 20 +++++++++---- drivers/usb/core/usb.h | 1 6 files changed, 111 insertions(+), 21 deletions(-)
79 lines
2.5 KiB
C
79 lines
2.5 KiB
C
/* Functions local to drivers/usb/core/ */
|
|
|
|
extern void usb_create_sysfs_dev_files (struct usb_device *dev);
|
|
extern void usb_remove_sysfs_dev_files (struct usb_device *dev);
|
|
extern void usb_create_sysfs_intf_files (struct usb_interface *intf);
|
|
extern void usb_remove_sysfs_intf_files (struct usb_interface *intf);
|
|
|
|
extern void usb_disable_endpoint (struct usb_device *dev, unsigned int epaddr);
|
|
extern void usb_disable_interface (struct usb_device *dev,
|
|
struct usb_interface *intf);
|
|
extern void usb_release_interface_cache(struct kref *ref);
|
|
extern void usb_disable_device (struct usb_device *dev, int skip_ep0);
|
|
|
|
extern int usb_get_device_descriptor(struct usb_device *dev,
|
|
unsigned int size);
|
|
extern int usb_set_configuration(struct usb_device *dev, int configuration);
|
|
|
|
extern void usb_lock_all_devices(void);
|
|
extern void usb_unlock_all_devices(void);
|
|
|
|
extern void usb_kick_khubd(struct usb_device *dev);
|
|
extern void usb_suspend_root_hub(struct usb_device *hdev);
|
|
extern void usb_resume_root_hub(struct usb_device *dev);
|
|
|
|
extern int usb_hub_init(void);
|
|
extern void usb_hub_cleanup(void);
|
|
extern int usb_major_init(void);
|
|
extern void usb_major_cleanup(void);
|
|
extern int usb_host_init(void);
|
|
extern void usb_host_cleanup(void);
|
|
|
|
/* Interfaces and their "power state" are owned by usbcore */
|
|
|
|
static inline void mark_active(struct usb_interface *f)
|
|
{
|
|
f->dev.power.power_state.event = PM_EVENT_ON;
|
|
}
|
|
|
|
static inline void mark_quiesced(struct usb_interface *f)
|
|
{
|
|
f->dev.power.power_state.event = PM_EVENT_FREEZE;
|
|
}
|
|
|
|
static inline int is_active(struct usb_interface *f)
|
|
{
|
|
return f->dev.power.power_state.event == PM_EVENT_ON;
|
|
}
|
|
|
|
|
|
/* for labeling diagnostics */
|
|
extern const char *usbcore_name;
|
|
|
|
/* usbfs stuff */
|
|
extern struct usb_driver usbfs_driver;
|
|
extern struct file_operations usbfs_devices_fops;
|
|
extern struct file_operations usbfs_device_file_operations;
|
|
extern void usbfs_conn_disc_event(void);
|
|
|
|
extern int usbdev_init(void);
|
|
extern void usbdev_cleanup(void);
|
|
extern void usbdev_add(struct usb_device *dev);
|
|
extern void usbdev_remove(struct usb_device *dev);
|
|
extern struct usb_device *usbdev_lookup_minor(int minor);
|
|
|
|
struct dev_state {
|
|
struct list_head list; /* state list */
|
|
struct usb_device *dev;
|
|
struct file *file;
|
|
spinlock_t lock; /* protects the async urb lists */
|
|
struct list_head async_pending;
|
|
struct list_head async_completed;
|
|
wait_queue_head_t wait; /* wake up if a request completed */
|
|
unsigned int discsignr;
|
|
pid_t disc_pid;
|
|
uid_t disc_uid, disc_euid;
|
|
void __user *disccontext;
|
|
unsigned long ifclaimed;
|
|
};
|
|
|