2 * Support for the Maxtor OneTouch USB hard drive's button
4 * Current development and maintenance by:
5 * Copyright (c) 2005 Nick Sillik <n.sillik@temple.edu>
8 * Copyright (c) 2003 Erik Thyren <erth7411@student.uu.se>
10 * Based on usbmouse.c (Vojtech Pavlik) and xpad.c (Marko Friedemann)
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <linux/config.h>
32 #include <linux/kernel.h>
33 #include <linux/input.h>
34 #include <linux/init.h>
35 #include <linux/slab.h>
36 #include <linux/module.h>
37 #include <linux/usb.h>
38 #include <linux/usb_ch9.h>
39 #include <linux/usb_input.h>
44 void onetouch_release_input(void *onetouch_
);
49 struct input_dev dev
; /* input device interface */
50 struct usb_device
*udev
; /* usb device */
52 struct urb
*irq
; /* urb for interrupt in report */
53 unsigned char *data
; /* input data */
57 static void usb_onetouch_irq(struct urb
*urb
, struct pt_regs
*regs
)
59 struct usb_onetouch
*onetouch
= urb
->context
;
60 signed char *data
= onetouch
->data
;
61 struct input_dev
*dev
= &onetouch
->dev
;
64 switch (urb
->status
) {
67 case -ECONNRESET
: /* unlink */
71 /* -EPIPE: should clear the halt */
76 input_regs(dev
, regs
);
78 input_report_key(&onetouch
->dev
, ONETOUCH_BUTTON
,
83 status
= usb_submit_urb (urb
, SLAB_ATOMIC
);
85 err ("can't resubmit intr, %s-%s/input0, status %d",
86 onetouch
->udev
->bus
->bus_name
,
87 onetouch
->udev
->devpath
, status
);
90 static int usb_onetouch_open(struct input_dev
*dev
)
92 struct usb_onetouch
*onetouch
= dev
->private;
94 onetouch
->irq
->dev
= onetouch
->udev
;
95 if (usb_submit_urb(onetouch
->irq
, GFP_KERNEL
)) {
96 err("usb_submit_urb failed");
103 static void usb_onetouch_close(struct input_dev
*dev
)
105 struct usb_onetouch
*onetouch
= dev
->private;
107 usb_kill_urb(onetouch
->irq
);
110 int onetouch_connect_input(struct us_data
*ss
)
112 struct usb_device
*udev
= ss
->pusb_dev
;
113 struct usb_host_interface
*interface
;
114 struct usb_endpoint_descriptor
*endpoint
;
115 struct usb_onetouch
*onetouch
;
119 interface
= ss
->pusb_intf
->cur_altsetting
;
121 if (interface
->desc
.bNumEndpoints
!= 3)
124 endpoint
= &interface
->endpoint
[2].desc
;
125 if(!(endpoint
->bEndpointAddress
& USB_DIR_IN
))
127 if((endpoint
->bmAttributes
& USB_ENDPOINT_XFERTYPE_MASK
)
128 != USB_ENDPOINT_XFER_INT
)
131 pipe
= usb_rcvintpipe(udev
, endpoint
->bEndpointAddress
);
132 maxp
= usb_maxpacket(udev
, pipe
, usb_pipeout(pipe
));
134 if (!(onetouch
= kcalloc(1, sizeof(struct usb_onetouch
), GFP_KERNEL
)))
137 onetouch
->data
= usb_buffer_alloc(udev
, ONETOUCH_PKT_LEN
,
138 SLAB_ATOMIC
, &onetouch
->data_dma
);
139 if (!onetouch
->data
){
144 onetouch
->irq
= usb_alloc_urb(0, GFP_KERNEL
);
147 usb_buffer_free(udev
, ONETOUCH_PKT_LEN
,
148 onetouch
->data
, onetouch
->data_dma
);
153 onetouch
->udev
= udev
;
155 set_bit(EV_KEY
, onetouch
->dev
.evbit
);
156 set_bit(ONETOUCH_BUTTON
, onetouch
->dev
.keybit
);
157 clear_bit(0, onetouch
->dev
.keybit
);
159 onetouch
->dev
.private = onetouch
;
160 onetouch
->dev
.open
= usb_onetouch_open
;
161 onetouch
->dev
.close
= usb_onetouch_close
;
163 usb_make_path(udev
, path
, sizeof(path
));
164 sprintf(onetouch
->phys
, "%s/input0", path
);
166 onetouch
->dev
.name
= onetouch
->name
;
167 onetouch
->dev
.phys
= onetouch
->phys
;
169 usb_to_input_id(udev
, &onetouch
->dev
.id
);
171 onetouch
->dev
.dev
= &udev
->dev
;
173 if (udev
->manufacturer
)
174 strcat(onetouch
->name
, udev
->manufacturer
);
176 sprintf(onetouch
->name
, "%s %s", onetouch
->name
,
178 if (!strlen(onetouch
->name
))
179 sprintf(onetouch
->name
, "Maxtor Onetouch %04x:%04x",
180 onetouch
->dev
.id
.vendor
, onetouch
->dev
.id
.product
);
182 usb_fill_int_urb(onetouch
->irq
, udev
, pipe
, onetouch
->data
,
183 (maxp
> 8 ? 8 : maxp
),
184 usb_onetouch_irq
, onetouch
, endpoint
->bInterval
);
185 onetouch
->irq
->transfer_dma
= onetouch
->data_dma
;
186 onetouch
->irq
->transfer_flags
|= URB_NO_TRANSFER_DMA_MAP
;
188 ss
->extra_destructor
= onetouch_release_input
;
189 ss
->extra
= onetouch
;
191 input_register_device(&onetouch
->dev
);
192 printk(KERN_INFO
"usb-input: %s on %s\n", onetouch
->dev
.name
, path
);
197 void onetouch_release_input(void *onetouch_
)
199 struct usb_onetouch
*onetouch
= (struct usb_onetouch
*) onetouch_
;
202 usb_kill_urb(onetouch
->irq
);
203 input_unregister_device(&onetouch
->dev
);
204 usb_free_urb(onetouch
->irq
);
205 usb_buffer_free(onetouch
->udev
, ONETOUCH_PKT_LEN
,
206 onetouch
->data
, onetouch
->data_dma
);
207 printk(KERN_INFO
"usb-input: deregistering %s\n",