diff options
author | Oliver Neukum <oneukum@suse.de> | 2007-01-18 15:06:07 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-02-07 15:44:39 -0800 |
commit | d0532184086906889f4a0cd92eade1f7be49fbac (patch) | |
tree | 79932d82b7eb49d0aba6a157a12e8d7d88605d5f /drivers/usb/class | |
parent | a19ceb56cbd1e1beff3e9cf6042e1f31f6487aa6 (diff) | |
download | linux-3.10-d0532184086906889f4a0cd92eade1f7be49fbac.tar.gz linux-3.10-d0532184086906889f4a0cd92eade1f7be49fbac.tar.bz2 linux-3.10-d0532184086906889f4a0cd92eade1f7be49fbac.zip |
USB: autosuspend for usb printer driver
this implements autosuspend for usb printers. It compiles and is tested.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/class')
-rw-r--r-- | drivers/usb/class/usblp.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 6377db1b446..63e50a1f139 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -398,6 +398,9 @@ static int usblp_open(struct inode *inode, struct file *file) retval = 0; #endif + retval = usb_autopm_get_interface(intf); + if (retval < 0) + goto out; usblp->used = 1; file->private_data = usblp; @@ -442,6 +445,7 @@ static int usblp_release(struct inode *inode, struct file *file) usblp->used = 0; if (usblp->present) { usblp_unlink_urbs(usblp); + usb_autopm_put_interface(usblp->intf); } else /* finish cleanup from disconnect */ usblp_cleanup (usblp); mutex_unlock (&usblp_mutex); @@ -1203,14 +1207,9 @@ static int usblp_suspend (struct usb_interface *intf, pm_message_t message) { struct usblp *usblp = usb_get_intfdata (intf); - /* this races against normal access and open */ - mutex_lock (&usblp_mutex); - mutex_lock (&usblp->mut); /* we take no more IO */ usblp->sleeping = 1; usblp_unlink_urbs(usblp); - mutex_unlock (&usblp->mut); - mutex_unlock (&usblp_mutex); return 0; } @@ -1220,15 +1219,9 @@ static int usblp_resume (struct usb_interface *intf) struct usblp *usblp = usb_get_intfdata (intf); int r; - mutex_lock (&usblp_mutex); - mutex_lock (&usblp->mut); - usblp->sleeping = 0; r = handle_bidir (usblp); - mutex_unlock (&usblp->mut); - mutex_unlock (&usblp_mutex); - return r; } @@ -1251,6 +1244,7 @@ static struct usb_driver usblp_driver = { .suspend = usblp_suspend, .resume = usblp_resume, .id_table = usblp_ids, + .supports_autosuspend = 1, }; static int __init usblp_init(void) |