diff options
Diffstat (limited to 'drivers/usb/misc')
-rw-r--r-- | drivers/usb/misc/Kconfig | 10 | ||||
-rw-r--r-- | drivers/usb/misc/Makefile | 2 | ||||
-rw-r--r-- | drivers/usb/misc/adutux.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/appledisplay.c | 5 | ||||
-rw-r--r-- | drivers/usb/misc/auerswald.c | 9 | ||||
-rw-r--r-- | drivers/usb/misc/emi26.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/emi62.c | 3 | ||||
-rw-r--r-- | drivers/usb/misc/ftdi-elan.c | 56 | ||||
-rw-r--r-- | drivers/usb/misc/idmouse.c | 22 | ||||
-rw-r--r-- | drivers/usb/misc/legousbtower.c | 31 | ||||
-rw-r--r-- | drivers/usb/misc/phidgetkit.c | 5 | ||||
-rw-r--r-- | drivers/usb/misc/phidgetmotorcontrol.c | 5 | ||||
-rw-r--r-- | drivers/usb/misc/trancevibrator.c | 159 | ||||
-rw-r--r-- | drivers/usb/misc/usb_u132.h | 6 | ||||
-rw-r--r-- | drivers/usb/misc/usbtest.c | 4 |
15 files changed, 223 insertions, 100 deletions
diff --git a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig index c29658f69e2a..a74bf8617e7f 100644 --- a/drivers/usb/misc/Kconfig +++ b/drivers/usb/misc/Kconfig | |||
@@ -223,6 +223,16 @@ config USB_LD | |||
223 | To compile this driver as a module, choose M here: the | 223 | To compile this driver as a module, choose M here: the |
224 | module will be called ldusb. | 224 | module will be called ldusb. |
225 | 225 | ||
226 | config USB_TRANCEVIBRATOR | ||
227 | tristate "PlayStation 2 Trance Vibrator driver support" | ||
228 | depends on USB | ||
229 | help | ||
230 | Say Y here if you want to connect a PlayStation 2 Trance Vibrator | ||
231 | device to your computer's USB port. | ||
232 | |||
233 | To compile this driver as a module, choose M here: the | ||
234 | module will be called trancevibrator. | ||
235 | |||
226 | config USB_TEST | 236 | config USB_TEST |
227 | tristate "USB testing driver (DEVELOPMENT)" | 237 | tristate "USB testing driver (DEVELOPMENT)" |
228 | depends on USB && USB_DEVICEFS && EXPERIMENTAL | 238 | depends on USB && USB_DEVICEFS && EXPERIMENTAL |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 2be70fa259bf..2cba07d31971 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o | 6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o |
7 | obj-$(CONFIG_USB_APPLEDISPLAY) += appledisplay.o | ||
7 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o | 8 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o |
8 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o | 9 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o |
9 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o | 10 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o |
@@ -21,6 +22,7 @@ obj-$(CONFIG_USB_PHIDGETMOTORCONTROL) += phidgetmotorcontrol.o | |||
21 | obj-$(CONFIG_USB_PHIDGETSERVO) += phidgetservo.o | 22 | obj-$(CONFIG_USB_PHIDGETSERVO) += phidgetservo.o |
22 | obj-$(CONFIG_USB_RIO500) += rio500.o | 23 | obj-$(CONFIG_USB_RIO500) += rio500.o |
23 | obj-$(CONFIG_USB_TEST) += usbtest.o | 24 | obj-$(CONFIG_USB_TEST) += usbtest.o |
25 | obj-$(CONFIG_USB_TRANCEVIBRATOR) += trancevibrator.o | ||
24 | obj-$(CONFIG_USB_USS720) += uss720.o | 26 | obj-$(CONFIG_USB_USS720) += uss720.o |
25 | 27 | ||
26 | obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ | 28 | obj-$(CONFIG_USB_SISUSBVGA) += sisusbvga/ |
diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c index aecd633fe9f6..af2934e016a7 100644 --- a/drivers/usb/misc/adutux.c +++ b/drivers/usb/misc/adutux.c | |||
@@ -370,7 +370,8 @@ static int adu_release(struct inode *inode, struct file *file) | |||
370 | retval = adu_release_internal(dev); | 370 | retval = adu_release_internal(dev); |
371 | 371 | ||
372 | exit: | 372 | exit: |
373 | up(&dev->sem); | 373 | if (dev) |
374 | up(&dev->sem); | ||
374 | dbg(2," %s : leave, return value %d", __FUNCTION__, retval); | 375 | dbg(2," %s : leave, return value %d", __FUNCTION__, retval); |
375 | return retval; | 376 | return retval; |
376 | } | 377 | } |
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c index 6b23a1def9fe..ba30ca6a14aa 100644 --- a/drivers/usb/misc/appledisplay.c +++ b/drivers/usb/misc/appledisplay.c | |||
@@ -216,10 +216,7 @@ static int appledisplay_probe(struct usb_interface *iface, | |||
216 | iface_desc = iface->cur_altsetting; | 216 | iface_desc = iface->cur_altsetting; |
217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { | 217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { |
218 | endpoint = &iface_desc->endpoint[i].desc; | 218 | endpoint = &iface_desc->endpoint[i].desc; |
219 | if (!int_in_endpointAddr && | 219 | if (!int_in_endpointAddr && usb_endpoint_is_int_in(endpoint)) { |
220 | (endpoint->bEndpointAddress & USB_DIR_IN) && | ||
221 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
222 | USB_ENDPOINT_XFER_INT)) { | ||
223 | /* we found an interrupt in endpoint */ | 220 | /* we found an interrupt in endpoint */ |
224 | int_in_endpointAddr = endpoint->bEndpointAddress; | 221 | int_in_endpointAddr = endpoint->bEndpointAddress; |
225 | break; | 222 | break; |
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 0be9d62d62ae..c703f73e1655 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
@@ -704,9 +704,7 @@ static void auerbuf_free (pauerbuf_t bp) | |||
704 | { | 704 | { |
705 | kfree(bp->bufp); | 705 | kfree(bp->bufp); |
706 | kfree(bp->dr); | 706 | kfree(bp->dr); |
707 | if (bp->urbp) { | 707 | usb_free_urb(bp->urbp); |
708 | usb_free_urb(bp->urbp); | ||
709 | } | ||
710 | kfree(bp); | 708 | kfree(bp); |
711 | } | 709 | } |
712 | 710 | ||
@@ -780,7 +778,7 @@ static int auerbuf_setup (pauerbufctl_t bcp, unsigned int numElements, unsigned | |||
780 | 778 | ||
781 | bl_fail:/* not enough memory. Free allocated elements */ | 779 | bl_fail:/* not enough memory. Free allocated elements */ |
782 | dbg ("auerbuf_setup: no more memory"); | 780 | dbg ("auerbuf_setup: no more memory"); |
783 | kfree(bep); | 781 | auerbuf_free(bep); |
784 | auerbuf_free_buffers (bcp); | 782 | auerbuf_free_buffers (bcp); |
785 | return -ENOMEM; | 783 | return -ENOMEM; |
786 | } | 784 | } |
@@ -1155,8 +1153,7 @@ static void auerswald_int_release (pauerswald_t cp) | |||
1155 | dbg ("auerswald_int_release"); | 1153 | dbg ("auerswald_int_release"); |
1156 | 1154 | ||
1157 | /* stop the int endpoint */ | 1155 | /* stop the int endpoint */ |
1158 | if (cp->inturbp) | 1156 | usb_kill_urb (cp->inturbp); |
1159 | usb_kill_urb (cp->inturbp); | ||
1160 | 1157 | ||
1161 | /* deallocate memory */ | 1158 | /* deallocate memory */ |
1162 | auerswald_int_free (cp); | 1159 | auerswald_int_free (cp); |
diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index 1fd9cb85f4ca..5c0a26cbd128 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c | |||
@@ -53,13 +53,12 @@ static void __exit emi26_exit (void); | |||
53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
54 | { | 54 | { |
55 | int result; | 55 | int result; |
56 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 56 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
57 | 57 | ||
58 | if (!buffer) { | 58 | if (!buffer) { |
59 | err("emi26: kmalloc(%d) failed.", length); | 59 | err("emi26: kmalloc(%d) failed.", length); |
60 | return -ENOMEM; | 60 | return -ENOMEM; |
61 | } | 61 | } |
62 | memcpy (buffer, data, length); | ||
63 | /* Note: usb_control_msg returns negative value on error or length of the | 62 | /* Note: usb_control_msg returns negative value on error or length of the |
64 | * data that was written! */ | 63 | * data that was written! */ |
65 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 64 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index fe351371f274..23153eac0dfa 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c | |||
@@ -61,13 +61,12 @@ static void __exit emi62_exit (void); | |||
61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
62 | { | 62 | { |
63 | int result; | 63 | int result; |
64 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 64 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
65 | 65 | ||
66 | if (!buffer) { | 66 | if (!buffer) { |
67 | err("emi62: kmalloc(%d) failed.", length); | 67 | err("emi62: kmalloc(%d) failed.", length); |
68 | return -ENOMEM; | 68 | return -ENOMEM; |
69 | } | 69 | } |
70 | memcpy (buffer, data, length); | ||
71 | /* Note: usb_control_msg returns negative value on error or length of the | 70 | /* Note: usb_control_msg returns negative value on error or length of the |
72 | * data that was written! */ | 71 | * data that was written! */ |
73 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 72 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index 0eb26a26115b..cb0ba3107d7f 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
@@ -303,7 +303,7 @@ void ftdi_elan_gone_away(struct platform_device *pdev) | |||
303 | 303 | ||
304 | 304 | ||
305 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); | 305 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); |
306 | void ftdi_release_platform_dev(struct device *dev) | 306 | static void ftdi_release_platform_dev(struct device *dev) |
307 | { | 307 | { |
308 | dev->parent = NULL; | 308 | dev->parent = NULL; |
309 | } | 309 | } |
@@ -513,8 +513,6 @@ static void ftdi_elan_respond_work(void *data) | |||
513 | ftdi->disconnected += 1; | 513 | ftdi->disconnected += 1; |
514 | } else if (retval == -ENODEV) { | 514 | } else if (retval == -ENODEV) { |
515 | ftdi->disconnected += 1; | 515 | ftdi->disconnected += 1; |
516 | } else if (retval == -ENODEV) { | ||
517 | ftdi->disconnected += 1; | ||
518 | } else if (retval == -EILSEQ) { | 516 | } else if (retval == -EILSEQ) { |
519 | ftdi->disconnected += 1; | 517 | ftdi->disconnected += 1; |
520 | } else { | 518 | } else { |
@@ -1186,11 +1184,8 @@ static ssize_t ftdi_elan_write(struct file *file, | |||
1186 | int retval = 0; | 1184 | int retval = 0; |
1187 | struct urb *urb; | 1185 | struct urb *urb; |
1188 | char *buf; | 1186 | char *buf; |
1189 | char data[30 *3 + 4]; | 1187 | struct usb_ftdi *ftdi = file->private_data; |
1190 | char *d = data; | 1188 | |
1191 | const char __user *s = user_buffer; | ||
1192 | int m = (sizeof(data) - 1) / 3; | ||
1193 | struct usb_ftdi *ftdi = (struct usb_ftdi *)file->private_data; | ||
1194 | if (ftdi->disconnected > 0) { | 1189 | if (ftdi->disconnected > 0) { |
1195 | return -ENODEV; | 1190 | return -ENODEV; |
1196 | } | 1191 | } |
@@ -1220,27 +1215,18 @@ static ssize_t ftdi_elan_write(struct file *file, | |||
1220 | if (retval) { | 1215 | if (retval) { |
1221 | dev_err(&ftdi->udev->dev, "failed submitting write urb, error %" | 1216 | dev_err(&ftdi->udev->dev, "failed submitting write urb, error %" |
1222 | "d\n", retval); | 1217 | "d\n", retval); |
1223 | goto error_4; | 1218 | goto error_3; |
1224 | } | 1219 | } |
1225 | usb_free_urb(urb); | 1220 | usb_free_urb(urb); |
1226 | exit:; | 1221 | |
1227 | if (count > m) { | 1222 | exit: |
1228 | int I = m - 1; | ||
1229 | while (I-- > 0) { | ||
1230 | d += sprintf(d, " %02X", 0x000000FF & *s++); | ||
1231 | } | ||
1232 | d += sprintf(d, " .."); | ||
1233 | } else { | ||
1234 | int I = count; | ||
1235 | while (I-- > 0) { | ||
1236 | d += sprintf(d, " %02X", 0x000000FF & *s++); | ||
1237 | } | ||
1238 | } | ||
1239 | return count; | 1223 | return count; |
1240 | error_4: error_3:usb_buffer_free(ftdi->udev, count, buf, | 1224 | error_3: |
1241 | urb->transfer_dma); | 1225 | usb_buffer_free(ftdi->udev, count, buf, urb->transfer_dma); |
1242 | error_2:usb_free_urb(urb); | 1226 | error_2: |
1243 | error_1:return retval; | 1227 | usb_free_urb(urb); |
1228 | error_1: | ||
1229 | return retval; | ||
1244 | } | 1230 | } |
1245 | 1231 | ||
1246 | static struct file_operations ftdi_elan_fops = { | 1232 | static struct file_operations ftdi_elan_fops = { |
@@ -1440,14 +1426,6 @@ static int ftdi_elan_read_reg(struct usb_ftdi *ftdi, u32 *data) | |||
1440 | } | 1426 | } |
1441 | } | 1427 | } |
1442 | 1428 | ||
1443 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data) | ||
1444 | { | ||
1445 | struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev); | ||
1446 | return ftdi_elan_read_reg(ftdi, data); | ||
1447 | } | ||
1448 | |||
1449 | |||
1450 | EXPORT_SYMBOL_GPL(usb_ftdi_elan_read_reg); | ||
1451 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, | 1429 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, |
1452 | u8 width, u32 *data) | 1430 | u8 width, u32 *data) |
1453 | { | 1431 | { |
@@ -2647,10 +2625,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2647 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 2625 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
2648 | endpoint = &iface_desc->endpoint[i].desc; | 2626 | endpoint = &iface_desc->endpoint[i].desc; |
2649 | if (!ftdi->bulk_in_endpointAddr && | 2627 | if (!ftdi->bulk_in_endpointAddr && |
2650 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2628 | usb_endpoint_is_bulk_in(endpoint)) { |
2651 | == USB_DIR_IN) && ((endpoint->bmAttributes & | ||
2652 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2653 | { | ||
2654 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | 2629 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
2655 | ftdi->bulk_in_size = buffer_size; | 2630 | ftdi->bulk_in_size = buffer_size; |
2656 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; | 2631 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; |
@@ -2663,10 +2638,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2663 | } | 2638 | } |
2664 | } | 2639 | } |
2665 | if (!ftdi->bulk_out_endpointAddr && | 2640 | if (!ftdi->bulk_out_endpointAddr && |
2666 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2641 | usb_endpoint_is_bulk_out(endpoint)) { |
2667 | == USB_DIR_OUT) && ((endpoint->bmAttributes & | ||
2668 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2669 | { | ||
2670 | ftdi->bulk_out_endpointAddr = | 2642 | ftdi->bulk_out_endpointAddr = |
2671 | endpoint->bEndpointAddress; | 2643 | endpoint->bEndpointAddress; |
2672 | } | 2644 | } |
diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index 8e6e195a22ba..c9418535bef8 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c | |||
@@ -125,12 +125,12 @@ static DEFINE_MUTEX(disconnect_mutex); | |||
125 | 125 | ||
126 | static int idmouse_create_image(struct usb_idmouse *dev) | 126 | static int idmouse_create_image(struct usb_idmouse *dev) |
127 | { | 127 | { |
128 | int bytes_read = 0; | 128 | int bytes_read; |
129 | int bulk_read = 0; | 129 | int bulk_read; |
130 | int result = 0; | 130 | int result; |
131 | 131 | ||
132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); | 132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); |
133 | bytes_read += sizeof(HEADER)-1; | 133 | bytes_read = sizeof(HEADER)-1; |
134 | 134 | ||
135 | /* reset the device and set a fast blink rate */ | 135 | /* reset the device and set a fast blink rate */ |
136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); | 136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); |
@@ -208,9 +208,9 @@ static inline void idmouse_delete(struct usb_idmouse *dev) | |||
208 | 208 | ||
209 | static int idmouse_open(struct inode *inode, struct file *file) | 209 | static int idmouse_open(struct inode *inode, struct file *file) |
210 | { | 210 | { |
211 | struct usb_idmouse *dev = NULL; | 211 | struct usb_idmouse *dev; |
212 | struct usb_interface *interface; | 212 | struct usb_interface *interface; |
213 | int result = 0; | 213 | int result; |
214 | 214 | ||
215 | /* prevent disconnects */ | 215 | /* prevent disconnects */ |
216 | mutex_lock(&disconnect_mutex); | 216 | mutex_lock(&disconnect_mutex); |
@@ -305,7 +305,7 @@ static ssize_t idmouse_read(struct file *file, char __user *buffer, size_t count | |||
305 | loff_t * ppos) | 305 | loff_t * ppos) |
306 | { | 306 | { |
307 | struct usb_idmouse *dev; | 307 | struct usb_idmouse *dev; |
308 | int result = 0; | 308 | int result; |
309 | 309 | ||
310 | dev = (struct usb_idmouse *) file->private_data; | 310 | dev = (struct usb_idmouse *) file->private_data; |
311 | 311 | ||
@@ -329,7 +329,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
329 | const struct usb_device_id *id) | 329 | const struct usb_device_id *id) |
330 | { | 330 | { |
331 | struct usb_device *udev = interface_to_usbdev(interface); | 331 | struct usb_device *udev = interface_to_usbdev(interface); |
332 | struct usb_idmouse *dev = NULL; | 332 | struct usb_idmouse *dev; |
333 | struct usb_host_interface *iface_desc; | 333 | struct usb_host_interface *iface_desc; |
334 | struct usb_endpoint_descriptor *endpoint; | 334 | struct usb_endpoint_descriptor *endpoint; |
335 | int result; | 335 | int result; |
@@ -350,11 +350,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
350 | 350 | ||
351 | /* set up the endpoint information - use only the first bulk-in endpoint */ | 351 | /* set up the endpoint information - use only the first bulk-in endpoint */ |
352 | endpoint = &iface_desc->endpoint[0].desc; | 352 | endpoint = &iface_desc->endpoint[0].desc; |
353 | if (!dev->bulk_in_endpointAddr | 353 | if (!dev->bulk_in_endpointAddr && usb_endpoint_is_bulk_in(endpoint)) { |
354 | && (endpoint->bEndpointAddress & USB_DIR_IN) | ||
355 | && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
356 | USB_ENDPOINT_XFER_BULK)) { | ||
357 | |||
358 | /* we found a bulk in endpoint */ | 354 | /* we found a bulk in endpoint */ |
359 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); | 355 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); |
360 | dev->bulk_in_size = 0x200; /* works _much_ faster */ | 356 | dev->bulk_in_size = 0x200; /* works _much_ faster */ |
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 27089497e717..5dce797bddb7 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c | |||
@@ -317,12 +317,8 @@ static inline void tower_delete (struct lego_usb_tower *dev) | |||
317 | tower_abort_transfers (dev); | 317 | tower_abort_transfers (dev); |
318 | 318 | ||
319 | /* free data structures */ | 319 | /* free data structures */ |
320 | if (dev->interrupt_in_urb != NULL) { | 320 | usb_free_urb(dev->interrupt_in_urb); |
321 | usb_free_urb (dev->interrupt_in_urb); | 321 | usb_free_urb(dev->interrupt_out_urb); |
322 | } | ||
323 | if (dev->interrupt_out_urb != NULL) { | ||
324 | usb_free_urb (dev->interrupt_out_urb); | ||
325 | } | ||
326 | kfree (dev->read_buffer); | 322 | kfree (dev->read_buffer); |
327 | kfree (dev->interrupt_in_buffer); | 323 | kfree (dev->interrupt_in_buffer); |
328 | kfree (dev->interrupt_out_buffer); | 324 | kfree (dev->interrupt_out_buffer); |
@@ -502,15 +498,11 @@ static void tower_abort_transfers (struct lego_usb_tower *dev) | |||
502 | if (dev->interrupt_in_running) { | 498 | if (dev->interrupt_in_running) { |
503 | dev->interrupt_in_running = 0; | 499 | dev->interrupt_in_running = 0; |
504 | mb(); | 500 | mb(); |
505 | if (dev->interrupt_in_urb != NULL && dev->udev) { | 501 | if (dev->udev) |
506 | usb_kill_urb (dev->interrupt_in_urb); | 502 | usb_kill_urb (dev->interrupt_in_urb); |
507 | } | ||
508 | } | ||
509 | if (dev->interrupt_out_busy) { | ||
510 | if (dev->interrupt_out_urb != NULL && dev->udev) { | ||
511 | usb_kill_urb (dev->interrupt_out_urb); | ||
512 | } | ||
513 | } | 503 | } |
504 | if (dev->interrupt_out_busy && dev->udev) | ||
505 | usb_kill_urb(dev->interrupt_out_urb); | ||
514 | 506 | ||
515 | exit: | 507 | exit: |
516 | dbg(2, "%s: leave", __FUNCTION__); | 508 | dbg(2, "%s: leave", __FUNCTION__); |
@@ -898,14 +890,11 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device | |||
898 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 890 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
899 | endpoint = &iface_desc->endpoint[i].desc; | 891 | endpoint = &iface_desc->endpoint[i].desc; |
900 | 892 | ||
901 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | 893 | if (usb_endpoint_xfer_int(endpoint)) { |
902 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | 894 | if (usb_endpoint_dir_in(endpoint)) |
903 | dev->interrupt_in_endpoint = endpoint; | 895 | dev->interrupt_in_endpoint = endpoint; |
904 | } | 896 | else |
905 | 897 | dev->interrupt_out_endpoint = endpoint; | |
906 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | ||
907 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
908 | dev->interrupt_out_endpoint = endpoint; | ||
909 | } | 898 | } |
910 | } | 899 | } |
911 | if(dev->interrupt_in_endpoint == NULL) { | 900 | if(dev->interrupt_in_endpoint == NULL) { |
diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c index abb4dcd811ac..9110793f81d3 100644 --- a/drivers/usb/misc/phidgetkit.c +++ b/drivers/usb/misc/phidgetkit.c | |||
@@ -551,7 +551,7 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic | |||
551 | return -ENODEV; | 551 | return -ENODEV; |
552 | 552 | ||
553 | endpoint = &interface->endpoint[0].desc; | 553 | endpoint = &interface->endpoint[0].desc; |
554 | if (!(endpoint->bEndpointAddress & 0x80)) | 554 | if (!usb_endpoint_dir_in(endpoint)) |
555 | return -ENODEV; | 555 | return -ENODEV; |
556 | /* | 556 | /* |
557 | * bmAttributes | 557 | * bmAttributes |
@@ -650,8 +650,7 @@ out2: | |||
650 | device_remove_file(kit->dev, &dev_output_attrs[i]); | 650 | device_remove_file(kit->dev, &dev_output_attrs[i]); |
651 | out: | 651 | out: |
652 | if (kit) { | 652 | if (kit) { |
653 | if (kit->irq) | 653 | usb_free_urb(kit->irq); |
654 | usb_free_urb(kit->irq); | ||
655 | if (kit->data) | 654 | if (kit->data) |
656 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); | 655 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); |
657 | if (kit->dev) | 656 | if (kit->dev) |
diff --git a/drivers/usb/misc/phidgetmotorcontrol.c b/drivers/usb/misc/phidgetmotorcontrol.c index 5c780cab92e0..c3469b0a67c2 100644 --- a/drivers/usb/misc/phidgetmotorcontrol.c +++ b/drivers/usb/misc/phidgetmotorcontrol.c | |||
@@ -323,7 +323,7 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic | |||
323 | return -ENODEV; | 323 | return -ENODEV; |
324 | 324 | ||
325 | endpoint = &interface->endpoint[0].desc; | 325 | endpoint = &interface->endpoint[0].desc; |
326 | if (!(endpoint->bEndpointAddress & 0x80)) | 326 | if (!usb_endpoint_dir_in(endpoint)) |
327 | return -ENODEV; | 327 | return -ENODEV; |
328 | 328 | ||
329 | /* | 329 | /* |
@@ -392,8 +392,7 @@ out2: | |||
392 | device_remove_file(mc->dev, &dev_attrs[i]); | 392 | device_remove_file(mc->dev, &dev_attrs[i]); |
393 | out: | 393 | out: |
394 | if (mc) { | 394 | if (mc) { |
395 | if (mc->irq) | 395 | usb_free_urb(mc->irq); |
396 | usb_free_urb(mc->irq); | ||
397 | if (mc->data) | 396 | if (mc->data) |
398 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); | 397 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); |
399 | if (mc->dev) | 398 | if (mc->dev) |
diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c new file mode 100644 index 000000000000..33cd91d11eca --- /dev/null +++ b/drivers/usb/misc/trancevibrator.c | |||
@@ -0,0 +1,159 @@ | |||
1 | /* | ||
2 | * PlayStation 2 Trance Vibrator driver | ||
3 | * | ||
4 | * Copyright (C) 2006 Sam Hocevar <sam@zoy.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
19 | */ | ||
20 | |||
21 | /* Standard include files */ | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/errno.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/usb.h> | ||
27 | |||
28 | /* Version Information */ | ||
29 | #define DRIVER_VERSION "v1.1" | ||
30 | #define DRIVER_AUTHOR "Sam Hocevar, sam@zoy.org" | ||
31 | #define DRIVER_DESC "PlayStation 2 Trance Vibrator driver" | ||
32 | |||
33 | #define TRANCEVIBRATOR_VENDOR_ID 0x0b49 /* ASCII Corporation */ | ||
34 | #define TRANCEVIBRATOR_PRODUCT_ID 0x064f /* Trance Vibrator */ | ||
35 | |||
36 | static struct usb_device_id id_table [] = { | ||
37 | { USB_DEVICE(TRANCEVIBRATOR_VENDOR_ID, TRANCEVIBRATOR_PRODUCT_ID) }, | ||
38 | { }, | ||
39 | }; | ||
40 | MODULE_DEVICE_TABLE (usb, id_table); | ||
41 | |||
42 | /* Driver-local specific stuff */ | ||
43 | struct trancevibrator { | ||
44 | struct usb_device *udev; | ||
45 | unsigned int speed; | ||
46 | }; | ||
47 | |||
48 | static ssize_t show_speed(struct device *dev, struct device_attribute *attr, | ||
49 | char *buf) | ||
50 | { | ||
51 | struct usb_interface *intf = to_usb_interface(dev); | ||
52 | struct trancevibrator *tv = usb_get_intfdata(intf); | ||
53 | |||
54 | return sprintf(buf, "%d\n", tv->speed); | ||
55 | } | ||
56 | |||
57 | static ssize_t set_speed(struct device *dev, struct device_attribute *attr, | ||
58 | const char *buf, size_t count) | ||
59 | { | ||
60 | struct usb_interface *intf = to_usb_interface(dev); | ||
61 | struct trancevibrator *tv = usb_get_intfdata(intf); | ||
62 | int temp, retval; | ||
63 | |||
64 | temp = simple_strtoul(buf, NULL, 10); | ||
65 | if (temp > 255) | ||
66 | temp = 255; | ||
67 | else if (temp < 0) | ||
68 | temp = 0; | ||
69 | tv->speed = temp; | ||
70 | |||
71 | dev_dbg(&tv->udev->dev, "speed = %d\n", tv->speed); | ||
72 | |||
73 | /* Set speed */ | ||
74 | retval = usb_control_msg(tv->udev, usb_sndctrlpipe(tv->udev, 0), | ||
75 | 0x01, /* vendor request: set speed */ | ||
76 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, | ||
77 | tv->speed, /* speed value */ | ||
78 | 0, NULL, 0, USB_CTRL_GET_TIMEOUT); | ||
79 | if (retval) { | ||
80 | dev_dbg(&tv->udev->dev, "retval = %d\n", retval); | ||
81 | return retval; | ||
82 | } | ||
83 | return count; | ||
84 | } | ||
85 | |||
86 | static DEVICE_ATTR(speed, S_IWUGO | S_IRUGO, show_speed, set_speed); | ||
87 | |||
88 | static int tv_probe(struct usb_interface *interface, | ||
89 | const struct usb_device_id *id) | ||
90 | { | ||
91 | struct usb_device *udev = interface_to_usbdev(interface); | ||
92 | struct trancevibrator *dev; | ||
93 | int retval; | ||
94 | |||
95 | dev = kzalloc(sizeof(struct trancevibrator), GFP_KERNEL); | ||
96 | if (dev == NULL) { | ||
97 | dev_err(&interface->dev, "Out of memory\n"); | ||
98 | retval = -ENOMEM; | ||
99 | goto error; | ||
100 | } | ||
101 | |||
102 | dev->udev = usb_get_dev(udev); | ||
103 | usb_set_intfdata(interface, dev); | ||
104 | retval = device_create_file(&interface->dev, &dev_attr_speed); | ||
105 | if (retval) | ||
106 | goto error_create_file; | ||
107 | |||
108 | return 0; | ||
109 | |||
110 | error_create_file: | ||
111 | usb_put_dev(udev); | ||
112 | usb_set_intfdata(interface, NULL); | ||
113 | error: | ||
114 | kfree(dev); | ||
115 | return retval; | ||
116 | } | ||
117 | |||
118 | static void tv_disconnect(struct usb_interface *interface) | ||
119 | { | ||
120 | struct trancevibrator *dev; | ||
121 | |||
122 | dev = usb_get_intfdata (interface); | ||
123 | usb_set_intfdata(interface, NULL); | ||
124 | device_remove_file(&interface->dev, &dev_attr_speed); | ||
125 | usb_put_dev(dev->udev); | ||
126 | kfree(dev); | ||
127 | } | ||
128 | |||
129 | /* USB subsystem object */ | ||
130 | static struct usb_driver tv_driver = { | ||
131 | .name = "trancevibrator", | ||
132 | .probe = tv_probe, | ||
133 | .disconnect = tv_disconnect, | ||
134 | .id_table = id_table, | ||
135 | }; | ||
136 | |||
137 | static int __init tv_init(void) | ||
138 | { | ||
139 | int retval = usb_register(&tv_driver); | ||
140 | if (retval) { | ||
141 | err("usb_register failed. Error number %d", retval); | ||
142 | return retval; | ||
143 | } | ||
144 | |||
145 | info(DRIVER_VERSION ":" DRIVER_DESC); | ||
146 | return 0; | ||
147 | } | ||
148 | |||
149 | static void __exit tv_exit(void) | ||
150 | { | ||
151 | usb_deregister(&tv_driver); | ||
152 | } | ||
153 | |||
154 | module_init (tv_init); | ||
155 | module_exit (tv_exit); | ||
156 | |||
157 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
158 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
159 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/misc/usb_u132.h b/drivers/usb/misc/usb_u132.h index 551ba8906d62..dc2e5a31caec 100644 --- a/drivers/usb/misc/usb_u132.h +++ b/drivers/usb/misc/usb_u132.h | |||
@@ -52,7 +52,7 @@ | |||
52 | * the kernel to load the "u132-hcd" module. | 52 | * the kernel to load the "u132-hcd" module. |
53 | * | 53 | * |
54 | * The "ftdi-u132" module provides the interface to the inserted | 54 | * The "ftdi-u132" module provides the interface to the inserted |
55 | * PC card and the "u132-hcd" module uses the API to send and recieve | 55 | * PC card and the "u132-hcd" module uses the API to send and receive |
56 | * data. The API features call-backs, so that part of the "u132-hcd" | 56 | * data. The API features call-backs, so that part of the "u132-hcd" |
57 | * module code will run in the context of one of the kernel threads | 57 | * module code will run in the context of one of the kernel threads |
58 | * of the "ftdi-u132" module. | 58 | * of the "ftdi-u132" module. |
@@ -95,3 +95,7 @@ int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number, | |||
95 | int halted, int skipped, int actual, int non_null)); | 95 | int halted, int skipped, int actual, int non_null)); |
96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, | 96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, |
97 | void *endp); | 97 | void *endp); |
98 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, int mem_offset, | ||
99 | u8 width, u32 *data); | ||
100 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, int mem_offset, | ||
101 | u8 width, u32 data); | ||
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 7c2cbdf81d20..194065dbb51f 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -138,7 +138,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
138 | default: | 138 | default: |
139 | continue; | 139 | continue; |
140 | } | 140 | } |
141 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 141 | if (usb_endpoint_dir_in(&e->desc)) { |
142 | if (!in) | 142 | if (!in) |
143 | in = e; | 143 | in = e; |
144 | } else { | 144 | } else { |
@@ -147,7 +147,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
147 | } | 147 | } |
148 | continue; | 148 | continue; |
149 | try_iso: | 149 | try_iso: |
150 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 150 | if (usb_endpoint_dir_in(&e->desc)) { |
151 | if (!iso_in) | 151 | if (!iso_in) |
152 | iso_in = e; | 152 | iso_in = e; |
153 | } else { | 153 | } else { |