diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2006-08-30 15:47:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-27 14:58:57 -0400 |
commit | 01d883d44a1ca8dc77486635d428cba63e7fdadf (patch) | |
tree | 447a4293b2ec4dfa1b3d03a46a3a33498809f0e8 /drivers/usb/core/devio.c | |
parent | 645daaab0b6adc35c1838df2a82f9d729fdb1767 (diff) |
usbcore: non-hub-specific uses of autosuspend
This patch (as741) makes the non-hub parts of usbcore actually use the
autosuspend facilities added by an earlier patch.
Devices opened through usbfs are autoresumed and then
autosuspended upon close.
Likewise for usb-skeleton.
Devices are autoresumed for usb_set_configuration.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/core/devio.c')
-rw-r--r-- | drivers/usb/core/devio.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 43c08724a2d8..fd345ad810f8 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -558,10 +558,12 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
558 | dev = usbdev_lookup_minor(iminor(inode)); | 558 | dev = usbdev_lookup_minor(iminor(inode)); |
559 | if (!dev) | 559 | if (!dev) |
560 | dev = inode->i_private; | 560 | dev = inode->i_private; |
561 | if (!dev) { | 561 | if (!dev) |
562 | kfree(ps); | ||
563 | goto out; | 562 | goto out; |
564 | } | 563 | ret = usb_autoresume_device(dev, 1); |
564 | if (ret) | ||
565 | goto out; | ||
566 | |||
565 | usb_get_dev(dev); | 567 | usb_get_dev(dev); |
566 | ret = 0; | 568 | ret = 0; |
567 | ps->dev = dev; | 569 | ps->dev = dev; |
@@ -581,6 +583,8 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
581 | list_add_tail(&ps->list, &dev->filelist); | 583 | list_add_tail(&ps->list, &dev->filelist); |
582 | file->private_data = ps; | 584 | file->private_data = ps; |
583 | out: | 585 | out: |
586 | if (ret) | ||
587 | kfree(ps); | ||
584 | mutex_unlock(&usbfs_mutex); | 588 | mutex_unlock(&usbfs_mutex); |
585 | return ret; | 589 | return ret; |
586 | } | 590 | } |
@@ -604,6 +608,7 @@ static int usbdev_release(struct inode *inode, struct file *file) | |||
604 | releaseintf(ps, ifnum); | 608 | releaseintf(ps, ifnum); |
605 | } | 609 | } |
606 | destroy_all_async(ps); | 610 | destroy_all_async(ps); |
611 | usb_autosuspend_device(dev, 1); | ||
607 | usb_unlock_device(dev); | 612 | usb_unlock_device(dev); |
608 | usb_put_dev(dev); | 613 | usb_put_dev(dev); |
609 | kfree(ps); | 614 | kfree(ps); |