onetouch.c (a9de18eb761f7c1c860964b2e5addc1a35c7e861) onetouch.c (9cfb95ef72c637bc9b90260e0f98a23f3f49b1bb)
1/*
2 * Support for the Maxtor OneTouch USB hard drive's button
3 *
4 * Current development and maintenance by:
5 * Copyright (c) 2005 Nick Sillik <n.sillik@temple.edu>
6 *
7 * Initial work by:
8 * Copyright (c) 2003 Erik Thyren <erth7411@student.uu.se>

--- 21 unchanged lines hidden (view full) ---

30
31#include <linux/kernel.h>
32#include <linux/input.h>
33#include <linux/init.h>
34#include <linux/slab.h>
35#include <linux/module.h>
36#include <linux/usb/input.h>
37#include "usb.h"
1/*
2 * Support for the Maxtor OneTouch USB hard drive's button
3 *
4 * Current development and maintenance by:
5 * Copyright (c) 2005 Nick Sillik <n.sillik@temple.edu>
6 *
7 * Initial work by:
8 * Copyright (c) 2003 Erik Thyren <erth7411@student.uu.se>

--- 21 unchanged lines hidden (view full) ---

30
31#include <linux/kernel.h>
32#include <linux/input.h>
33#include <linux/init.h>
34#include <linux/slab.h>
35#include <linux/module.h>
36#include <linux/usb/input.h>
37#include "usb.h"
38#include "onetouch.h"
39#include "debug.h"
40
38#include "debug.h"
39
40#define ONETOUCH_PKT_LEN 0x02
41#define ONETOUCH_BUTTON KEY_PROG1
42
43static int onetouch_connect_input(struct us_data *ss);
41static void onetouch_release_input(void *onetouch_);
42
43struct usb_onetouch {
44 char name[128];
45 char phys[64];
46 struct input_dev *dev; /* input device interface */
47 struct usb_device *udev; /* usb device */
48
49 struct urb *irq; /* urb for interrupt in report */
50 unsigned char *data; /* input data */
51 dma_addr_t data_dma;
52 unsigned int is_open:1;
53};
54
44static void onetouch_release_input(void *onetouch_);
45
46struct usb_onetouch {
47 char name[128];
48 char phys[64];
49 struct input_dev *dev; /* input device interface */
50 struct usb_device *udev; /* usb device */
51
52 struct urb *irq; /* urb for interrupt in report */
53 unsigned char *data; /* input data */
54 dma_addr_t data_dma;
55 unsigned int is_open:1;
56};
57
58
59/*
60 * The table of devices
61 */
62#define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
63 vendorName, productName, useProtocol, useTransport, \
64 initFunction, flags) \
65{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
66 .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
67
68struct usb_device_id onetouch_usb_ids[] = {
69# include "unusual_onetouch.h"
70 { } /* Terminating entry */
71};
72MODULE_DEVICE_TABLE(usb, onetouch_usb_ids);
73
74#undef UNUSUAL_DEV
75
76/*
77 * The flags table
78 */
79#define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
80 vendor_name, product_name, use_protocol, use_transport, \
81 init_function, Flags) \
82{ \
83 .vendorName = vendor_name, \
84 .productName = product_name, \
85 .useProtocol = use_protocol, \
86 .useTransport = use_transport, \
87 .initFunction = init_function, \
88}
89
90static struct us_unusual_dev onetouch_unusual_dev_list[] = {
91# include "unusual_onetouch.h"
92 { } /* Terminating entry */
93};
94
95#undef UNUSUAL_DEV
96
97
55static void usb_onetouch_irq(struct urb *urb)
56{
57 struct usb_onetouch *onetouch = urb->context;
58 signed char *data = onetouch->data;
59 struct input_dev *dev = onetouch->dev;
60 int status = urb->status;
61 int retval;
62

--- 59 unchanged lines hidden (view full) ---

122 break;
123 default:
124 break;
125 }
126 }
127}
128#endif /* CONFIG_PM */
129
98static void usb_onetouch_irq(struct urb *urb)
99{
100 struct usb_onetouch *onetouch = urb->context;
101 signed char *data = onetouch->data;
102 struct input_dev *dev = onetouch->dev;
103 int status = urb->status;
104 int retval;
105

--- 59 unchanged lines hidden (view full) ---

165 break;
166 default:
167 break;
168 }
169 }
170}
171#endif /* CONFIG_PM */
172
130int onetouch_connect_input(struct us_data *ss)
173static int onetouch_connect_input(struct us_data *ss)
131{
132 struct usb_device *udev = ss->pusb_dev;
133 struct usb_host_interface *interface;
134 struct usb_endpoint_descriptor *endpoint;
135 struct usb_onetouch *onetouch;
136 struct input_dev *input_dev;
137 int pipe, maxp;
138 int error = -ENOMEM;

--- 92 unchanged lines hidden (view full) ---

231 if (onetouch) {
232 usb_kill_urb(onetouch->irq);
233 input_unregister_device(onetouch->dev);
234 usb_free_urb(onetouch->irq);
235 usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN,
236 onetouch->data, onetouch->data_dma);
237 }
238}
174{
175 struct usb_device *udev = ss->pusb_dev;
176 struct usb_host_interface *interface;
177 struct usb_endpoint_descriptor *endpoint;
178 struct usb_onetouch *onetouch;
179 struct input_dev *input_dev;
180 int pipe, maxp;
181 int error = -ENOMEM;

--- 92 unchanged lines hidden (view full) ---

274 if (onetouch) {
275 usb_kill_urb(onetouch->irq);
276 input_unregister_device(onetouch->dev);
277 usb_free_urb(onetouch->irq);
278 usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN,
279 onetouch->data, onetouch->data_dma);
280 }
281}
282
283static int onetouch_probe(struct usb_interface *intf,
284 const struct usb_device_id *id)
285{
286 struct us_data *us;
287 int result;
288
289 result = usb_stor_probe1(&us, intf, id,
290 (id - onetouch_usb_ids) + onetouch_unusual_dev_list);
291 if (result)
292 return result;
293
294 /* Use default transport and protocol */
295
296 result = usb_stor_probe2(us);
297 return result;
298}
299
300static struct usb_driver onetouch_driver = {
301 .name = "ums-onetouch",
302 .probe = onetouch_probe,
303 .disconnect = usb_stor_disconnect,
304 .suspend = usb_stor_suspend,
305 .resume = usb_stor_resume,
306 .reset_resume = usb_stor_reset_resume,
307 .pre_reset = usb_stor_pre_reset,
308 .post_reset = usb_stor_post_reset,
309 .id_table = onetouch_usb_ids,
310 .soft_unbind = 1,
311};
312
313static int __init onetouch_init(void)
314{
315 return usb_register(&onetouch_driver);
316}
317
318static void __exit onetouch_exit(void)
319{
320 usb_deregister(&onetouch_driver);
321}
322
323module_init(onetouch_init);
324module_exit(onetouch_exit);