diff options
author | Alan Stern <stern@rowland.harvard.edu> | 2008-11-04 11:29:27 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-07 12:59:52 -0500 |
commit | 011b15df465745474e3ec85482633685933ed5a7 (patch) | |
tree | 97df5cb516672f0a6fae5b993840beb667c76bd0 /drivers/hid | |
parent | 857cc4dfb6420ec0a67b3cda559aaa7c429ddce7 (diff) |
USB: change interface to usb_lock_device_for_reset()
This patch (as1161) changes the interface to
usb_lock_device_for_reset(). The existing interface is apparently not
very clear, judging from the fact that several of its callers don't
use it correctly. The new interface always returns 0 for success and
it always requires the caller to unlock the device afterward.
The new routine will not return immediately if it is called while the
driver's probe method is running. Instead it will wait until the
probe is over and the device has been unlocked. This shouldn't cause
any problems; I don't know of any cases where drivers call
usb_lock_device_for_reset() during probe.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Cc: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/hid')
-rw-r--r-- | drivers/hid/usbhid/hid-core.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 03cb494af1c5..f0a0f72238ab 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c | |||
@@ -102,7 +102,7 @@ static void hid_reset(struct work_struct *work) | |||
102 | struct usbhid_device *usbhid = | 102 | struct usbhid_device *usbhid = |
103 | container_of(work, struct usbhid_device, reset_work); | 103 | container_of(work, struct usbhid_device, reset_work); |
104 | struct hid_device *hid = usbhid->hid; | 104 | struct hid_device *hid = usbhid->hid; |
105 | int rc_lock, rc = 0; | 105 | int rc = 0; |
106 | 106 | ||
107 | if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) { | 107 | if (test_bit(HID_CLEAR_HALT, &usbhid->iofl)) { |
108 | dev_dbg(&usbhid->intf->dev, "clear halt\n"); | 108 | dev_dbg(&usbhid->intf->dev, "clear halt\n"); |
@@ -113,11 +113,10 @@ static void hid_reset(struct work_struct *work) | |||
113 | 113 | ||
114 | else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) { | 114 | else if (test_bit(HID_RESET_PENDING, &usbhid->iofl)) { |
115 | dev_dbg(&usbhid->intf->dev, "resetting device\n"); | 115 | dev_dbg(&usbhid->intf->dev, "resetting device\n"); |
116 | rc = rc_lock = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf); | 116 | rc = usb_lock_device_for_reset(hid_to_usb_dev(hid), usbhid->intf); |
117 | if (rc_lock >= 0) { | 117 | if (rc == 0) { |
118 | rc = usb_reset_device(hid_to_usb_dev(hid)); | 118 | rc = usb_reset_device(hid_to_usb_dev(hid)); |
119 | if (rc_lock) | 119 | usb_unlock_device(hid_to_usb_dev(hid)); |
120 | usb_unlock_device(hid_to_usb_dev(hid)); | ||
121 | } | 120 | } |
122 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); | 121 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); |
123 | } | 122 | } |