diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-15 03:01:47 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-10-28 12:52:52 -0400 |
commit | c5b7c7c395a34f12cdf246d66c1feeff2933d584 (patch) | |
tree | 8af335c30bb92991f4bfd8251de4fed9907b07bd /drivers/usb/input | |
parent | 3c42f0c3dde8feb59fc87df45cadb847d5511c0a (diff) |
[PATCH] drivers/usb/input: convert to dynamic input_dev allocation
Input: convert drivers/iusb/input to dynamic input_dev allocation
This is required for input_dev sysfs integration
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/input')
-rw-r--r-- | drivers/usb/input/acecad.c | 76 | ||||
-rw-r--r-- | drivers/usb/input/aiptek.c | 209 | ||||
-rw-r--r-- | drivers/usb/input/appletouch.c | 130 | ||||
-rw-r--r-- | drivers/usb/input/ati_remote.c | 173 | ||||
-rw-r--r-- | drivers/usb/input/hid-core.c | 51 | ||||
-rw-r--r-- | drivers/usb/input/hid-input.c | 56 | ||||
-rw-r--r-- | drivers/usb/input/hid-lgff.c | 17 | ||||
-rw-r--r-- | drivers/usb/input/hid-tmff.c | 11 | ||||
-rw-r--r-- | drivers/usb/input/hid.h | 2 | ||||
-rw-r--r-- | drivers/usb/input/itmtouch.c | 70 | ||||
-rw-r--r-- | drivers/usb/input/kbtab.c | 82 | ||||
-rw-r--r-- | drivers/usb/input/keyspan_remote.c | 210 | ||||
-rw-r--r-- | drivers/usb/input/mtouchusb.c | 111 | ||||
-rw-r--r-- | drivers/usb/input/pid.c | 12 | ||||
-rw-r--r-- | drivers/usb/input/powermate.c | 136 | ||||
-rw-r--r-- | drivers/usb/input/touchkitusb.c | 116 | ||||
-rw-r--r-- | drivers/usb/input/usbkbd.c | 105 | ||||
-rw-r--r-- | drivers/usb/input/usbmouse.c | 93 | ||||
-rw-r--r-- | drivers/usb/input/wacom.c | 142 | ||||
-rw-r--r-- | drivers/usb/input/xpad.c | 95 | ||||
-rw-r--r-- | drivers/usb/input/yealink.c | 66 |
21 files changed, 961 insertions, 1002 deletions
diff --git a/drivers/usb/input/acecad.c b/drivers/usb/input/acecad.c index 74f8760d7c07..a32558b4048e 100644 --- a/drivers/usb/input/acecad.c +++ b/drivers/usb/input/acecad.c | |||
@@ -53,7 +53,7 @@ struct usb_acecad { | |||
53 | char name[128]; | 53 | char name[128]; |
54 | char phys[64]; | 54 | char phys[64]; |
55 | struct usb_device *usbdev; | 55 | struct usb_device *usbdev; |
56 | struct input_dev dev; | 56 | struct input_dev *input; |
57 | struct urb *irq; | 57 | struct urb *irq; |
58 | 58 | ||
59 | signed char *data; | 59 | signed char *data; |
@@ -64,7 +64,7 @@ static void usb_acecad_irq(struct urb *urb, struct pt_regs *regs) | |||
64 | { | 64 | { |
65 | struct usb_acecad *acecad = urb->context; | 65 | struct usb_acecad *acecad = urb->context; |
66 | unsigned char *data = acecad->data; | 66 | unsigned char *data = acecad->data; |
67 | struct input_dev *dev = &acecad->dev; | 67 | struct input_dev *dev = acecad->input; |
68 | int prox, status; | 68 | int prox, status; |
69 | 69 | ||
70 | switch (urb->status) { | 70 | switch (urb->status) { |
@@ -135,8 +135,8 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ | |||
135 | struct usb_host_interface *interface = intf->cur_altsetting; | 135 | struct usb_host_interface *interface = intf->cur_altsetting; |
136 | struct usb_endpoint_descriptor *endpoint; | 136 | struct usb_endpoint_descriptor *endpoint; |
137 | struct usb_acecad *acecad; | 137 | struct usb_acecad *acecad; |
138 | struct input_dev *input_dev; | ||
138 | int pipe, maxp; | 139 | int pipe, maxp; |
139 | char path[64]; | ||
140 | 140 | ||
141 | if (interface->desc.bNumEndpoints != 1) | 141 | if (interface->desc.bNumEndpoints != 1) |
142 | return -ENODEV; | 142 | return -ENODEV; |
@@ -153,8 +153,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ | |||
153 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); | 153 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); |
154 | 154 | ||
155 | acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL); | 155 | acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL); |
156 | if (!acecad) | 156 | input_dev = input_allocate_device(); |
157 | return -ENOMEM; | 157 | if (!acecad || !input_dev) |
158 | goto fail1; | ||
158 | 159 | ||
159 | acecad->data = usb_buffer_alloc(dev, 8, SLAB_KERNEL, &acecad->data_dma); | 160 | acecad->data = usb_buffer_alloc(dev, 8, SLAB_KERNEL, &acecad->data_dma); |
160 | if (!acecad->data) | 161 | if (!acecad->data) |
@@ -164,6 +165,9 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ | |||
164 | if (!acecad->irq) | 165 | if (!acecad->irq) |
165 | goto fail2; | 166 | goto fail2; |
166 | 167 | ||
168 | acecad->usbdev = dev; | ||
169 | acecad->input = input_dev; | ||
170 | |||
167 | if (dev->manufacturer) | 171 | if (dev->manufacturer) |
168 | strlcpy(acecad->name, dev->manufacturer, sizeof(acecad->name)); | 172 | strlcpy(acecad->name, dev->manufacturer, sizeof(acecad->name)); |
169 | 173 | ||
@@ -173,48 +177,48 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ | |||
173 | strlcat(acecad->name, dev->product, sizeof(acecad->name)); | 177 | strlcat(acecad->name, dev->product, sizeof(acecad->name)); |
174 | } | 178 | } |
175 | 179 | ||
176 | usb_make_path(dev, path, sizeof(path)); | 180 | usb_make_path(dev, acecad->phys, sizeof(acecad->phys)); |
177 | snprintf(acecad->phys, sizeof(acecad->phys), "%s/input0", path); | 181 | strlcat(acecad->phys, "/input0", sizeof(acecad->phys)); |
178 | 182 | ||
179 | acecad->usbdev = dev; | 183 | input_dev->name = acecad->name; |
184 | input_dev->phys = acecad->phys; | ||
185 | usb_to_input_id(dev, &input_dev->id); | ||
186 | input_dev->cdev.dev = &intf->dev; | ||
187 | input_dev->private = acecad; | ||
180 | 188 | ||
181 | acecad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 189 | input_dev->open = usb_acecad_open; |
182 | acecad->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | 190 | input_dev->close = usb_acecad_close; |
183 | acecad->dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | 191 | |
184 | acecad->dev.keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2); | 192 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
193 | input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | ||
194 | input_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | ||
195 | input_dev->keybit[LONG(BTN_DIGI)] = BIT(BTN_TOOL_PEN) |BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2); | ||
185 | 196 | ||
186 | switch (id->driver_info) { | 197 | switch (id->driver_info) { |
187 | case 0: | 198 | case 0: |
188 | acecad->dev.absmax[ABS_X] = 5000; | 199 | input_dev->absmax[ABS_X] = 5000; |
189 | acecad->dev.absmax[ABS_Y] = 3750; | 200 | input_dev->absmax[ABS_Y] = 3750; |
190 | acecad->dev.absmax[ABS_PRESSURE] = 512; | 201 | input_dev->absmax[ABS_PRESSURE] = 512; |
191 | if (!strlen(acecad->name)) | 202 | if (!strlen(acecad->name)) |
192 | snprintf(acecad->name, sizeof(acecad->name), | 203 | snprintf(acecad->name, sizeof(acecad->name), |
193 | "USB Acecad Flair Tablet %04x:%04x", | 204 | "USB Acecad Flair Tablet %04x:%04x", |
194 | dev->descriptor.idVendor, dev->descriptor.idProduct); | 205 | le16_to_cpu(dev->descriptor.idVendor), |
206 | le16_to_cpu(dev->descriptor.idProduct)); | ||
195 | break; | 207 | break; |
196 | case 1: | 208 | case 1: |
197 | acecad->dev.absmax[ABS_X] = 3000; | 209 | input_dev->absmax[ABS_X] = 3000; |
198 | acecad->dev.absmax[ABS_Y] = 2250; | 210 | input_dev->absmax[ABS_Y] = 2250; |
199 | acecad->dev.absmax[ABS_PRESSURE] = 1024; | 211 | input_dev->absmax[ABS_PRESSURE] = 1024; |
200 | if (!strlen(acecad->name)) | 212 | if (!strlen(acecad->name)) |
201 | snprintf(acecad->name, sizeof(acecad->name), | 213 | snprintf(acecad->name, sizeof(acecad->name), |
202 | "USB Acecad 302 Tablet %04x:%04x", | 214 | "USB Acecad 302 Tablet %04x:%04x", |
203 | dev->descriptor.idVendor, dev->descriptor.idProduct); | 215 | le16_to_cpu(dev->descriptor.idVendor), |
216 | le16_to_cpu(dev->descriptor.idProduct)); | ||
204 | break; | 217 | break; |
205 | } | 218 | } |
206 | 219 | ||
207 | acecad->dev.absfuzz[ABS_X] = 4; | 220 | input_dev->absfuzz[ABS_X] = 4; |
208 | acecad->dev.absfuzz[ABS_Y] = 4; | 221 | input_dev->absfuzz[ABS_Y] = 4; |
209 | |||
210 | acecad->dev.private = acecad; | ||
211 | acecad->dev.open = usb_acecad_open; | ||
212 | acecad->dev.close = usb_acecad_close; | ||
213 | |||
214 | acecad->dev.name = acecad->name; | ||
215 | acecad->dev.phys = acecad->phys; | ||
216 | usb_to_input_id(dev, &acecad->dev.id); | ||
217 | acecad->dev.dev = &intf->dev; | ||
218 | 222 | ||
219 | usb_fill_int_urb(acecad->irq, dev, pipe, | 223 | usb_fill_int_urb(acecad->irq, dev, pipe, |
220 | acecad->data, maxp > 8 ? 8 : maxp, | 224 | acecad->data, maxp > 8 ? 8 : maxp, |
@@ -222,17 +226,15 @@ static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_ | |||
222 | acecad->irq->transfer_dma = acecad->data_dma; | 226 | acecad->irq->transfer_dma = acecad->data_dma; |
223 | acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 227 | acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
224 | 228 | ||
225 | input_register_device(&acecad->dev); | 229 | input_register_device(acecad->input); |
226 | |||
227 | printk(KERN_INFO "input: %s with packet size %d on %s\n", | ||
228 | acecad->name, maxp, path); | ||
229 | 230 | ||
230 | usb_set_intfdata(intf, acecad); | 231 | usb_set_intfdata(intf, acecad); |
231 | 232 | ||
232 | return 0; | 233 | return 0; |
233 | 234 | ||
234 | fail2: usb_buffer_free(dev, 8, acecad->data, acecad->data_dma); | 235 | fail2: usb_buffer_free(dev, 8, acecad->data, acecad->data_dma); |
235 | fail1: kfree(acecad); | 236 | fail1: input_free_device(input_dev); |
237 | kfree(acecad); | ||
236 | return -ENOMEM; | 238 | return -ENOMEM; |
237 | } | 239 | } |
238 | 240 | ||
@@ -243,7 +245,7 @@ static void usb_acecad_disconnect(struct usb_interface *intf) | |||
243 | usb_set_intfdata(intf, NULL); | 245 | usb_set_intfdata(intf, NULL); |
244 | if (acecad) { | 246 | if (acecad) { |
245 | usb_kill_urb(acecad->irq); | 247 | usb_kill_urb(acecad->irq); |
246 | input_unregister_device(&acecad->dev); | 248 | input_unregister_device(acecad->input); |
247 | usb_free_urb(acecad->irq); | 249 | usb_free_urb(acecad->irq); |
248 | usb_buffer_free(interface_to_usbdev(intf), 10, acecad->data, acecad->data_dma); | 250 | usb_buffer_free(interface_to_usbdev(intf), 10, acecad->data, acecad->data_dma); |
249 | kfree(acecad); | 251 | kfree(acecad); |
diff --git a/drivers/usb/input/aiptek.c b/drivers/usb/input/aiptek.c index cd0cbfe20723..1c5205321d83 100644 --- a/drivers/usb/input/aiptek.c +++ b/drivers/usb/input/aiptek.c | |||
@@ -317,7 +317,7 @@ struct aiptek_settings { | |||
317 | }; | 317 | }; |
318 | 318 | ||
319 | struct aiptek { | 319 | struct aiptek { |
320 | struct input_dev inputdev; /* input device struct */ | 320 | struct input_dev *inputdev; /* input device struct */ |
321 | struct usb_device *usbdev; /* usb device struct */ | 321 | struct usb_device *usbdev; /* usb device struct */ |
322 | struct urb *urb; /* urb for incoming reports */ | 322 | struct urb *urb; /* urb for incoming reports */ |
323 | dma_addr_t data_dma; /* our dma stuffage */ | 323 | dma_addr_t data_dma; /* our dma stuffage */ |
@@ -402,7 +402,7 @@ static void aiptek_irq(struct urb *urb, struct pt_regs *regs) | |||
402 | { | 402 | { |
403 | struct aiptek *aiptek = urb->context; | 403 | struct aiptek *aiptek = urb->context; |
404 | unsigned char *data = aiptek->data; | 404 | unsigned char *data = aiptek->data; |
405 | struct input_dev *inputdev = &aiptek->inputdev; | 405 | struct input_dev *inputdev = aiptek->inputdev; |
406 | int jitterable = 0; | 406 | int jitterable = 0; |
407 | int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck; | 407 | int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck; |
408 | 408 | ||
@@ -955,20 +955,20 @@ static int aiptek_program_tablet(struct aiptek *aiptek) | |||
955 | /* Query getXextension */ | 955 | /* Query getXextension */ |
956 | if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0) | 956 | if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0) |
957 | return ret; | 957 | return ret; |
958 | aiptek->inputdev.absmin[ABS_X] = 0; | 958 | aiptek->inputdev->absmin[ABS_X] = 0; |
959 | aiptek->inputdev.absmax[ABS_X] = ret - 1; | 959 | aiptek->inputdev->absmax[ABS_X] = ret - 1; |
960 | 960 | ||
961 | /* Query getYextension */ | 961 | /* Query getYextension */ |
962 | if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0) | 962 | if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0) |
963 | return ret; | 963 | return ret; |
964 | aiptek->inputdev.absmin[ABS_Y] = 0; | 964 | aiptek->inputdev->absmin[ABS_Y] = 0; |
965 | aiptek->inputdev.absmax[ABS_Y] = ret - 1; | 965 | aiptek->inputdev->absmax[ABS_Y] = ret - 1; |
966 | 966 | ||
967 | /* Query getPressureLevels */ | 967 | /* Query getPressureLevels */ |
968 | if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0) | 968 | if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0) |
969 | return ret; | 969 | return ret; |
970 | aiptek->inputdev.absmin[ABS_PRESSURE] = 0; | 970 | aiptek->inputdev->absmin[ABS_PRESSURE] = 0; |
971 | aiptek->inputdev.absmax[ABS_PRESSURE] = ret - 1; | 971 | aiptek->inputdev->absmax[ABS_PRESSURE] = ret - 1; |
972 | 972 | ||
973 | /* Depending on whether we are in absolute or relative mode, we will | 973 | /* Depending on whether we are in absolute or relative mode, we will |
974 | * do a switchToTablet(absolute) or switchToMouse(relative) command. | 974 | * do a switchToTablet(absolute) or switchToMouse(relative) command. |
@@ -1025,8 +1025,8 @@ static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr | |||
1025 | return 0; | 1025 | return 0; |
1026 | 1026 | ||
1027 | return snprintf(buf, PAGE_SIZE, "%dx%d\n", | 1027 | return snprintf(buf, PAGE_SIZE, "%dx%d\n", |
1028 | aiptek->inputdev.absmax[ABS_X] + 1, | 1028 | aiptek->inputdev->absmax[ABS_X] + 1, |
1029 | aiptek->inputdev.absmax[ABS_Y] + 1); | 1029 | aiptek->inputdev->absmax[ABS_Y] + 1); |
1030 | } | 1030 | } |
1031 | 1031 | ||
1032 | /* These structs define the sysfs files, param #1 is the name of the | 1032 | /* These structs define the sysfs files, param #1 is the name of the |
@@ -1048,7 +1048,7 @@ static ssize_t show_tabletProductId(struct device *dev, struct device_attribute | |||
1048 | return 0; | 1048 | return 0; |
1049 | 1049 | ||
1050 | return snprintf(buf, PAGE_SIZE, "0x%04x\n", | 1050 | return snprintf(buf, PAGE_SIZE, "0x%04x\n", |
1051 | aiptek->inputdev.id.product); | 1051 | aiptek->inputdev->id.product); |
1052 | } | 1052 | } |
1053 | 1053 | ||
1054 | static DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL); | 1054 | static DEVICE_ATTR(product_id, S_IRUGO, show_tabletProductId, NULL); |
@@ -1063,7 +1063,7 @@ static ssize_t show_tabletVendorId(struct device *dev, struct device_attribute * | |||
1063 | if (aiptek == NULL) | 1063 | if (aiptek == NULL) |
1064 | return 0; | 1064 | return 0; |
1065 | 1065 | ||
1066 | return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev.id.vendor); | 1066 | return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->inputdev->id.vendor); |
1067 | } | 1067 | } |
1068 | 1068 | ||
1069 | static DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL); | 1069 | static DEVICE_ATTR(vendor_id, S_IRUGO, show_tabletVendorId, NULL); |
@@ -1977,7 +1977,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1977 | struct input_dev *inputdev; | 1977 | struct input_dev *inputdev; |
1978 | struct input_handle *inputhandle; | 1978 | struct input_handle *inputhandle; |
1979 | struct list_head *node, *next; | 1979 | struct list_head *node, *next; |
1980 | char path[64 + 1]; | ||
1981 | int i; | 1980 | int i; |
1982 | int speeds[] = { 0, | 1981 | int speeds[] = { 0, |
1983 | AIPTEK_PROGRAMMABLE_DELAY_50, | 1982 | AIPTEK_PROGRAMMABLE_DELAY_50, |
@@ -1996,24 +1995,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
1996 | */ | 1995 | */ |
1997 | speeds[0] = programmableDelay; | 1996 | speeds[0] = programmableDelay; |
1998 | 1997 | ||
1999 | if ((aiptek = kmalloc(sizeof(struct aiptek), GFP_KERNEL)) == NULL) | 1998 | aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL); |
2000 | return -ENOMEM; | 1999 | inputdev = input_allocate_device(); |
2001 | memset(aiptek, 0, sizeof(struct aiptek)); | 2000 | if (!aiptek || !inputdev) |
2001 | goto fail1; | ||
2002 | 2002 | ||
2003 | aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH, | 2003 | aiptek->data = usb_buffer_alloc(usbdev, AIPTEK_PACKET_LENGTH, |
2004 | SLAB_ATOMIC, &aiptek->data_dma); | 2004 | SLAB_ATOMIC, &aiptek->data_dma); |
2005 | if (aiptek->data == NULL) { | 2005 | if (!aiptek->data) |
2006 | kfree(aiptek); | 2006 | goto fail1; |
2007 | return -ENOMEM; | ||
2008 | } | ||
2009 | 2007 | ||
2010 | aiptek->urb = usb_alloc_urb(0, GFP_KERNEL); | 2008 | aiptek->urb = usb_alloc_urb(0, GFP_KERNEL); |
2011 | if (aiptek->urb == NULL) { | 2009 | if (!aiptek->urb) |
2012 | usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data, | 2010 | goto fail2; |
2013 | aiptek->data_dma); | 2011 | |
2014 | kfree(aiptek); | 2012 | aiptek->inputdev = inputdev; |
2015 | return -ENOMEM; | 2013 | aiptek->usbdev = usbdev; |
2016 | } | 2014 | aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber; |
2015 | aiptek->inDelay = 0; | ||
2016 | aiptek->endDelay = 0; | ||
2017 | aiptek->previousJitterable = 0; | ||
2017 | 2018 | ||
2018 | /* Set up the curSettings struct. Said struct contains the current | 2019 | /* Set up the curSettings struct. Said struct contains the current |
2019 | * programmable parameters. The newSetting struct contains changes | 2020 | * programmable parameters. The newSetting struct contains changes |
@@ -2036,31 +2037,48 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
2036 | 2037 | ||
2037 | /* Both structs should have equivalent settings | 2038 | /* Both structs should have equivalent settings |
2038 | */ | 2039 | */ |
2039 | memcpy(&aiptek->newSetting, &aiptek->curSetting, | 2040 | aiptek->newSetting = aiptek->curSetting; |
2040 | sizeof(struct aiptek_settings)); | 2041 | |
2042 | /* Determine the usb devices' physical path. | ||
2043 | * Asketh not why we always pretend we're using "../input0", | ||
2044 | * but I suspect this will have to be refactored one | ||
2045 | * day if a single USB device can be a keyboard & a mouse | ||
2046 | * & a tablet, and the inputX number actually will tell | ||
2047 | * us something... | ||
2048 | */ | ||
2049 | usb_make_path(usbdev, aiptek->features.usbPath, | ||
2050 | sizeof(aiptek->features.usbPath)); | ||
2051 | strlcat(aiptek->features.usbPath, "/input0", | ||
2052 | sizeof(aiptek->features.usbPath)); | ||
2053 | |||
2054 | /* Set up client data, pointers to open and close routines | ||
2055 | * for the input device. | ||
2056 | */ | ||
2057 | inputdev->name = "Aiptek"; | ||
2058 | inputdev->phys = aiptek->features.usbPath; | ||
2059 | usb_to_input_id(usbdev, &inputdev->id); | ||
2060 | inputdev->cdev.dev = &intf->dev; | ||
2061 | inputdev->private = aiptek; | ||
2062 | inputdev->open = aiptek_open; | ||
2063 | inputdev->close = aiptek_close; | ||
2041 | 2064 | ||
2042 | /* Now program the capacities of the tablet, in terms of being | 2065 | /* Now program the capacities of the tablet, in terms of being |
2043 | * an input device. | 2066 | * an input device. |
2044 | */ | 2067 | */ |
2045 | aiptek->inputdev.evbit[0] |= BIT(EV_KEY) | 2068 | inputdev->evbit[0] |= BIT(EV_KEY) |
2046 | | BIT(EV_ABS) | 2069 | | BIT(EV_ABS) |
2047 | | BIT(EV_REL) | 2070 | | BIT(EV_REL) |
2048 | | BIT(EV_MSC); | 2071 | | BIT(EV_MSC); |
2049 | 2072 | ||
2050 | aiptek->inputdev.absbit[0] |= | 2073 | inputdev->absbit[0] |= BIT(ABS_MISC); |
2051 | (BIT(ABS_X) | | ||
2052 | BIT(ABS_Y) | | ||
2053 | BIT(ABS_PRESSURE) | | ||
2054 | BIT(ABS_TILT_X) | | ||
2055 | BIT(ABS_TILT_Y) | BIT(ABS_WHEEL) | BIT(ABS_MISC)); | ||
2056 | 2074 | ||
2057 | aiptek->inputdev.relbit[0] |= | 2075 | inputdev->relbit[0] |= |
2058 | (BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL) | BIT(REL_MISC)); | 2076 | (BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL) | BIT(REL_MISC)); |
2059 | 2077 | ||
2060 | aiptek->inputdev.keybit[LONG(BTN_LEFT)] |= | 2078 | inputdev->keybit[LONG(BTN_LEFT)] |= |
2061 | (BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE)); | 2079 | (BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE)); |
2062 | 2080 | ||
2063 | aiptek->inputdev.keybit[LONG(BTN_DIGI)] |= | 2081 | inputdev->keybit[LONG(BTN_DIGI)] |= |
2064 | (BIT(BTN_TOOL_PEN) | | 2082 | (BIT(BTN_TOOL_PEN) | |
2065 | BIT(BTN_TOOL_RUBBER) | | 2083 | BIT(BTN_TOOL_RUBBER) | |
2066 | BIT(BTN_TOOL_PENCIL) | | 2084 | BIT(BTN_TOOL_PENCIL) | |
@@ -2070,70 +2088,26 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
2070 | BIT(BTN_TOOL_LENS) | | 2088 | BIT(BTN_TOOL_LENS) | |
2071 | BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2)); | 2089 | BIT(BTN_TOUCH) | BIT(BTN_STYLUS) | BIT(BTN_STYLUS2)); |
2072 | 2090 | ||
2073 | aiptek->inputdev.mscbit[0] = BIT(MSC_SERIAL); | 2091 | inputdev->mscbit[0] = BIT(MSC_SERIAL); |
2074 | 2092 | ||
2075 | /* Programming the tablet macro keys needs to be done with a for loop | 2093 | /* Programming the tablet macro keys needs to be done with a for loop |
2076 | * as the keycodes are discontiguous. | 2094 | * as the keycodes are discontiguous. |
2077 | */ | 2095 | */ |
2078 | for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i) | 2096 | for (i = 0; i < sizeof(macroKeyEvents) / sizeof(macroKeyEvents[0]); ++i) |
2079 | set_bit(macroKeyEvents[i], aiptek->inputdev.keybit); | 2097 | set_bit(macroKeyEvents[i], inputdev->keybit); |
2080 | |||
2081 | /* Set up client data, pointers to open and close routines | ||
2082 | * for the input device. | ||
2083 | */ | ||
2084 | aiptek->inputdev.private = aiptek; | ||
2085 | aiptek->inputdev.open = aiptek_open; | ||
2086 | aiptek->inputdev.close = aiptek_close; | ||
2087 | |||
2088 | /* Determine the usb devices' physical path. | ||
2089 | * Asketh not why we always pretend we're using "../input0", | ||
2090 | * but I suspect this will have to be refactored one | ||
2091 | * day if a single USB device can be a keyboard & a mouse | ||
2092 | * & a tablet, and the inputX number actually will tell | ||
2093 | * us something... | ||
2094 | */ | ||
2095 | if (usb_make_path(usbdev, path, 64) > 0) | ||
2096 | sprintf(aiptek->features.usbPath, "%s/input0", path); | ||
2097 | 2098 | ||
2098 | /* Program the input device coordinate capacities. We do not yet | 2099 | /* |
2100 | * Program the input device coordinate capacities. We do not yet | ||
2099 | * know what maximum X, Y, and Z values are, so we're putting fake | 2101 | * know what maximum X, Y, and Z values are, so we're putting fake |
2100 | * values in. Later, we'll ask the tablet to put in the correct | 2102 | * values in. Later, we'll ask the tablet to put in the correct |
2101 | * values. | 2103 | * values. |
2102 | */ | 2104 | */ |
2103 | aiptek->inputdev.absmin[ABS_X] = 0; | 2105 | input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0); |
2104 | aiptek->inputdev.absmax[ABS_X] = 2999; | 2106 | input_set_abs_params(inputdev, ABS_X, 0, 2249, 0, 0); |
2105 | aiptek->inputdev.absmin[ABS_Y] = 0; | 2107 | input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0); |
2106 | aiptek->inputdev.absmax[ABS_Y] = 2249; | 2108 | input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0); |
2107 | aiptek->inputdev.absmin[ABS_PRESSURE] = 0; | 2109 | input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0); |
2108 | aiptek->inputdev.absmax[ABS_PRESSURE] = 511; | 2110 | input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); |
2109 | aiptek->inputdev.absmin[ABS_TILT_X] = AIPTEK_TILT_MIN; | ||
2110 | aiptek->inputdev.absmax[ABS_TILT_X] = AIPTEK_TILT_MAX; | ||
2111 | aiptek->inputdev.absmin[ABS_TILT_Y] = AIPTEK_TILT_MIN; | ||
2112 | aiptek->inputdev.absmax[ABS_TILT_Y] = AIPTEK_TILT_MAX; | ||
2113 | aiptek->inputdev.absmin[ABS_WHEEL] = AIPTEK_WHEEL_MIN; | ||
2114 | aiptek->inputdev.absmax[ABS_WHEEL] = AIPTEK_WHEEL_MAX - 1; | ||
2115 | aiptek->inputdev.absfuzz[ABS_X] = 0; | ||
2116 | aiptek->inputdev.absfuzz[ABS_Y] = 0; | ||
2117 | aiptek->inputdev.absfuzz[ABS_PRESSURE] = 0; | ||
2118 | aiptek->inputdev.absfuzz[ABS_TILT_X] = 0; | ||
2119 | aiptek->inputdev.absfuzz[ABS_TILT_Y] = 0; | ||
2120 | aiptek->inputdev.absfuzz[ABS_WHEEL] = 0; | ||
2121 | aiptek->inputdev.absflat[ABS_X] = 0; | ||
2122 | aiptek->inputdev.absflat[ABS_Y] = 0; | ||
2123 | aiptek->inputdev.absflat[ABS_PRESSURE] = 0; | ||
2124 | aiptek->inputdev.absflat[ABS_TILT_X] = 0; | ||
2125 | aiptek->inputdev.absflat[ABS_TILT_Y] = 0; | ||
2126 | aiptek->inputdev.absflat[ABS_WHEEL] = 0; | ||
2127 | aiptek->inputdev.name = "Aiptek"; | ||
2128 | aiptek->inputdev.phys = aiptek->features.usbPath; | ||
2129 | usb_to_input_id(usbdev, &aiptek->inputdev.id); | ||
2130 | aiptek->inputdev.dev = &intf->dev; | ||
2131 | |||
2132 | aiptek->usbdev = usbdev; | ||
2133 | aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber; | ||
2134 | aiptek->inDelay = 0; | ||
2135 | aiptek->endDelay = 0; | ||
2136 | aiptek->previousJitterable = 0; | ||
2137 | 2111 | ||
2138 | endpoint = &intf->altsetting[0].endpoint[0].desc; | 2112 | endpoint = &intf->altsetting[0].endpoint[0].desc; |
2139 | 2113 | ||
@@ -2150,28 +2124,6 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
2150 | aiptek->urb->transfer_dma = aiptek->data_dma; | 2124 | aiptek->urb->transfer_dma = aiptek->data_dma; |
2151 | aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 2125 | aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
2152 | 2126 | ||
2153 | /* Register the tablet as an Input Device | ||
2154 | */ | ||
2155 | input_register_device(&aiptek->inputdev); | ||
2156 | |||
2157 | /* We now will look for the evdev device which is mapped to | ||
2158 | * the tablet. The partial name is kept in the link list of | ||
2159 | * input_handles associated with this input device. | ||
2160 | * What identifies an evdev input_handler is that it begins | ||
2161 | * with 'event', continues with a digit, and that in turn | ||
2162 | * is mapped to /{devfs}/input/eventN. | ||
2163 | */ | ||
2164 | inputdev = &aiptek->inputdev; | ||
2165 | list_for_each_safe(node, next, &inputdev->h_list) { | ||
2166 | inputhandle = to_handle(node); | ||
2167 | if (strncmp(inputhandle->name, "event", 5) == 0) { | ||
2168 | strcpy(aiptek->features.inputPath, inputhandle->name); | ||
2169 | break; | ||
2170 | } | ||
2171 | } | ||
2172 | |||
2173 | info("input: Aiptek on %s (%s)\n", path, aiptek->features.inputPath); | ||
2174 | |||
2175 | /* Program the tablet. This sets the tablet up in the mode | 2127 | /* Program the tablet. This sets the tablet up in the mode |
2176 | * specified in newSetting, and also queries the tablet's | 2128 | * specified in newSetting, and also queries the tablet's |
2177 | * physical capacities. | 2129 | * physical capacities. |
@@ -2186,13 +2138,32 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
2186 | for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) { | 2138 | for (i = 0; i < sizeof(speeds) / sizeof(speeds[0]); ++i) { |
2187 | aiptek->curSetting.programmableDelay = speeds[i]; | 2139 | aiptek->curSetting.programmableDelay = speeds[i]; |
2188 | (void)aiptek_program_tablet(aiptek); | 2140 | (void)aiptek_program_tablet(aiptek); |
2189 | if (aiptek->inputdev.absmax[ABS_X] > 0) { | 2141 | if (aiptek->inputdev->absmax[ABS_X] > 0) { |
2190 | info("input: Aiptek using %d ms programming speed\n", | 2142 | info("input: Aiptek using %d ms programming speed\n", |
2191 | aiptek->curSetting.programmableDelay); | 2143 | aiptek->curSetting.programmableDelay); |
2192 | break; | 2144 | break; |
2193 | } | 2145 | } |
2194 | } | 2146 | } |
2195 | 2147 | ||
2148 | /* Register the tablet as an Input Device | ||
2149 | */ | ||
2150 | input_register_device(aiptek->inputdev); | ||
2151 | |||
2152 | /* We now will look for the evdev device which is mapped to | ||
2153 | * the tablet. The partial name is kept in the link list of | ||
2154 | * input_handles associated with this input device. | ||
2155 | * What identifies an evdev input_handler is that it begins | ||
2156 | * with 'event', continues with a digit, and that in turn | ||
2157 | * is mapped to /{devfs}/input/eventN. | ||
2158 | */ | ||
2159 | list_for_each_safe(node, next, &inputdev->h_list) { | ||
2160 | inputhandle = to_handle(node); | ||
2161 | if (strncmp(inputhandle->name, "event", 5) == 0) { | ||
2162 | strcpy(aiptek->features.inputPath, inputhandle->name); | ||
2163 | break; | ||
2164 | } | ||
2165 | } | ||
2166 | |||
2196 | /* Associate this driver's struct with the usb interface. | 2167 | /* Associate this driver's struct with the usb interface. |
2197 | */ | 2168 | */ |
2198 | usb_set_intfdata(intf, aiptek); | 2169 | usb_set_intfdata(intf, aiptek); |
@@ -2207,6 +2178,12 @@ aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
2207 | info("aiptek: error loading 'evdev' module"); | 2178 | info("aiptek: error loading 'evdev' module"); |
2208 | 2179 | ||
2209 | return 0; | 2180 | return 0; |
2181 | |||
2182 | fail2: usb_buffer_free(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data, | ||
2183 | aiptek->data_dma); | ||
2184 | fail1: input_free_device(inputdev); | ||
2185 | kfree(aiptek); | ||
2186 | return -ENOMEM; | ||
2210 | } | 2187 | } |
2211 | 2188 | ||
2212 | /* Forward declaration */ | 2189 | /* Forward declaration */ |
@@ -2234,7 +2211,7 @@ static void aiptek_disconnect(struct usb_interface *intf) | |||
2234 | /* Free & unhook everything from the system. | 2211 | /* Free & unhook everything from the system. |
2235 | */ | 2212 | */ |
2236 | usb_kill_urb(aiptek->urb); | 2213 | usb_kill_urb(aiptek->urb); |
2237 | input_unregister_device(&aiptek->inputdev); | 2214 | input_unregister_device(aiptek->inputdev); |
2238 | aiptek_delete_files(&intf->dev); | 2215 | aiptek_delete_files(&intf->dev); |
2239 | usb_free_urb(aiptek->urb); | 2216 | usb_free_urb(aiptek->urb); |
2240 | usb_buffer_free(interface_to_usbdev(intf), | 2217 | usb_buffer_free(interface_to_usbdev(intf), |
diff --git a/drivers/usb/input/appletouch.c b/drivers/usb/input/appletouch.c index e03c1c567a14..15840db092a5 100644 --- a/drivers/usb/input/appletouch.c +++ b/drivers/usb/input/appletouch.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #define APPLE_VENDOR_ID 0x05AC | 39 | #define APPLE_VENDOR_ID 0x05AC |
40 | 40 | ||
41 | #define ATP_DEVICE(prod) \ | 41 | #define ATP_DEVICE(prod) \ |
42 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ | 42 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ |
43 | USB_DEVICE_ID_MATCH_INT_CLASS | \ | 43 | USB_DEVICE_ID_MATCH_INT_CLASS | \ |
44 | USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ | 44 | USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ |
45 | .idVendor = APPLE_VENDOR_ID, \ | 45 | .idVendor = APPLE_VENDOR_ID, \ |
@@ -78,9 +78,9 @@ MODULE_DEVICE_TABLE (usb, atp_table); | |||
78 | * We try to keep the touchpad aspect ratio while still doing only simple | 78 | * We try to keep the touchpad aspect ratio while still doing only simple |
79 | * arithmetics. | 79 | * arithmetics. |
80 | * The factors below give coordinates like: | 80 | * The factors below give coordinates like: |
81 | * 0 <= x < 960 on 12" and 15" Powerbooks | 81 | * 0 <= x < 960 on 12" and 15" Powerbooks |
82 | * 0 <= x < 1600 on 17" Powerbooks | 82 | * 0 <= x < 1600 on 17" Powerbooks |
83 | * 0 <= y < 646 | 83 | * 0 <= y < 646 |
84 | */ | 84 | */ |
85 | #define ATP_XFACT 64 | 85 | #define ATP_XFACT 64 |
86 | #define ATP_YFACT 43 | 86 | #define ATP_YFACT 43 |
@@ -93,11 +93,12 @@ MODULE_DEVICE_TABLE (usb, atp_table); | |||
93 | 93 | ||
94 | /* Structure to hold all of our device specific stuff */ | 94 | /* Structure to hold all of our device specific stuff */ |
95 | struct atp { | 95 | struct atp { |
96 | char phys[64]; | ||
96 | struct usb_device * udev; /* usb device */ | 97 | struct usb_device * udev; /* usb device */ |
97 | struct urb * urb; /* usb request block */ | 98 | struct urb * urb; /* usb request block */ |
98 | signed char * data; /* transferred data */ | 99 | signed char * data; /* transferred data */ |
99 | int open; /* non-zero if opened */ | 100 | int open; /* non-zero if opened */ |
100 | struct input_dev input; /* input dev */ | 101 | struct input_dev *input; /* input dev */ |
101 | int valid; /* are the sensors valid ? */ | 102 | int valid; /* are the sensors valid ? */ |
102 | int x_old; /* last reported x/y, */ | 103 | int x_old; /* last reported x/y, */ |
103 | int y_old; /* used for smoothing */ | 104 | int y_old; /* used for smoothing */ |
@@ -114,11 +115,11 @@ struct atp { | |||
114 | int i; \ | 115 | int i; \ |
115 | printk("appletouch: %s %lld", msg, (long long)jiffies); \ | 116 | printk("appletouch: %s %lld", msg, (long long)jiffies); \ |
116 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \ | 117 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) \ |
117 | printk(" %02x", tab[i]); \ | 118 | printk(" %02x", tab[i]); \ |
118 | printk("\n"); \ | 119 | printk("\n"); \ |
119 | } | 120 | } |
120 | 121 | ||
121 | #define dprintk(format, a...) \ | 122 | #define dprintk(format, a...) \ |
122 | do { \ | 123 | do { \ |
123 | if (debug) printk(format, ##a); \ | 124 | if (debug) printk(format, ##a); \ |
124 | } while (0) | 125 | } while (0) |
@@ -219,8 +220,8 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) | |||
219 | for (i = 16; i < ATP_XSENSORS; i++) | 220 | for (i = 16; i < ATP_XSENSORS; i++) |
220 | if (dev->xy_cur[i]) { | 221 | if (dev->xy_cur[i]) { |
221 | printk("appletouch: 17\" model detected.\n"); | 222 | printk("appletouch: 17\" model detected.\n"); |
222 | input_set_abs_params(&dev->input, ABS_X, 0, | 223 | input_set_abs_params(dev->input, ABS_X, 0, |
223 | (ATP_XSENSORS - 1) * | 224 | (ATP_XSENSORS - 1) * |
224 | ATP_XFACT - 1, | 225 | ATP_XFACT - 1, |
225 | ATP_FUZZ, 0); | 226 | ATP_FUZZ, 0); |
226 | break; | 227 | break; |
@@ -260,12 +261,12 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) | |||
260 | "Xz: %3d Yz: %3d\n", | 261 | "Xz: %3d Yz: %3d\n", |
261 | x, y, x_z, y_z); | 262 | x, y, x_z, y_z); |
262 | 263 | ||
263 | input_report_key(&dev->input, BTN_TOUCH, 1); | 264 | input_report_key(dev->input, BTN_TOUCH, 1); |
264 | input_report_abs(&dev->input, ABS_X, x); | 265 | input_report_abs(dev->input, ABS_X, x); |
265 | input_report_abs(&dev->input, ABS_Y, y); | 266 | input_report_abs(dev->input, ABS_Y, y); |
266 | input_report_abs(&dev->input, ABS_PRESSURE, | 267 | input_report_abs(dev->input, ABS_PRESSURE, |
267 | min(ATP_PRESSURE, x_z + y_z)); | 268 | min(ATP_PRESSURE, x_z + y_z)); |
268 | atp_report_fingers(&dev->input, max(x_f, y_f)); | 269 | atp_report_fingers(dev->input, max(x_f, y_f)); |
269 | } | 270 | } |
270 | dev->x_old = x; | 271 | dev->x_old = x; |
271 | dev->y_old = y; | 272 | dev->y_old = y; |
@@ -273,17 +274,17 @@ static void atp_complete(struct urb* urb, struct pt_regs* regs) | |||
273 | else if (!x && !y) { | 274 | else if (!x && !y) { |
274 | 275 | ||
275 | dev->x_old = dev->y_old = -1; | 276 | dev->x_old = dev->y_old = -1; |
276 | input_report_key(&dev->input, BTN_TOUCH, 0); | 277 | input_report_key(dev->input, BTN_TOUCH, 0); |
277 | input_report_abs(&dev->input, ABS_PRESSURE, 0); | 278 | input_report_abs(dev->input, ABS_PRESSURE, 0); |
278 | atp_report_fingers(&dev->input, 0); | 279 | atp_report_fingers(dev->input, 0); |
279 | 280 | ||
280 | /* reset the accumulator on release */ | 281 | /* reset the accumulator on release */ |
281 | memset(dev->xy_acc, 0, sizeof(dev->xy_acc)); | 282 | memset(dev->xy_acc, 0, sizeof(dev->xy_acc)); |
282 | } | 283 | } |
283 | 284 | ||
284 | input_report_key(&dev->input, BTN_LEFT, !!dev->data[80]); | 285 | input_report_key(dev->input, BTN_LEFT, !!dev->data[80]); |
285 | 286 | ||
286 | input_sync(&dev->input); | 287 | input_sync(dev->input); |
287 | 288 | ||
288 | exit: | 289 | exit: |
289 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); | 290 | retval = usb_submit_urb(dev->urb, GFP_ATOMIC); |
@@ -314,21 +315,14 @@ static void atp_close(struct input_dev *input) | |||
314 | 315 | ||
315 | static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) | 316 | static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id) |
316 | { | 317 | { |
317 | struct atp *dev = NULL; | 318 | struct atp *dev; |
319 | struct input_dev *input_dev; | ||
320 | struct usb_device *udev = interface_to_usbdev(iface); | ||
318 | struct usb_host_interface *iface_desc; | 321 | struct usb_host_interface *iface_desc; |
319 | struct usb_endpoint_descriptor *endpoint; | 322 | struct usb_endpoint_descriptor *endpoint; |
320 | int int_in_endpointAddr = 0; | 323 | int int_in_endpointAddr = 0; |
321 | int i, retval = -ENOMEM; | 324 | int i, retval = -ENOMEM; |
322 | 325 | ||
323 | /* allocate memory for our device state and initialize it */ | ||
324 | dev = kmalloc(sizeof(struct atp), GFP_KERNEL); | ||
325 | if (dev == NULL) { | ||
326 | err("Out of memory"); | ||
327 | goto err_kmalloc; | ||
328 | } | ||
329 | memset(dev, 0, sizeof(struct atp)); | ||
330 | |||
331 | dev->udev = interface_to_usbdev(iface); | ||
332 | 326 | ||
333 | /* set up the endpoint information */ | 327 | /* set up the endpoint information */ |
334 | /* use only the first interrupt-in endpoint */ | 328 | /* use only the first interrupt-in endpoint */ |
@@ -345,70 +339,82 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id | |||
345 | } | 339 | } |
346 | } | 340 | } |
347 | if (!int_in_endpointAddr) { | 341 | if (!int_in_endpointAddr) { |
348 | retval = -EIO; | ||
349 | err("Could not find int-in endpoint"); | 342 | err("Could not find int-in endpoint"); |
350 | goto err_endpoint; | 343 | return -EIO; |
351 | } | 344 | } |
352 | 345 | ||
353 | /* save our data pointer in this interface device */ | 346 | /* allocate memory for our device state and initialize it */ |
354 | usb_set_intfdata(iface, dev); | 347 | dev = kzalloc(sizeof(struct atp), GFP_KERNEL); |
348 | input_dev = input_allocate_device(); | ||
349 | if (!dev || !input_dev) { | ||
350 | err("Out of memory"); | ||
351 | goto err_free_devs; | ||
352 | } | ||
353 | |||
354 | dev->udev = udev; | ||
355 | dev->input = input_dev; | ||
355 | 356 | ||
356 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); | 357 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); |
357 | if (!dev->urb) { | 358 | if (!dev->urb) { |
358 | retval = -ENOMEM; | 359 | retval = -ENOMEM; |
359 | goto err_usballoc; | 360 | goto err_free_devs; |
360 | } | 361 | } |
362 | |||
361 | dev->data = usb_buffer_alloc(dev->udev, ATP_DATASIZE, GFP_KERNEL, | 363 | dev->data = usb_buffer_alloc(dev->udev, ATP_DATASIZE, GFP_KERNEL, |
362 | &dev->urb->transfer_dma); | 364 | &dev->urb->transfer_dma); |
363 | if (!dev->data) { | 365 | if (!dev->data) { |
364 | retval = -ENOMEM; | 366 | retval = -ENOMEM; |
365 | goto err_usbbufalloc; | 367 | goto err_free_urb; |
366 | } | 368 | } |
367 | usb_fill_int_urb(dev->urb, dev->udev, | 369 | |
368 | usb_rcvintpipe(dev->udev, int_in_endpointAddr), | 370 | usb_fill_int_urb(dev->urb, udev, |
371 | usb_rcvintpipe(udev, int_in_endpointAddr), | ||
369 | dev->data, ATP_DATASIZE, atp_complete, dev, 1); | 372 | dev->data, ATP_DATASIZE, atp_complete, dev, 1); |
370 | 373 | ||
371 | init_input_dev(&dev->input); | 374 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); |
372 | dev->input.name = "appletouch"; | 375 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); |
373 | dev->input.dev = &iface->dev; | 376 | |
374 | dev->input.private = dev; | 377 | input_dev->name = "appletouch"; |
375 | dev->input.open = atp_open; | 378 | input_dev->phys = dev->phys; |
376 | dev->input.close = atp_close; | 379 | usb_to_input_id(dev->udev, &input_dev->id); |
380 | input_dev->cdev.dev = &iface->dev; | ||
377 | 381 | ||
378 | usb_to_input_id(dev->udev, &dev->input.id); | 382 | input_dev->private = dev; |
383 | input_dev->open = atp_open; | ||
384 | input_dev->close = atp_close; | ||
379 | 385 | ||
380 | set_bit(EV_ABS, dev->input.evbit); | 386 | set_bit(EV_ABS, input_dev->evbit); |
381 | 387 | ||
382 | /* | 388 | /* |
383 | * 12" and 15" Powerbooks only have 16 x sensors, | 389 | * 12" and 15" Powerbooks only have 16 x sensors, |
384 | * 17" models are detected later. | 390 | * 17" models are detected later. |
385 | */ | 391 | */ |
386 | input_set_abs_params(&dev->input, ABS_X, 0, | 392 | input_set_abs_params(input_dev, ABS_X, 0, |
387 | (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0); | 393 | (16 - 1) * ATP_XFACT - 1, ATP_FUZZ, 0); |
388 | input_set_abs_params(&dev->input, ABS_Y, 0, | 394 | input_set_abs_params(input_dev, ABS_Y, 0, |
389 | (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0); | 395 | (ATP_YSENSORS - 1) * ATP_YFACT - 1, ATP_FUZZ, 0); |
390 | input_set_abs_params(&dev->input, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); | 396 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); |
391 | 397 | ||
392 | set_bit(EV_KEY, dev->input.evbit); | 398 | set_bit(EV_KEY, input_dev->evbit); |
393 | set_bit(BTN_TOUCH, dev->input.keybit); | 399 | set_bit(BTN_TOUCH, input_dev->keybit); |
394 | set_bit(BTN_TOOL_FINGER, dev->input.keybit); | 400 | set_bit(BTN_TOOL_FINGER, input_dev->keybit); |
395 | set_bit(BTN_TOOL_DOUBLETAP, dev->input.keybit); | 401 | set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); |
396 | set_bit(BTN_TOOL_TRIPLETAP, dev->input.keybit); | 402 | set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); |
397 | set_bit(BTN_LEFT, dev->input.keybit); | 403 | set_bit(BTN_LEFT, input_dev->keybit); |
398 | 404 | ||
399 | input_register_device(&dev->input); | 405 | input_register_device(dev->input); |
400 | 406 | ||
401 | printk(KERN_INFO "input: appletouch connected\n"); | 407 | /* save our data pointer in this interface device */ |
408 | usb_set_intfdata(iface, dev); | ||
402 | 409 | ||
403 | return 0; | 410 | return 0; |
404 | 411 | ||
405 | err_usbbufalloc: | 412 | err_free_urb: |
406 | usb_free_urb(dev->urb); | 413 | usb_free_urb(dev->urb); |
407 | err_usballoc: | 414 | err_free_devs: |
408 | usb_set_intfdata(iface, NULL); | 415 | usb_set_intfdata(iface, NULL); |
409 | err_endpoint: | ||
410 | kfree(dev); | 416 | kfree(dev); |
411 | err_kmalloc: | 417 | input_free_device(input_dev); |
412 | return retval; | 418 | return retval; |
413 | } | 419 | } |
414 | 420 | ||
@@ -419,7 +425,7 @@ static void atp_disconnect(struct usb_interface *iface) | |||
419 | usb_set_intfdata(iface, NULL); | 425 | usb_set_intfdata(iface, NULL); |
420 | if (dev) { | 426 | if (dev) { |
421 | usb_kill_urb(dev->urb); | 427 | usb_kill_urb(dev->urb); |
422 | input_unregister_device(&dev->input); | 428 | input_unregister_device(dev->input); |
423 | usb_free_urb(dev->urb); | 429 | usb_free_urb(dev->urb); |
424 | usb_buffer_free(dev->udev, ATP_DATASIZE, | 430 | usb_buffer_free(dev->udev, ATP_DATASIZE, |
425 | dev->data, dev->urb->transfer_dma); | 431 | dev->data, dev->urb->transfer_dma); |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index fd99681ee483..9a2a47db9494 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -112,7 +112,6 @@ | |||
112 | 112 | ||
113 | #define NAME_BUFSIZE 80 /* size of product name, path buffers */ | 113 | #define NAME_BUFSIZE 80 /* size of product name, path buffers */ |
114 | #define DATA_BUFSIZE 63 /* size of URB data buffers */ | 114 | #define DATA_BUFSIZE 63 /* size of URB data buffers */ |
115 | #define ATI_INPUTNUM 1 /* Which input device to register as */ | ||
116 | 115 | ||
117 | static unsigned long channel_mask; | 116 | static unsigned long channel_mask; |
118 | module_param(channel_mask, ulong, 0444); | 117 | module_param(channel_mask, ulong, 0444); |
@@ -162,7 +161,7 @@ static char accel[] = { 1, 2, 4, 6, 9, 13, 20 }; | |||
162 | static DECLARE_MUTEX(disconnect_sem); | 161 | static DECLARE_MUTEX(disconnect_sem); |
163 | 162 | ||
164 | struct ati_remote { | 163 | struct ati_remote { |
165 | struct input_dev idev; | 164 | struct input_dev *idev; |
166 | struct usb_device *udev; | 165 | struct usb_device *udev; |
167 | struct usb_interface *interface; | 166 | struct usb_interface *interface; |
168 | 167 | ||
@@ -198,15 +197,13 @@ struct ati_remote { | |||
198 | #define KIND_ACCEL 7 /* Directional keypad - left, right, up, down.*/ | 197 | #define KIND_ACCEL 7 /* Directional keypad - left, right, up, down.*/ |
199 | 198 | ||
200 | /* Translation table from hardware messages to input events. */ | 199 | /* Translation table from hardware messages to input events. */ |
201 | static struct | 200 | static struct { |
202 | { | ||
203 | short kind; | 201 | short kind; |
204 | unsigned char data1, data2; | 202 | unsigned char data1, data2; |
205 | int type; | 203 | int type; |
206 | unsigned int code; | 204 | unsigned int code; |
207 | int value; | 205 | int value; |
208 | } ati_remote_tbl[] = | 206 | } ati_remote_tbl[] = { |
209 | { | ||
210 | /* Directional control pad axes */ | 207 | /* Directional control pad axes */ |
211 | {KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */ | 208 | {KIND_ACCEL, 0x35, 0x70, EV_REL, REL_X, -1}, /* left */ |
212 | {KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */ | 209 | {KIND_ACCEL, 0x36, 0x71, EV_REL, REL_X, 1}, /* right */ |
@@ -286,7 +283,6 @@ static struct | |||
286 | 283 | ||
287 | /* Local function prototypes */ | 284 | /* Local function prototypes */ |
288 | static void ati_remote_dump (unsigned char *data, unsigned int actual_length); | 285 | static void ati_remote_dump (unsigned char *data, unsigned int actual_length); |
289 | static void ati_remote_delete (struct ati_remote *dev); | ||
290 | static int ati_remote_open (struct input_dev *inputdev); | 286 | static int ati_remote_open (struct input_dev *inputdev); |
291 | static void ati_remote_close (struct input_dev *inputdev); | 287 | static void ati_remote_close (struct input_dev *inputdev); |
292 | static int ati_remote_sendpacket (struct ati_remote *ati_remote, u16 cmd, unsigned char *data); | 288 | static int ati_remote_sendpacket (struct ati_remote *ati_remote, u16 cmd, unsigned char *data); |
@@ -428,7 +424,7 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs) | |||
428 | { | 424 | { |
429 | struct ati_remote *ati_remote = urb->context; | 425 | struct ati_remote *ati_remote = urb->context; |
430 | unsigned char *data= ati_remote->inbuf; | 426 | unsigned char *data= ati_remote->inbuf; |
431 | struct input_dev *dev = &ati_remote->idev; | 427 | struct input_dev *dev = ati_remote->idev; |
432 | int index, acc; | 428 | int index, acc; |
433 | int remote_num; | 429 | int remote_num; |
434 | 430 | ||
@@ -587,38 +583,55 @@ static void ati_remote_irq_in(struct urb *urb, struct pt_regs *regs) | |||
587 | } | 583 | } |
588 | 584 | ||
589 | /* | 585 | /* |
590 | * ati_remote_delete | 586 | * ati_remote_alloc_buffers |
591 | */ | 587 | */ |
592 | static void ati_remote_delete(struct ati_remote *ati_remote) | 588 | static int ati_remote_alloc_buffers(struct usb_device *udev, |
589 | struct ati_remote *ati_remote) | ||
593 | { | 590 | { |
594 | if (ati_remote->irq_urb) | 591 | ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC, |
595 | usb_kill_urb(ati_remote->irq_urb); | 592 | &ati_remote->inbuf_dma); |
593 | if (!ati_remote->inbuf) | ||
594 | return -1; | ||
596 | 595 | ||
597 | if (ati_remote->out_urb) | 596 | ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC, |
598 | usb_kill_urb(ati_remote->out_urb); | 597 | &ati_remote->outbuf_dma); |
598 | if (!ati_remote->outbuf) | ||
599 | return -1; | ||
599 | 600 | ||
600 | input_unregister_device(&ati_remote->idev); | 601 | ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); |
602 | if (!ati_remote->irq_urb) | ||
603 | return -1; | ||
601 | 604 | ||
602 | if (ati_remote->inbuf) | 605 | ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL); |
603 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 606 | if (!ati_remote->out_urb) |
604 | ati_remote->inbuf, ati_remote->inbuf_dma); | 607 | return -1; |
605 | 608 | ||
606 | if (ati_remote->outbuf) | 609 | return 0; |
607 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 610 | } |
608 | ati_remote->outbuf, ati_remote->outbuf_dma); | ||
609 | 611 | ||
612 | /* | ||
613 | * ati_remote_free_buffers | ||
614 | */ | ||
615 | static void ati_remote_free_buffers(struct ati_remote *ati_remote) | ||
616 | { | ||
610 | if (ati_remote->irq_urb) | 617 | if (ati_remote->irq_urb) |
611 | usb_free_urb(ati_remote->irq_urb); | 618 | usb_free_urb(ati_remote->irq_urb); |
612 | 619 | ||
613 | if (ati_remote->out_urb) | 620 | if (ati_remote->out_urb) |
614 | usb_free_urb(ati_remote->out_urb); | 621 | usb_free_urb(ati_remote->out_urb); |
615 | 622 | ||
616 | kfree(ati_remote); | 623 | if (ati_remote->inbuf) |
624 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | ||
625 | ati_remote->inbuf, ati_remote->inbuf_dma); | ||
626 | |||
627 | if (ati_remote->outbuf) | ||
628 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | ||
629 | ati_remote->inbuf, ati_remote->outbuf_dma); | ||
617 | } | 630 | } |
618 | 631 | ||
619 | static void ati_remote_input_init(struct ati_remote *ati_remote) | 632 | static void ati_remote_input_init(struct ati_remote *ati_remote) |
620 | { | 633 | { |
621 | struct input_dev *idev = &(ati_remote->idev); | 634 | struct input_dev *idev = ati_remote->idev; |
622 | int i; | 635 | int i; |
623 | 636 | ||
624 | idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | 637 | idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
@@ -637,7 +650,7 @@ static void ati_remote_input_init(struct ati_remote *ati_remote) | |||
637 | idev->phys = ati_remote->phys; | 650 | idev->phys = ati_remote->phys; |
638 | 651 | ||
639 | usb_to_input_id(ati_remote->udev, &idev->id); | 652 | usb_to_input_id(ati_remote->udev, &idev->id); |
640 | idev->dev = &ati_remote->udev->dev; | 653 | idev->cdev.dev = &ati_remote->udev->dev; |
641 | } | 654 | } |
642 | 655 | ||
643 | static int ati_remote_initialize(struct ati_remote *ati_remote) | 656 | static int ati_remote_initialize(struct ati_remote *ati_remote) |
@@ -674,7 +687,7 @@ static int ati_remote_initialize(struct ati_remote *ati_remote) | |||
674 | (ati_remote_sendpacket(ati_remote, 0x8007, init2))) { | 687 | (ati_remote_sendpacket(ati_remote, 0x8007, init2))) { |
675 | dev_err(&ati_remote->interface->dev, | 688 | dev_err(&ati_remote->interface->dev, |
676 | "Initializing ati_remote hardware failed.\n"); | 689 | "Initializing ati_remote hardware failed.\n"); |
677 | return 1; | 690 | return -EIO; |
678 | } | 691 | } |
679 | 692 | ||
680 | return 0; | 693 | return 0; |
@@ -686,95 +699,83 @@ static int ati_remote_initialize(struct ati_remote *ati_remote) | |||
686 | static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id) | 699 | static int ati_remote_probe(struct usb_interface *interface, const struct usb_device_id *id) |
687 | { | 700 | { |
688 | struct usb_device *udev = interface_to_usbdev(interface); | 701 | struct usb_device *udev = interface_to_usbdev(interface); |
689 | struct ati_remote *ati_remote = NULL; | 702 | struct usb_host_interface *iface_host = interface->cur_altsetting; |
690 | struct usb_host_interface *iface_host; | 703 | struct usb_endpoint_descriptor *endpoint_in, *endpoint_out; |
691 | int retval = -ENOMEM; | 704 | struct ati_remote *ati_remote; |
692 | char path[64]; | 705 | struct input_dev *input_dev; |
693 | 706 | int err = -ENOMEM; | |
694 | /* Allocate and clear an ati_remote struct */ | ||
695 | if (!(ati_remote = kmalloc(sizeof (struct ati_remote), GFP_KERNEL))) | ||
696 | return -ENOMEM; | ||
697 | memset(ati_remote, 0x00, sizeof (struct ati_remote)); | ||
698 | 707 | ||
699 | iface_host = interface->cur_altsetting; | ||
700 | if (iface_host->desc.bNumEndpoints != 2) { | 708 | if (iface_host->desc.bNumEndpoints != 2) { |
701 | err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__); | 709 | err("%s: Unexpected desc.bNumEndpoints\n", __FUNCTION__); |
702 | retval = -ENODEV; | 710 | return -ENODEV; |
703 | goto error; | ||
704 | } | 711 | } |
705 | 712 | ||
706 | ati_remote->endpoint_in = &(iface_host->endpoint[0].desc); | 713 | endpoint_in = &iface_host->endpoint[0].desc; |
707 | ati_remote->endpoint_out = &(iface_host->endpoint[1].desc); | 714 | endpoint_out = &iface_host->endpoint[1].desc; |
708 | ati_remote->udev = udev; | ||
709 | ati_remote->interface = interface; | ||
710 | 715 | ||
711 | if (!(ati_remote->endpoint_in->bEndpointAddress & 0x80)) { | 716 | if (!(endpoint_in->bEndpointAddress & USB_DIR_IN)) { |
712 | err("%s: Unexpected endpoint_in->bEndpointAddress\n", __FUNCTION__); | 717 | err("%s: Unexpected endpoint_in->bEndpointAddress\n", __FUNCTION__); |
713 | retval = -ENODEV; | 718 | return -ENODEV; |
714 | goto error; | ||
715 | } | 719 | } |
716 | if ((ati_remote->endpoint_in->bmAttributes & 3) != 3) { | 720 | if ((endpoint_in->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) { |
717 | err("%s: Unexpected endpoint_in->bmAttributes\n", __FUNCTION__); | 721 | err("%s: Unexpected endpoint_in->bmAttributes\n", __FUNCTION__); |
718 | retval = -ENODEV; | 722 | return -ENODEV; |
719 | goto error; | ||
720 | } | 723 | } |
721 | if (le16_to_cpu(ati_remote->endpoint_in->wMaxPacketSize) == 0) { | 724 | if (le16_to_cpu(endpoint_in->wMaxPacketSize) == 0) { |
722 | err("%s: endpoint_in message size==0? \n", __FUNCTION__); | 725 | err("%s: endpoint_in message size==0? \n", __FUNCTION__); |
723 | retval = -ENODEV; | 726 | return -ENODEV; |
724 | goto error; | ||
725 | } | 727 | } |
726 | 728 | ||
727 | /* Allocate URB buffers, URBs */ | 729 | ati_remote = kzalloc(sizeof (struct ati_remote), GFP_KERNEL); |
728 | ati_remote->inbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC, | 730 | input_dev = input_allocate_device(); |
729 | &ati_remote->inbuf_dma); | 731 | if (!ati_remote || !input_dev) |
730 | if (!ati_remote->inbuf) | 732 | goto fail1; |
731 | goto error; | ||
732 | 733 | ||
733 | ati_remote->outbuf = usb_buffer_alloc(udev, DATA_BUFSIZE, SLAB_ATOMIC, | 734 | /* Allocate URB buffers, URBs */ |
734 | &ati_remote->outbuf_dma); | 735 | if (ati_remote_alloc_buffers(udev, ati_remote)) |
735 | if (!ati_remote->outbuf) | 736 | goto fail2; |
736 | goto error; | ||
737 | 737 | ||
738 | ati_remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); | 738 | ati_remote->endpoint_in = endpoint_in; |
739 | if (!ati_remote->irq_urb) | 739 | ati_remote->endpoint_out = endpoint_out; |
740 | goto error; | 740 | ati_remote->udev = udev; |
741 | ati_remote->idev = input_dev; | ||
742 | ati_remote->interface = interface; | ||
741 | 743 | ||
742 | ati_remote->out_urb = usb_alloc_urb(0, GFP_KERNEL); | 744 | usb_make_path(udev, ati_remote->phys, sizeof(ati_remote->phys)); |
743 | if (!ati_remote->out_urb) | 745 | strlcpy(ati_remote->phys, "/input0", sizeof(ati_remote->phys)); |
744 | goto error; | ||
745 | 746 | ||
746 | usb_make_path(udev, path, NAME_BUFSIZE); | ||
747 | sprintf(ati_remote->phys, "%s/input%d", path, ATI_INPUTNUM); | ||
748 | if (udev->manufacturer) | 747 | if (udev->manufacturer) |
749 | strcat(ati_remote->name, udev->manufacturer); | 748 | strlcpy(ati_remote->name, udev->manufacturer, sizeof(ati_remote->name)); |
750 | 749 | ||
751 | if (udev->product) | 750 | if (udev->product) |
752 | sprintf(ati_remote->name, "%s %s", ati_remote->name, udev->product); | 751 | snprintf(ati_remote->name, sizeof(ati_remote->name), |
752 | "%s %s", ati_remote->name, udev->product); | ||
753 | 753 | ||
754 | if (!strlen(ati_remote->name)) | 754 | if (!strlen(ati_remote->name)) |
755 | sprintf(ati_remote->name, DRIVER_DESC "(%04x,%04x)", | 755 | snprintf(ati_remote->name, sizeof(ati_remote->name), |
756 | DRIVER_DESC "(%04x,%04x)", | ||
756 | le16_to_cpu(ati_remote->udev->descriptor.idVendor), | 757 | le16_to_cpu(ati_remote->udev->descriptor.idVendor), |
757 | le16_to_cpu(ati_remote->udev->descriptor.idProduct)); | 758 | le16_to_cpu(ati_remote->udev->descriptor.idProduct)); |
758 | 759 | ||
760 | ati_remote_input_init(ati_remote); | ||
761 | |||
759 | /* Device Hardware Initialization - fills in ati_remote->idev from udev. */ | 762 | /* Device Hardware Initialization - fills in ati_remote->idev from udev. */ |
760 | retval = ati_remote_initialize(ati_remote); | 763 | err = ati_remote_initialize(ati_remote); |
761 | if (retval) | 764 | if (err) |
762 | goto error; | 765 | goto fail3; |
763 | 766 | ||
764 | /* Set up and register input device */ | 767 | /* Set up and register input device */ |
765 | ati_remote_input_init(ati_remote); | 768 | input_register_device(ati_remote->idev); |
766 | input_register_device(&ati_remote->idev); | ||
767 | |||
768 | dev_info(&ati_remote->interface->dev, "Input registered: %s on %s\n", | ||
769 | ati_remote->name, path); | ||
770 | 769 | ||
771 | usb_set_intfdata(interface, ati_remote); | 770 | usb_set_intfdata(interface, ati_remote); |
771 | return 0; | ||
772 | 772 | ||
773 | error: | 773 | fail3: usb_kill_urb(ati_remote->irq_urb); |
774 | if (retval) | 774 | usb_kill_urb(ati_remote->out_urb); |
775 | ati_remote_delete(ati_remote); | 775 | fail2: ati_remote_free_buffers(ati_remote); |
776 | 776 | fail1: input_free_device(input_dev); | |
777 | return retval; | 777 | kfree(ati_remote); |
778 | return err; | ||
778 | } | 779 | } |
779 | 780 | ||
780 | /* | 781 | /* |
@@ -791,7 +792,11 @@ static void ati_remote_disconnect(struct usb_interface *interface) | |||
791 | return; | 792 | return; |
792 | } | 793 | } |
793 | 794 | ||
794 | ati_remote_delete(ati_remote); | 795 | usb_kill_urb(ati_remote->irq_urb); |
796 | usb_kill_urb(ati_remote->out_urb); | ||
797 | input_unregister_device(ati_remote->idev); | ||
798 | ati_remote_free_buffers(ati_remote); | ||
799 | kfree(ati_remote); | ||
795 | } | 800 | } |
796 | 801 | ||
797 | /* | 802 | /* |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 41f92b924761..411a0645a7a3 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -1619,8 +1619,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
1619 | struct hid_descriptor *hdesc; | 1619 | struct hid_descriptor *hdesc; |
1620 | struct hid_device *hid; | 1620 | struct hid_device *hid; |
1621 | unsigned quirks = 0, rsize = 0; | 1621 | unsigned quirks = 0, rsize = 0; |
1622 | char *buf, *rdesc; | 1622 | char *rdesc; |
1623 | int n, insize = 0; | 1623 | int n, len, insize = 0; |
1624 | 1624 | ||
1625 | for (n = 0; hid_blacklist[n].idVendor; n++) | 1625 | for (n = 0; hid_blacklist[n].idVendor; n++) |
1626 | if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) && | 1626 | if ((hid_blacklist[n].idVendor == le16_to_cpu(dev->descriptor.idVendor)) && |
@@ -1630,10 +1630,11 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
1630 | if (quirks & HID_QUIRK_IGNORE) | 1630 | if (quirks & HID_QUIRK_IGNORE) |
1631 | return NULL; | 1631 | return NULL; |
1632 | 1632 | ||
1633 | if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && ((!interface->desc.bNumEndpoints) || | 1633 | if (usb_get_extra_descriptor(interface, HID_DT_HID, &hdesc) && |
1634 | usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) { | 1634 | (!interface->desc.bNumEndpoints || |
1635 | dbg("class descriptor not present\n"); | 1635 | usb_get_extra_descriptor(&interface->endpoint[0], HID_DT_HID, &hdesc))) { |
1636 | return NULL; | 1636 | dbg("class descriptor not present\n"); |
1637 | return NULL; | ||
1637 | } | 1638 | } |
1638 | 1639 | ||
1639 | for (n = 0; n < hdesc->bNumDescriptors; n++) | 1640 | for (n = 0; n < hdesc->bNumDescriptors; n++) |
@@ -1749,32 +1750,34 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
1749 | 1750 | ||
1750 | hid->name[0] = 0; | 1751 | hid->name[0] = 0; |
1751 | 1752 | ||
1752 | if (!(buf = kmalloc(64, GFP_KERNEL))) | 1753 | if (dev->manufacturer) |
1753 | goto fail; | 1754 | strlcpy(hid->name, dev->manufacturer, sizeof(hid->name)); |
1755 | |||
1756 | if (dev->product) { | ||
1757 | if (dev->manufacturer) | ||
1758 | strlcat(hid->name, " ", sizeof(hid->name)); | ||
1759 | strlcat(hid->name, dev->product, sizeof(hid->name)); | ||
1760 | } | ||
1761 | |||
1762 | if (!strlen(hid->name)) | ||
1763 | snprintf(hid->name, sizeof(hid->name), "HID %04x:%04x", | ||
1764 | le16_to_cpu(dev->descriptor.idVendor), | ||
1765 | le16_to_cpu(dev->descriptor.idProduct)); | ||
1754 | 1766 | ||
1755 | if (dev->manufacturer) { | 1767 | usb_make_path(dev, hid->phys, sizeof(hid->phys)); |
1756 | strcat(hid->name, dev->manufacturer); | 1768 | strlcat(hid->phys, "/input", sizeof(hid->phys)); |
1757 | if (dev->product) | 1769 | len = strlen(hid->phys); |
1758 | snprintf(hid->name, 64, "%s %s", hid->name, dev->product); | 1770 | if (len < sizeof(hid->phys) - 1) |
1759 | } else if (dev->product) { | 1771 | snprintf(hid->phys + len, sizeof(hid->phys) - len, |
1760 | snprintf(hid->name, 128, "%s", dev->product); | 1772 | "%d", intf->altsetting[0].desc.bInterfaceNumber); |
1761 | } else | ||
1762 | snprintf(hid->name, 128, "%04x:%04x", | ||
1763 | le16_to_cpu(dev->descriptor.idVendor), | ||
1764 | le16_to_cpu(dev->descriptor.idProduct)); | ||
1765 | |||
1766 | usb_make_path(dev, buf, 64); | ||
1767 | snprintf(hid->phys, 64, "%s/input%d", buf, | ||
1768 | intf->altsetting[0].desc.bInterfaceNumber); | ||
1769 | 1773 | ||
1770 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) | 1774 | if (usb_string(dev, dev->descriptor.iSerialNumber, hid->uniq, 64) <= 0) |
1771 | hid->uniq[0] = 0; | 1775 | hid->uniq[0] = 0; |
1772 | 1776 | ||
1773 | kfree(buf); | ||
1774 | |||
1775 | hid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); | 1777 | hid->urbctrl = usb_alloc_urb(0, GFP_KERNEL); |
1776 | if (!hid->urbctrl) | 1778 | if (!hid->urbctrl) |
1777 | goto fail; | 1779 | goto fail; |
1780 | |||
1778 | usb_fill_control_urb(hid->urbctrl, dev, 0, (void *) hid->cr, | 1781 | usb_fill_control_urb(hid->urbctrl, dev, 0, (void *) hid->cr, |
1779 | hid->ctrlbuf, 1, hid_ctrl, hid); | 1782 | hid->ctrlbuf, 1, hid_ctrl, hid); |
1780 | hid->urbctrl->setup_dma = hid->cr_dma; | 1783 | hid->urbctrl->setup_dma = hid->cr_dma; |
diff --git a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c index 0b6452248a39..9ff25eb520a6 100644 --- a/drivers/usb/input/hid-input.c +++ b/drivers/usb/input/hid-input.c | |||
@@ -76,8 +76,8 @@ static struct { | |||
76 | static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field, | 76 | static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field, |
77 | struct hid_usage *usage) | 77 | struct hid_usage *usage) |
78 | { | 78 | { |
79 | struct input_dev *input = &hidinput->input; | 79 | struct input_dev *input = hidinput->input; |
80 | struct hid_device *device = hidinput->input.private; | 80 | struct hid_device *device = input->private; |
81 | int max = 0, code; | 81 | int max = 0, code; |
82 | unsigned long *bit = NULL; | 82 | unsigned long *bit = NULL; |
83 | 83 | ||
@@ -461,7 +461,8 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct | |||
461 | 461 | ||
462 | if (!field->hidinput) | 462 | if (!field->hidinput) |
463 | return; | 463 | return; |
464 | input = &field->hidinput->input; | 464 | |
465 | input = field->hidinput->input; | ||
465 | 466 | ||
466 | input_regs(input, regs); | 467 | input_regs(input, regs); |
467 | 468 | ||
@@ -533,13 +534,10 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct | |||
533 | 534 | ||
534 | void hidinput_report_event(struct hid_device *hid, struct hid_report *report) | 535 | void hidinput_report_event(struct hid_device *hid, struct hid_report *report) |
535 | { | 536 | { |
536 | struct list_head *lh; | ||
537 | struct hid_input *hidinput; | 537 | struct hid_input *hidinput; |
538 | 538 | ||
539 | list_for_each (lh, &hid->inputs) { | 539 | list_for_each_entry(hidinput, &hid->inputs, list) |
540 | hidinput = list_entry(lh, struct hid_input, list); | 540 | input_sync(hidinput->input); |
541 | input_sync(&hidinput->input); | ||
542 | } | ||
543 | } | 541 | } |
544 | 542 | ||
545 | static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field) | 543 | static int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field) |
@@ -604,6 +602,7 @@ int hidinput_connect(struct hid_device *hid) | |||
604 | struct usb_device *dev = hid->dev; | 602 | struct usb_device *dev = hid->dev; |
605 | struct hid_report *report; | 603 | struct hid_report *report; |
606 | struct hid_input *hidinput = NULL; | 604 | struct hid_input *hidinput = NULL; |
605 | struct input_dev *input_dev; | ||
607 | int i, j, k; | 606 | int i, j, k; |
608 | 607 | ||
609 | INIT_LIST_HEAD(&hid->inputs); | 608 | INIT_LIST_HEAD(&hid->inputs); |
@@ -624,25 +623,28 @@ int hidinput_connect(struct hid_device *hid) | |||
624 | continue; | 623 | continue; |
625 | 624 | ||
626 | if (!hidinput) { | 625 | if (!hidinput) { |
627 | hidinput = kmalloc(sizeof(*hidinput), GFP_KERNEL); | 626 | hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL); |
628 | if (!hidinput) { | 627 | input_dev = input_allocate_device(); |
628 | if (!hidinput || !input_dev) { | ||
629 | kfree(hidinput); | ||
630 | input_free_device(input_dev); | ||
629 | err("Out of memory during hid input probe"); | 631 | err("Out of memory during hid input probe"); |
630 | return -1; | 632 | return -1; |
631 | } | 633 | } |
632 | memset(hidinput, 0, sizeof(*hidinput)); | ||
633 | 634 | ||
634 | list_add_tail(&hidinput->list, &hid->inputs); | 635 | input_dev->private = hid; |
636 | input_dev->event = hidinput_input_event; | ||
637 | input_dev->open = hidinput_open; | ||
638 | input_dev->close = hidinput_close; | ||
635 | 639 | ||
636 | hidinput->input.private = hid; | 640 | input_dev->name = hid->name; |
637 | hidinput->input.event = hidinput_input_event; | 641 | input_dev->phys = hid->phys; |
638 | hidinput->input.open = hidinput_open; | 642 | input_dev->uniq = hid->uniq; |
639 | hidinput->input.close = hidinput_close; | 643 | usb_to_input_id(dev, &input_dev->id); |
644 | input_dev->cdev.dev = &hid->intf->dev; | ||
640 | 645 | ||
641 | hidinput->input.name = hid->name; | 646 | hidinput->input = input_dev; |
642 | hidinput->input.phys = hid->phys; | 647 | list_add_tail(&hidinput->list, &hid->inputs); |
643 | hidinput->input.uniq = hid->uniq; | ||
644 | usb_to_input_id(dev, &hidinput->input.id); | ||
645 | hidinput->input.dev = &hid->intf->dev; | ||
646 | } | 648 | } |
647 | 649 | ||
648 | for (i = 0; i < report->maxfield; i++) | 650 | for (i = 0; i < report->maxfield; i++) |
@@ -657,7 +659,7 @@ int hidinput_connect(struct hid_device *hid) | |||
657 | * UGCI) cram a lot of unrelated inputs into the | 659 | * UGCI) cram a lot of unrelated inputs into the |
658 | * same interface. */ | 660 | * same interface. */ |
659 | hidinput->report = report; | 661 | hidinput->report = report; |
660 | input_register_device(&hidinput->input); | 662 | input_register_device(hidinput->input); |
661 | hidinput = NULL; | 663 | hidinput = NULL; |
662 | } | 664 | } |
663 | } | 665 | } |
@@ -667,7 +669,7 @@ int hidinput_connect(struct hid_device *hid) | |||
667 | * only useful in this case, and not for multi-input quirks. */ | 669 | * only useful in this case, and not for multi-input quirks. */ |
668 | if (hidinput) { | 670 | if (hidinput) { |
669 | hid_ff_init(hid); | 671 | hid_ff_init(hid); |
670 | input_register_device(&hidinput->input); | 672 | input_register_device(hidinput->input); |
671 | } | 673 | } |
672 | 674 | ||
673 | return 0; | 675 | return 0; |
@@ -675,13 +677,11 @@ int hidinput_connect(struct hid_device *hid) | |||
675 | 677 | ||
676 | void hidinput_disconnect(struct hid_device *hid) | 678 | void hidinput_disconnect(struct hid_device *hid) |
677 | { | 679 | { |
678 | struct list_head *lh, *next; | 680 | struct hid_input *hidinput, *next; |
679 | struct hid_input *hidinput; | ||
680 | 681 | ||
681 | list_for_each_safe(lh, next, &hid->inputs) { | 682 | list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { |
682 | hidinput = list_entry(lh, struct hid_input, list); | ||
683 | input_unregister_device(&hidinput->input); | ||
684 | list_del(&hidinput->list); | 683 | list_del(&hidinput->list); |
684 | input_unregister_device(hidinput->input); | ||
685 | kfree(hidinput); | 685 | kfree(hidinput); |
686 | } | 686 | } |
687 | } | 687 | } |
diff --git a/drivers/usb/input/hid-lgff.c b/drivers/usb/input/hid-lgff.c index 0c4c77aa31ea..f82c9c9e5d51 100644 --- a/drivers/usb/input/hid-lgff.c +++ b/drivers/usb/input/hid-lgff.c | |||
@@ -255,22 +255,19 @@ static void hid_lgff_input_init(struct hid_device* hid) | |||
255 | u16 idVendor = le16_to_cpu(hid->dev->descriptor.idVendor); | 255 | u16 idVendor = le16_to_cpu(hid->dev->descriptor.idVendor); |
256 | u16 idProduct = le16_to_cpu(hid->dev->descriptor.idProduct); | 256 | u16 idProduct = le16_to_cpu(hid->dev->descriptor.idProduct); |
257 | struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); | 257 | struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); |
258 | struct input_dev *input_dev = hidinput->input; | ||
258 | 259 | ||
259 | while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct)) | 260 | while (dev->idVendor && (idVendor != dev->idVendor || idProduct != dev->idProduct)) |
260 | dev++; | 261 | dev++; |
261 | 262 | ||
262 | ff = dev->ff; | 263 | for (ff = dev->ff; *ff >= 0; ff++) |
264 | set_bit(*ff, input_dev->ffbit); | ||
263 | 265 | ||
264 | while (*ff >= 0) { | 266 | input_dev->upload_effect = hid_lgff_upload_effect; |
265 | set_bit(*ff, hidinput->input.ffbit); | 267 | input_dev->flush = hid_lgff_flush; |
266 | ++ff; | ||
267 | } | ||
268 | |||
269 | hidinput->input.upload_effect = hid_lgff_upload_effect; | ||
270 | hidinput->input.flush = hid_lgff_flush; | ||
271 | 268 | ||
272 | set_bit(EV_FF, hidinput->input.evbit); | 269 | set_bit(EV_FF, input_dev->evbit); |
273 | hidinput->input.ff_effects_max = LGFF_EFFECTS; | 270 | input_dev->ff_effects_max = LGFF_EFFECTS; |
274 | } | 271 | } |
275 | 272 | ||
276 | static void hid_lgff_exit(struct hid_device* hid) | 273 | static void hid_lgff_exit(struct hid_device* hid) |
diff --git a/drivers/usb/input/hid-tmff.c b/drivers/usb/input/hid-tmff.c index 8f6a0a6f94a9..023fd5ac31c8 100644 --- a/drivers/usb/input/hid-tmff.c +++ b/drivers/usb/input/hid-tmff.c | |||
@@ -111,6 +111,7 @@ int hid_tmff_init(struct hid_device *hid) | |||
111 | struct tmff_device *private; | 111 | struct tmff_device *private; |
112 | struct list_head *pos; | 112 | struct list_head *pos; |
113 | struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); | 113 | struct hid_input *hidinput = list_entry(hid->inputs.next, struct hid_input, list); |
114 | struct input_dev *input_dev = hidinput->input; | ||
114 | 115 | ||
115 | private = kmalloc(sizeof(struct tmff_device), GFP_KERNEL); | 116 | private = kmalloc(sizeof(struct tmff_device), GFP_KERNEL); |
116 | if (!private) | 117 | if (!private) |
@@ -155,7 +156,7 @@ int hid_tmff_init(struct hid_device *hid) | |||
155 | private->report = report; | 156 | private->report = report; |
156 | private->rumble = field; | 157 | private->rumble = field; |
157 | 158 | ||
158 | set_bit(FF_RUMBLE, hidinput->input.ffbit); | 159 | set_bit(FF_RUMBLE, input_dev->ffbit); |
159 | break; | 160 | break; |
160 | 161 | ||
161 | default: | 162 | default: |
@@ -164,11 +165,11 @@ int hid_tmff_init(struct hid_device *hid) | |||
164 | } | 165 | } |
165 | 166 | ||
166 | /* Fallthrough to here only when a valid usage is found */ | 167 | /* Fallthrough to here only when a valid usage is found */ |
167 | hidinput->input.upload_effect = hid_tmff_upload_effect; | 168 | input_dev->upload_effect = hid_tmff_upload_effect; |
168 | hidinput->input.flush = hid_tmff_flush; | 169 | input_dev->flush = hid_tmff_flush; |
169 | 170 | ||
170 | set_bit(EV_FF, hidinput->input.evbit); | 171 | set_bit(EV_FF, input_dev->evbit); |
171 | hidinput->input.ff_effects_max = TMFF_EFFECTS; | 172 | input_dev->ff_effects_max = TMFF_EFFECTS; |
172 | } | 173 | } |
173 | } | 174 | } |
174 | 175 | ||
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index ec2412c42f1e..ee48a2276104 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
@@ -371,7 +371,7 @@ struct hid_control_fifo { | |||
371 | struct hid_input { | 371 | struct hid_input { |
372 | struct list_head list; | 372 | struct list_head list; |
373 | struct hid_report *report; | 373 | struct hid_report *report; |
374 | struct input_dev input; | 374 | struct input_dev *input; |
375 | }; | 375 | }; |
376 | 376 | ||
377 | struct hid_device { /* device report descriptor */ | 377 | struct hid_device { /* device report descriptor */ |
diff --git a/drivers/usb/input/itmtouch.c b/drivers/usb/input/itmtouch.c index becb87efb869..3b581853cf10 100644 --- a/drivers/usb/input/itmtouch.c +++ b/drivers/usb/input/itmtouch.c | |||
@@ -73,7 +73,7 @@ MODULE_LICENSE( DRIVER_LICENSE ); | |||
73 | 73 | ||
74 | struct itmtouch_dev { | 74 | struct itmtouch_dev { |
75 | struct usb_device *usbdev; /* usb device */ | 75 | struct usb_device *usbdev; /* usb device */ |
76 | struct input_dev inputdev; /* input device */ | 76 | struct input_dev *inputdev; /* input device */ |
77 | struct urb *readurb; /* urb */ | 77 | struct urb *readurb; /* urb */ |
78 | char rbuf[ITM_BUFSIZE]; /* data */ | 78 | char rbuf[ITM_BUFSIZE]; /* data */ |
79 | int users; | 79 | int users; |
@@ -88,9 +88,9 @@ static struct usb_device_id itmtouch_ids [] = { | |||
88 | 88 | ||
89 | static void itmtouch_irq(struct urb *urb, struct pt_regs *regs) | 89 | static void itmtouch_irq(struct urb *urb, struct pt_regs *regs) |
90 | { | 90 | { |
91 | struct itmtouch_dev * itmtouch = urb->context; | 91 | struct itmtouch_dev *itmtouch = urb->context; |
92 | unsigned char *data = urb->transfer_buffer; | 92 | unsigned char *data = urb->transfer_buffer; |
93 | struct input_dev *dev = &itmtouch->inputdev; | 93 | struct input_dev *dev = itmtouch->inputdev; |
94 | int retval; | 94 | int retval; |
95 | 95 | ||
96 | switch (urb->status) { | 96 | switch (urb->status) { |
@@ -156,49 +156,62 @@ static void itmtouch_close(struct input_dev *input) | |||
156 | static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id *id) | 156 | static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id *id) |
157 | { | 157 | { |
158 | struct itmtouch_dev *itmtouch; | 158 | struct itmtouch_dev *itmtouch; |
159 | struct input_dev *input_dev; | ||
159 | struct usb_host_interface *interface; | 160 | struct usb_host_interface *interface; |
160 | struct usb_endpoint_descriptor *endpoint; | 161 | struct usb_endpoint_descriptor *endpoint; |
161 | struct usb_device *udev = interface_to_usbdev(intf); | 162 | struct usb_device *udev = interface_to_usbdev(intf); |
162 | unsigned int pipe; | 163 | unsigned int pipe; |
163 | unsigned int maxp; | 164 | unsigned int maxp; |
164 | char path[PATH_SIZE]; | ||
165 | 165 | ||
166 | interface = intf->cur_altsetting; | 166 | interface = intf->cur_altsetting; |
167 | endpoint = &interface->endpoint[0].desc; | 167 | endpoint = &interface->endpoint[0].desc; |
168 | 168 | ||
169 | if (!(itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL))) { | 169 | itmtouch = kzalloc(sizeof(struct itmtouch_dev), GFP_KERNEL); |
170 | input_dev = input_allocate_device(); | ||
171 | if (!itmtouch || !input_dev) { | ||
170 | err("%s - Out of memory.", __FUNCTION__); | 172 | err("%s - Out of memory.", __FUNCTION__); |
171 | return -ENOMEM; | 173 | goto fail; |
172 | } | 174 | } |
173 | 175 | ||
174 | itmtouch->usbdev = udev; | 176 | itmtouch->usbdev = udev; |
177 | itmtouch->inputdev = input_dev; | ||
175 | 178 | ||
176 | itmtouch->inputdev.private = itmtouch; | 179 | if (udev->manufacturer) |
177 | itmtouch->inputdev.open = itmtouch_open; | 180 | strlcpy(itmtouch->name, udev->manufacturer, sizeof(itmtouch->name)); |
178 | itmtouch->inputdev.close = itmtouch_close; | ||
179 | 181 | ||
180 | usb_make_path(udev, path, PATH_SIZE); | 182 | if (udev->product) { |
181 | 183 | if (udev->manufacturer) | |
182 | itmtouch->inputdev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 184 | strlcat(itmtouch->name, " ", sizeof(itmtouch->name)); |
183 | itmtouch->inputdev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | 185 | strlcat(itmtouch->name, udev->product, sizeof(itmtouch->name)); |
184 | itmtouch->inputdev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | 186 | } |
185 | |||
186 | itmtouch->inputdev.name = itmtouch->name; | ||
187 | itmtouch->inputdev.phys = itmtouch->phys; | ||
188 | usb_to_input_id(udev, &itmtouch->inputdev.id); | ||
189 | itmtouch->inputdev.dev = &intf->dev; | ||
190 | 187 | ||
191 | if (!strlen(itmtouch->name)) | 188 | if (!strlen(itmtouch->name)) |
192 | sprintf(itmtouch->name, "USB ITM touchscreen"); | 189 | sprintf(itmtouch->name, "USB ITM touchscreen"); |
193 | 190 | ||
191 | usb_make_path(udev, itmtouch->phys, sizeof(itmtouch->phys)); | ||
192 | strlcpy(itmtouch->phys, "/input0", sizeof(itmtouch->phys)); | ||
193 | |||
194 | input_dev->name = itmtouch->name; | ||
195 | input_dev->phys = itmtouch->phys; | ||
196 | usb_to_input_id(udev, &input_dev->id); | ||
197 | input_dev->cdev.dev = &intf->dev; | ||
198 | input_dev->private = itmtouch; | ||
199 | |||
200 | input_dev->open = itmtouch_open; | ||
201 | input_dev->close = itmtouch_close; | ||
202 | |||
203 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
204 | input_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | ||
205 | input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
206 | |||
194 | /* device limits */ | 207 | /* device limits */ |
195 | /* as specified by the ITM datasheet, X and Y are 12bit, | 208 | /* as specified by the ITM datasheet, X and Y are 12bit, |
196 | * Z (pressure) is 8 bit. However, the fields are defined up | 209 | * Z (pressure) is 8 bit. However, the fields are defined up |
197 | * to 14 bits for future possible expansion. | 210 | * to 14 bits for future possible expansion. |
198 | */ | 211 | */ |
199 | input_set_abs_params(&itmtouch->inputdev, ABS_X, 0, 0x0FFF, 2, 0); | 212 | input_set_abs_params(input_dev, ABS_X, 0, 0x0FFF, 2, 0); |
200 | input_set_abs_params(&itmtouch->inputdev, ABS_Y, 0, 0x0FFF, 2, 0); | 213 | input_set_abs_params(input_dev, ABS_Y, 0, 0x0FFF, 2, 0); |
201 | input_set_abs_params(&itmtouch->inputdev, ABS_PRESSURE, 0, 0xFF, 2, 0); | 214 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xFF, 2, 0); |
202 | 215 | ||
203 | /* initialise the URB so we can read from the transport stream */ | 216 | /* initialise the URB so we can read from the transport stream */ |
204 | pipe = usb_rcvintpipe(itmtouch->usbdev, endpoint->bEndpointAddress); | 217 | pipe = usb_rcvintpipe(itmtouch->usbdev, endpoint->bEndpointAddress); |
@@ -208,22 +221,23 @@ static int itmtouch_probe(struct usb_interface *intf, const struct usb_device_id | |||
208 | maxp = ITM_BUFSIZE; | 221 | maxp = ITM_BUFSIZE; |
209 | 222 | ||
210 | itmtouch->readurb = usb_alloc_urb(0, GFP_KERNEL); | 223 | itmtouch->readurb = usb_alloc_urb(0, GFP_KERNEL); |
211 | |||
212 | if (!itmtouch->readurb) { | 224 | if (!itmtouch->readurb) { |
213 | dbg("%s - usb_alloc_urb failed: itmtouch->readurb", __FUNCTION__); | 225 | dbg("%s - usb_alloc_urb failed: itmtouch->readurb", __FUNCTION__); |
214 | kfree(itmtouch); | 226 | goto fail; |
215 | return -ENOMEM; | ||
216 | } | 227 | } |
217 | 228 | ||
218 | usb_fill_int_urb(itmtouch->readurb, itmtouch->usbdev, pipe, itmtouch->rbuf, | 229 | usb_fill_int_urb(itmtouch->readurb, itmtouch->usbdev, pipe, itmtouch->rbuf, |
219 | maxp, itmtouch_irq, itmtouch, endpoint->bInterval); | 230 | maxp, itmtouch_irq, itmtouch, endpoint->bInterval); |
220 | 231 | ||
221 | input_register_device(&itmtouch->inputdev); | 232 | input_register_device(itmtouch->inputdev); |
222 | 233 | ||
223 | printk(KERN_INFO "itmtouch: %s registered on %s\n", itmtouch->name, path); | ||
224 | usb_set_intfdata(intf, itmtouch); | 234 | usb_set_intfdata(intf, itmtouch); |
225 | 235 | ||
226 | return 0; | 236 | return 0; |
237 | |||
238 | fail: input_free_device(input_dev); | ||
239 | kfree(itmtouch); | ||
240 | return -ENOMEM; | ||
227 | } | 241 | } |
228 | 242 | ||
229 | static void itmtouch_disconnect(struct usb_interface *intf) | 243 | static void itmtouch_disconnect(struct usb_interface *intf) |
@@ -233,7 +247,7 @@ static void itmtouch_disconnect(struct usb_interface *intf) | |||
233 | usb_set_intfdata(intf, NULL); | 247 | usb_set_intfdata(intf, NULL); |
234 | 248 | ||
235 | if (itmtouch) { | 249 | if (itmtouch) { |
236 | input_unregister_device(&itmtouch->inputdev); | 250 | input_unregister_device(itmtouch->inputdev); |
237 | usb_kill_urb(itmtouch->readurb); | 251 | usb_kill_urb(itmtouch->readurb); |
238 | usb_free_urb(itmtouch->readurb); | 252 | usb_free_urb(itmtouch->readurb); |
239 | kfree(itmtouch); | 253 | kfree(itmtouch); |
diff --git a/drivers/usb/input/kbtab.c b/drivers/usb/input/kbtab.c index b6f6ac8d9c2f..a248664b5d1d 100644 --- a/drivers/usb/input/kbtab.c +++ b/drivers/usb/input/kbtab.c | |||
@@ -34,7 +34,7 @@ MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks"); | |||
34 | struct kbtab { | 34 | struct kbtab { |
35 | signed char *data; | 35 | signed char *data; |
36 | dma_addr_t data_dma; | 36 | dma_addr_t data_dma; |
37 | struct input_dev dev; | 37 | struct input_dev *dev; |
38 | struct usb_device *usbdev; | 38 | struct usb_device *usbdev; |
39 | struct urb *irq; | 39 | struct urb *irq; |
40 | int x, y; | 40 | int x, y; |
@@ -48,7 +48,7 @@ static void kbtab_irq(struct urb *urb, struct pt_regs *regs) | |||
48 | { | 48 | { |
49 | struct kbtab *kbtab = urb->context; | 49 | struct kbtab *kbtab = urb->context; |
50 | unsigned char *data = kbtab->data; | 50 | unsigned char *data = kbtab->data; |
51 | struct input_dev *dev = &kbtab->dev; | 51 | struct input_dev *dev = kbtab->dev; |
52 | int retval; | 52 | int retval; |
53 | 53 | ||
54 | switch (urb->status) { | 54 | switch (urb->status) { |
@@ -124,53 +124,43 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
124 | struct usb_device *dev = interface_to_usbdev(intf); | 124 | struct usb_device *dev = interface_to_usbdev(intf); |
125 | struct usb_endpoint_descriptor *endpoint; | 125 | struct usb_endpoint_descriptor *endpoint; |
126 | struct kbtab *kbtab; | 126 | struct kbtab *kbtab; |
127 | char path[64]; | 127 | struct input_dev *input_dev; |
128 | 128 | ||
129 | if (!(kbtab = kmalloc(sizeof(struct kbtab), GFP_KERNEL))) | 129 | kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL); |
130 | return -ENOMEM; | 130 | input_dev = input_allocate_device(); |
131 | memset(kbtab, 0, sizeof(struct kbtab)); | 131 | if (!kbtab || !input_dev) |
132 | goto fail1; | ||
132 | 133 | ||
133 | kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma); | 134 | kbtab->data = usb_buffer_alloc(dev, 8, GFP_KERNEL, &kbtab->data_dma); |
134 | if (!kbtab->data) { | 135 | if (!kbtab->data) |
135 | kfree(kbtab); | 136 | goto fail1; |
136 | return -ENOMEM; | ||
137 | } | ||
138 | 137 | ||
139 | kbtab->irq = usb_alloc_urb(0, GFP_KERNEL); | 138 | kbtab->irq = usb_alloc_urb(0, GFP_KERNEL); |
140 | if (!kbtab->irq) { | 139 | if (!kbtab->irq) |
141 | usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma); | 140 | goto fail2; |
142 | kfree(kbtab); | ||
143 | return -ENOMEM; | ||
144 | } | ||
145 | |||
146 | kbtab->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC); | ||
147 | kbtab->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | ||
148 | |||
149 | kbtab->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | ||
150 | |||
151 | kbtab->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH); | ||
152 | 141 | ||
153 | kbtab->dev.mscbit[0] |= BIT(MSC_SERIAL); | 142 | kbtab->usbdev = dev; |
154 | 143 | kbtab->dev = input_dev; | |
155 | kbtab->dev.absmax[ABS_X] = 0x2000; | ||
156 | kbtab->dev.absmax[ABS_Y] = 0x1750; | ||
157 | kbtab->dev.absmax[ABS_PRESSURE] = 0xff; | ||
158 | 144 | ||
159 | kbtab->dev.absfuzz[ABS_X] = 4; | 145 | usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys)); |
160 | kbtab->dev.absfuzz[ABS_Y] = 4; | 146 | strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys)); |
161 | 147 | ||
162 | kbtab->dev.private = kbtab; | 148 | input_dev->name = "KB Gear Tablet"; |
163 | kbtab->dev.open = kbtab_open; | 149 | input_dev->phys = kbtab->phys; |
164 | kbtab->dev.close = kbtab_close; | 150 | usb_to_input_id(dev, &input_dev->id); |
151 | input_dev->cdev.dev = &intf->dev; | ||
152 | input_dev->private = kbtab; | ||
165 | 153 | ||
166 | usb_make_path(dev, path, 64); | 154 | input_dev->open = kbtab_open; |
167 | sprintf(kbtab->phys, "%s/input0", path); | 155 | input_dev->close = kbtab_close; |
168 | 156 | ||
169 | kbtab->dev.name = "KB Gear Tablet"; | 157 | input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_MSC); |
170 | kbtab->dev.phys = kbtab->phys; | 158 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); |
171 | usb_to_input_id(dev, &kbtab->dev.id); | 159 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH); |
172 | kbtab->dev.dev = &intf->dev; | 160 | input_dev->mscbit[0] |= BIT(MSC_SERIAL); |
173 | kbtab->usbdev = dev; | 161 | input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0); |
162 | input_set_abs_params(input_dev, ABS_X, 0, 0x1750, 4, 0); | ||
163 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0); | ||
174 | 164 | ||
175 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | 165 | endpoint = &intf->cur_altsetting->endpoint[0].desc; |
176 | 166 | ||
@@ -181,23 +171,25 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
181 | kbtab->irq->transfer_dma = kbtab->data_dma; | 171 | kbtab->irq->transfer_dma = kbtab->data_dma; |
182 | kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 172 | kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
183 | 173 | ||
184 | input_register_device(&kbtab->dev); | 174 | input_register_device(kbtab->dev); |
185 | |||
186 | printk(KERN_INFO "input: KB Gear Tablet on %s\n", path); | ||
187 | 175 | ||
188 | usb_set_intfdata(intf, kbtab); | 176 | usb_set_intfdata(intf, kbtab); |
189 | |||
190 | return 0; | 177 | return 0; |
178 | |||
179 | fail2: usb_buffer_free(dev, 10, kbtab->data, kbtab->data_dma); | ||
180 | fail1: input_free_device(input_dev); | ||
181 | kfree(kbtab); | ||
182 | return -ENOMEM; | ||
191 | } | 183 | } |
192 | 184 | ||
193 | static void kbtab_disconnect(struct usb_interface *intf) | 185 | static void kbtab_disconnect(struct usb_interface *intf) |
194 | { | 186 | { |
195 | struct kbtab *kbtab = usb_get_intfdata (intf); | 187 | struct kbtab *kbtab = usb_get_intfdata(intf); |
196 | 188 | ||
197 | usb_set_intfdata(intf, NULL); | 189 | usb_set_intfdata(intf, NULL); |
198 | if (kbtab) { | 190 | if (kbtab) { |
199 | usb_kill_urb(kbtab->irq); | 191 | usb_kill_urb(kbtab->irq); |
200 | input_unregister_device(&kbtab->dev); | 192 | input_unregister_device(kbtab->dev); |
201 | usb_free_urb(kbtab->irq); | 193 | usb_free_urb(kbtab->irq); |
202 | usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma); | 194 | usb_buffer_free(interface_to_usbdev(intf), 10, kbtab->data, kbtab->data_dma); |
203 | kfree(kbtab); | 195 | kfree(kbtab); |
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c index 99de1b33c07d..5b8d65f62abf 100644 --- a/drivers/usb/input/keyspan_remote.c +++ b/drivers/usb/input/keyspan_remote.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/moduleparam.h> | 20 | #include <linux/moduleparam.h> |
21 | #include <linux/input.h> | 21 | #include <linux/input.h> |
22 | #include <linux/usb.h> | 22 | #include <linux/usb.h> |
23 | #include <linux/usb_input.h> | ||
23 | 24 | ||
24 | #define DRIVER_VERSION "v0.1" | 25 | #define DRIVER_VERSION "v0.1" |
25 | #define DRIVER_AUTHOR "Michael Downey <downey@zymeta.com>" | 26 | #define DRIVER_AUTHOR "Michael Downey <downey@zymeta.com>" |
@@ -75,7 +76,7 @@ struct usb_keyspan { | |||
75 | char name[128]; | 76 | char name[128]; |
76 | char phys[64]; | 77 | char phys[64]; |
77 | struct usb_device* udev; | 78 | struct usb_device* udev; |
78 | struct input_dev input; | 79 | struct input_dev *input; |
79 | struct usb_interface* interface; | 80 | struct usb_interface* interface; |
80 | struct usb_endpoint_descriptor* in_endpoint; | 81 | struct usb_endpoint_descriptor* in_endpoint; |
81 | struct urb* irq_urb; | 82 | struct urb* irq_urb; |
@@ -136,12 +137,11 @@ static struct usb_driver keyspan_driver; | |||
136 | */ | 137 | */ |
137 | static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/ | 138 | static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/ |
138 | { | 139 | { |
139 | char codes[4*RECV_SIZE]; | 140 | char codes[4 * RECV_SIZE]; |
140 | int i; | 141 | int i; |
141 | 142 | ||
142 | for (i = 0; i < RECV_SIZE; i++) { | 143 | for (i = 0; i < RECV_SIZE; i++) |
143 | snprintf(codes+i*3, 4, "%02x ", dev->in_buffer[i]); | 144 | snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]); |
144 | } | ||
145 | 145 | ||
146 | dev_info(&dev->udev->dev, "%s\n", codes); | 146 | dev_info(&dev->udev->dev, "%s\n", codes); |
147 | } | 147 | } |
@@ -153,7 +153,7 @@ static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/ | |||
153 | static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) | 153 | static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) |
154 | { | 154 | { |
155 | if (dev->data.bits_left >= bits_needed) | 155 | if (dev->data.bits_left >= bits_needed) |
156 | return(0); | 156 | return 0; |
157 | 157 | ||
158 | /* | 158 | /* |
159 | * Somehow we've missed the last message. The message will be repeated | 159 | * Somehow we've missed the last message. The message will be repeated |
@@ -162,7 +162,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) | |||
162 | if (dev->data.pos >= dev->data.len) { | 162 | if (dev->data.pos >= dev->data.len) { |
163 | dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n", | 163 | dev_dbg(&dev->udev, "%s - Error ran out of data. pos: %d, len: %d\n", |
164 | __FUNCTION__, dev->data.pos, dev->data.len); | 164 | __FUNCTION__, dev->data.pos, dev->data.len); |
165 | return(-1); | 165 | return -1; |
166 | } | 166 | } |
167 | 167 | ||
168 | /* Load as much as we can into the tester. */ | 168 | /* Load as much as we can into the tester. */ |
@@ -172,7 +172,7 @@ static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) | |||
172 | dev->data.bits_left += 8; | 172 | dev->data.bits_left += 8; |
173 | } | 173 | } |
174 | 174 | ||
175 | return(0); | 175 | return 0; |
176 | } | 176 | } |
177 | 177 | ||
178 | /* | 178 | /* |
@@ -311,10 +311,10 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs) | |||
311 | __FUNCTION__, message.system, message.button, message.toggle); | 311 | __FUNCTION__, message.system, message.button, message.toggle); |
312 | 312 | ||
313 | if (message.toggle != remote->toggle) { | 313 | if (message.toggle != remote->toggle) { |
314 | input_regs(&remote->input, regs); | 314 | input_regs(remote->input, regs); |
315 | input_report_key(&remote->input, keyspan_key_table[message.button], 1); | 315 | input_report_key(remote->input, keyspan_key_table[message.button], 1); |
316 | input_report_key(&remote->input, keyspan_key_table[message.button], 0); | 316 | input_report_key(remote->input, keyspan_key_table[message.button], 0); |
317 | input_sync(&remote->input); | 317 | input_sync(remote->input); |
318 | remote->toggle = message.toggle; | 318 | remote->toggle = message.toggle; |
319 | } | 319 | } |
320 | 320 | ||
@@ -397,14 +397,9 @@ static int keyspan_open(struct input_dev *dev) | |||
397 | { | 397 | { |
398 | struct usb_keyspan *remote = dev->private; | 398 | struct usb_keyspan *remote = dev->private; |
399 | 399 | ||
400 | if (remote->open++) | ||
401 | return 0; | ||
402 | |||
403 | remote->irq_urb->dev = remote->udev; | 400 | remote->irq_urb->dev = remote->udev; |
404 | if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) { | 401 | if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) |
405 | remote->open--; | ||
406 | return -EIO; | 402 | return -EIO; |
407 | } | ||
408 | 403 | ||
409 | return 0; | 404 | return 0; |
410 | } | 405 | } |
@@ -413,8 +408,26 @@ static void keyspan_close(struct input_dev *dev) | |||
413 | { | 408 | { |
414 | struct usb_keyspan *remote = dev->private; | 409 | struct usb_keyspan *remote = dev->private; |
415 | 410 | ||
416 | if (!--remote->open) | 411 | usb_kill_urb(remote->irq_urb); |
417 | usb_kill_urb(remote->irq_urb); | 412 | } |
413 | |||
414 | static struct usb_endpoint_descriptor *keyspan_get_in_endpoint(struct usb_host_interface *iface) | ||
415 | { | ||
416 | |||
417 | struct usb_endpoint_descriptor *endpoint; | ||
418 | int i; | ||
419 | |||
420 | for (i = 0; i < iface->desc.bNumEndpoints; ++i) { | ||
421 | endpoint = &iface->endpoint[i].desc; | ||
422 | |||
423 | if ((endpoint->bEndpointAddress & USB_DIR_IN) && | ||
424 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
425 | /* we found our interrupt in endpoint */ | ||
426 | return endpoint; | ||
427 | } | ||
428 | } | ||
429 | |||
430 | return NULL; | ||
418 | } | 431 | } |
419 | 432 | ||
420 | /* | 433 | /* |
@@ -422,110 +435,78 @@ static void keyspan_close(struct input_dev *dev) | |||
422 | */ | 435 | */ |
423 | static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id) | 436 | static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id) |
424 | { | 437 | { |
425 | int i; | 438 | struct usb_device *udev = interface_to_usbdev(interface); |
426 | int retval = -ENOMEM; | ||
427 | char path[64]; | ||
428 | char *buf; | ||
429 | struct usb_keyspan *remote = NULL; | ||
430 | struct usb_host_interface *iface_desc; | ||
431 | struct usb_endpoint_descriptor *endpoint; | 439 | struct usb_endpoint_descriptor *endpoint; |
432 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); | 440 | struct usb_keyspan *remote; |
441 | struct input_dev *input_dev; | ||
442 | int i, retval; | ||
433 | 443 | ||
434 | /* allocate memory for our device state and initialize it */ | 444 | endpoint = keyspan_get_in_endpoint(interface->cur_altsetting); |
435 | remote = kmalloc(sizeof(*remote), GFP_KERNEL); | 445 | if (!endpoint) |
436 | if (remote == NULL) { | 446 | return -ENODEV; |
437 | err("Out of memory\n"); | 447 | |
438 | goto error; | 448 | remote = kzalloc(sizeof(*remote), GFP_KERNEL); |
449 | input_dev = input_allocate_device(); | ||
450 | if (!remote || !input_dev) { | ||
451 | retval = -ENOMEM; | ||
452 | goto fail1; | ||
439 | } | 453 | } |
440 | memset(remote, 0x00, sizeof(*remote)); | ||
441 | 454 | ||
442 | remote->udev = udev; | 455 | remote->udev = udev; |
456 | remote->input = input_dev; | ||
443 | remote->interface = interface; | 457 | remote->interface = interface; |
458 | remote->in_endpoint = endpoint; | ||
444 | remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */ | 459 | remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */ |
445 | 460 | ||
446 | /* set up the endpoint information */ | 461 | remote->in_buffer = usb_buffer_alloc(udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma); |
447 | /* use only the first in interrupt endpoint */ | 462 | if (!remote->in_buffer) { |
448 | iface_desc = interface->cur_altsetting; | 463 | retval = -ENOMEM; |
449 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 464 | goto fail1; |
450 | endpoint = &iface_desc->endpoint[i].desc; | ||
451 | |||
452 | if (!remote->in_endpoint && | ||
453 | (endpoint->bEndpointAddress & USB_DIR_IN) && | ||
454 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
455 | /* we found our interrupt in endpoint */ | ||
456 | remote->in_endpoint = endpoint; | ||
457 | |||
458 | remote->in_buffer = usb_buffer_alloc(remote->udev, RECV_SIZE, SLAB_ATOMIC, &remote->in_dma); | ||
459 | if (!remote->in_buffer) { | ||
460 | retval = -ENOMEM; | ||
461 | goto error; | ||
462 | } | ||
463 | } | ||
464 | } | ||
465 | |||
466 | if (!remote->in_endpoint) { | ||
467 | err("Could not find interrupt input endpoint.\n"); | ||
468 | retval = -ENODEV; | ||
469 | goto error; | ||
470 | } | 465 | } |
471 | 466 | ||
472 | remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); | 467 | remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); |
473 | if (!remote->irq_urb) { | 468 | if (!remote->irq_urb) { |
474 | err("Failed to allocate urb.\n"); | ||
475 | retval = -ENOMEM; | 469 | retval = -ENOMEM; |
476 | goto error; | 470 | goto fail2; |
477 | } | 471 | } |
478 | 472 | ||
479 | retval = keyspan_setup(remote->udev); | 473 | retval = keyspan_setup(udev); |
480 | if (retval) { | 474 | if (retval) { |
481 | err("Failed to setup device.\n"); | ||
482 | retval = -ENODEV; | 475 | retval = -ENODEV; |
483 | goto error; | 476 | goto fail3; |
484 | } | ||
485 | |||
486 | /* | ||
487 | * Setup the input system with the bits we are going to be reporting | ||
488 | */ | ||
489 | remote->input.evbit[0] = BIT(EV_KEY); /* We will only report KEY events. */ | ||
490 | for (i = 0; i < 32; ++i) { | ||
491 | if (keyspan_key_table[i] != KEY_RESERVED) { | ||
492 | set_bit(keyspan_key_table[i], remote->input.keybit); | ||
493 | } | ||
494 | } | 477 | } |
495 | 478 | ||
496 | remote->input.private = remote; | 479 | if (udev->manufacturer) |
497 | remote->input.open = keyspan_open; | 480 | strlcpy(remote->name, udev->manufacturer, sizeof(remote->name)); |
498 | remote->input.close = keyspan_close; | ||
499 | |||
500 | usb_make_path(remote->udev, path, 64); | ||
501 | sprintf(remote->phys, "%s/input0", path); | ||
502 | 481 | ||
503 | remote->input.name = remote->name; | 482 | if (udev->product) { |
504 | remote->input.phys = remote->phys; | 483 | if (udev->manufacturer) |
505 | remote->input.id.bustype = BUS_USB; | 484 | strlcat(remote->name, " ", sizeof(remote->name)); |
506 | remote->input.id.vendor = le16_to_cpu(remote->udev->descriptor.idVendor); | 485 | strlcat(remote->name, udev->product, sizeof(remote->name)); |
507 | remote->input.id.product = le16_to_cpu(remote->udev->descriptor.idProduct); | ||
508 | remote->input.id.version = le16_to_cpu(remote->udev->descriptor.bcdDevice); | ||
509 | |||
510 | if (!(buf = kmalloc(63, GFP_KERNEL))) { | ||
511 | usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); | ||
512 | kfree(remote); | ||
513 | return -ENOMEM; | ||
514 | } | 486 | } |
515 | 487 | ||
516 | if (remote->udev->descriptor.iManufacturer && | 488 | if (!strlen(remote->name)) |
517 | usb_string(remote->udev, remote->udev->descriptor.iManufacturer, buf, 63) > 0) | 489 | snprintf(remote->name, sizeof(remote->name), |
518 | strcat(remote->name, buf); | 490 | "USB Keyspan Remote %04x:%04x", |
491 | le16_to_cpu(udev->descriptor.idVendor), | ||
492 | le16_to_cpu(udev->descriptor.idProduct)); | ||
519 | 493 | ||
520 | if (remote->udev->descriptor.iProduct && | 494 | usb_make_path(udev, remote->phys, sizeof(remote->phys)); |
521 | usb_string(remote->udev, remote->udev->descriptor.iProduct, buf, 63) > 0) | 495 | strlcat(remote->phys, "/input0", sizeof(remote->phys)); |
522 | sprintf(remote->name, "%s %s", remote->name, buf); | ||
523 | 496 | ||
524 | if (!strlen(remote->name)) | 497 | input_dev->name = remote->name; |
525 | sprintf(remote->name, "USB Keyspan Remote %04x:%04x", | 498 | input_dev->phys = remote->phys; |
526 | remote->input.id.vendor, remote->input.id.product); | 499 | usb_to_input_id(udev, &input_dev->id); |
500 | input_dev->cdev.dev = &interface->dev; | ||
527 | 501 | ||
528 | kfree(buf); | 502 | input_dev->evbit[0] = BIT(EV_KEY); /* We will only report KEY events. */ |
503 | for (i = 0; i < ARRAY_SIZE(keyspan_key_table); i++) | ||
504 | if (keyspan_key_table[i] != KEY_RESERVED) | ||
505 | set_bit(keyspan_key_table[i], input_dev->keybit); | ||
506 | |||
507 | input_dev->private = remote; | ||
508 | input_dev->open = keyspan_open; | ||
509 | input_dev->close = keyspan_close; | ||
529 | 510 | ||
530 | /* | 511 | /* |
531 | * Initialize the URB to access the device. The urb gets sent to the device in keyspan_open() | 512 | * Initialize the URB to access the device. The urb gets sent to the device in keyspan_open() |
@@ -538,27 +519,17 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic | |||
538 | remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 519 | remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
539 | 520 | ||
540 | /* we can register the device now, as it is ready */ | 521 | /* we can register the device now, as it is ready */ |
541 | input_register_device(&remote->input); | 522 | input_register_device(remote->input); |
542 | 523 | ||
543 | /* save our data pointer in this interface device */ | 524 | /* save our data pointer in this interface device */ |
544 | usb_set_intfdata(interface, remote); | 525 | usb_set_intfdata(interface, remote); |
545 | 526 | ||
546 | /* let the user know what node this device is now attached to */ | ||
547 | info("connected: %s on %s", remote->name, path); | ||
548 | return 0; | 527 | return 0; |
549 | 528 | ||
550 | error: | 529 | fail3: usb_free_urb(remote->irq_urb); |
551 | /* | 530 | fail2: usb_buffer_free(udev, RECV_SIZE, remote->in_buffer, remote->in_dma); |
552 | * In case of error we need to clean up any allocated buffers | 531 | fail1: kfree(remote); |
553 | */ | 532 | input_free_device(input_dev); |
554 | if (remote->irq_urb) | ||
555 | usb_free_urb(remote->irq_urb); | ||
556 | |||
557 | if (remote->in_buffer) | ||
558 | usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); | ||
559 | |||
560 | if (remote) | ||
561 | kfree(remote); | ||
562 | 533 | ||
563 | return retval; | 534 | return retval; |
564 | } | 535 | } |
@@ -570,23 +541,16 @@ static void keyspan_disconnect(struct usb_interface *interface) | |||
570 | { | 541 | { |
571 | struct usb_keyspan *remote; | 542 | struct usb_keyspan *remote; |
572 | 543 | ||
573 | /* prevent keyspan_open() from racing keyspan_disconnect() */ | ||
574 | lock_kernel(); | ||
575 | |||
576 | remote = usb_get_intfdata(interface); | 544 | remote = usb_get_intfdata(interface); |
577 | usb_set_intfdata(interface, NULL); | 545 | usb_set_intfdata(interface, NULL); |
578 | 546 | ||
579 | if (remote) { /* We have a valid driver structure so clean up everything we allocated. */ | 547 | if (remote) { /* We have a valid driver structure so clean up everything we allocated. */ |
580 | input_unregister_device(&remote->input); | 548 | input_unregister_device(remote->input); |
581 | usb_kill_urb(remote->irq_urb); | 549 | usb_kill_urb(remote->irq_urb); |
582 | usb_free_urb(remote->irq_urb); | 550 | usb_free_urb(remote->irq_urb); |
583 | usb_buffer_free(interface_to_usbdev(interface), RECV_SIZE, remote->in_buffer, remote->in_dma); | 551 | usb_buffer_free(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); |
584 | kfree(remote); | 552 | kfree(remote); |
585 | } | 553 | } |
586 | |||
587 | unlock_kernel(); | ||
588 | |||
589 | info("USB Keyspan now disconnected"); | ||
590 | } | 554 | } |
591 | 555 | ||
592 | /* | 556 | /* |
diff --git a/drivers/usb/input/mtouchusb.c b/drivers/usb/input/mtouchusb.c index ff9275057a18..7fce526560ca 100644 --- a/drivers/usb/input/mtouchusb.c +++ b/drivers/usb/input/mtouchusb.c | |||
@@ -98,7 +98,7 @@ struct mtouch_usb { | |||
98 | dma_addr_t data_dma; | 98 | dma_addr_t data_dma; |
99 | struct urb *irq; | 99 | struct urb *irq; |
100 | struct usb_device *udev; | 100 | struct usb_device *udev; |
101 | struct input_dev input; | 101 | struct input_dev *input; |
102 | char name[128]; | 102 | char name[128]; |
103 | char phys[64]; | 103 | char phys[64]; |
104 | }; | 104 | }; |
@@ -135,14 +135,14 @@ static void mtouchusb_irq(struct urb *urb, struct pt_regs *regs) | |||
135 | goto exit; | 135 | goto exit; |
136 | } | 136 | } |
137 | 137 | ||
138 | input_regs(&mtouch->input, regs); | 138 | input_regs(mtouch->input, regs); |
139 | input_report_key(&mtouch->input, BTN_TOUCH, | 139 | input_report_key(mtouch->input, BTN_TOUCH, |
140 | MTOUCHUSB_GET_TOUCHED(mtouch->data)); | 140 | MTOUCHUSB_GET_TOUCHED(mtouch->data)); |
141 | input_report_abs(&mtouch->input, ABS_X, MTOUCHUSB_GET_XC(mtouch->data)); | 141 | input_report_abs(mtouch->input, ABS_X, MTOUCHUSB_GET_XC(mtouch->data)); |
142 | input_report_abs(&mtouch->input, ABS_Y, | 142 | input_report_abs(mtouch->input, ABS_Y, |
143 | (raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC) | 143 | (raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC) |
144 | - MTOUCHUSB_GET_YC(mtouch->data)); | 144 | - MTOUCHUSB_GET_YC(mtouch->data)); |
145 | input_sync(&mtouch->input); | 145 | input_sync(mtouch->input); |
146 | 146 | ||
147 | exit: | 147 | exit: |
148 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 148 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -195,10 +195,10 @@ static void mtouchusb_free_buffers(struct usb_device *udev, struct mtouch_usb *m | |||
195 | static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_id *id) | 195 | static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_id *id) |
196 | { | 196 | { |
197 | struct mtouch_usb *mtouch; | 197 | struct mtouch_usb *mtouch; |
198 | struct input_dev *input_dev; | ||
198 | struct usb_host_interface *interface; | 199 | struct usb_host_interface *interface; |
199 | struct usb_endpoint_descriptor *endpoint; | 200 | struct usb_endpoint_descriptor *endpoint; |
200 | struct usb_device *udev = interface_to_usbdev(intf); | 201 | struct usb_device *udev = interface_to_usbdev(intf); |
201 | char path[64]; | ||
202 | int nRet; | 202 | int nRet; |
203 | 203 | ||
204 | dbg("%s - called", __FUNCTION__); | 204 | dbg("%s - called", __FUNCTION__); |
@@ -209,57 +209,55 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i | |||
209 | dbg("%s - setting endpoint", __FUNCTION__); | 209 | dbg("%s - setting endpoint", __FUNCTION__); |
210 | endpoint = &interface->endpoint[0].desc; | 210 | endpoint = &interface->endpoint[0].desc; |
211 | 211 | ||
212 | if (!(mtouch = kmalloc(sizeof(struct mtouch_usb), GFP_KERNEL))) { | 212 | mtouch = kzalloc(sizeof(struct mtouch_usb), GFP_KERNEL); |
213 | input_dev = input_allocate_device(); | ||
214 | if (!mtouch || !input_dev) { | ||
213 | err("%s - Out of memory.", __FUNCTION__); | 215 | err("%s - Out of memory.", __FUNCTION__); |
214 | return -ENOMEM; | 216 | goto fail1; |
215 | } | 217 | } |
216 | 218 | ||
217 | memset(mtouch, 0, sizeof(struct mtouch_usb)); | ||
218 | mtouch->udev = udev; | ||
219 | |||
220 | dbg("%s - allocating buffers", __FUNCTION__); | 219 | dbg("%s - allocating buffers", __FUNCTION__); |
221 | if (mtouchusb_alloc_buffers(udev, mtouch)) { | 220 | if (mtouchusb_alloc_buffers(udev, mtouch)) |
222 | mtouchusb_free_buffers(udev, mtouch); | 221 | goto fail2; |
223 | kfree(mtouch); | ||
224 | return -ENOMEM; | ||
225 | } | ||
226 | 222 | ||
227 | mtouch->input.private = mtouch; | 223 | mtouch->udev = udev; |
228 | mtouch->input.open = mtouchusb_open; | 224 | mtouch->input = input_dev; |
229 | mtouch->input.close = mtouchusb_close; | ||
230 | |||
231 | usb_make_path(udev, path, 64); | ||
232 | sprintf(mtouch->phys, "%s/input0", path); | ||
233 | |||
234 | mtouch->input.name = mtouch->name; | ||
235 | mtouch->input.phys = mtouch->phys; | ||
236 | usb_to_input_id(udev, &mtouch->input.id); | ||
237 | mtouch->input.dev = &intf->dev; | ||
238 | |||
239 | mtouch->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
240 | mtouch->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | ||
241 | mtouch->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
242 | |||
243 | /* Used to Scale Compensated Data and Flip Y */ | ||
244 | mtouch->input.absmin[ABS_X] = MTOUCHUSB_MIN_XC; | ||
245 | mtouch->input.absmax[ABS_X] = raw_coordinates ? | ||
246 | MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC; | ||
247 | mtouch->input.absfuzz[ABS_X] = MTOUCHUSB_XC_FUZZ; | ||
248 | mtouch->input.absflat[ABS_X] = MTOUCHUSB_XC_FLAT; | ||
249 | mtouch->input.absmin[ABS_Y] = MTOUCHUSB_MIN_YC; | ||
250 | mtouch->input.absmax[ABS_Y] = raw_coordinates ? | ||
251 | MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC; | ||
252 | mtouch->input.absfuzz[ABS_Y] = MTOUCHUSB_YC_FUZZ; | ||
253 | mtouch->input.absflat[ABS_Y] = MTOUCHUSB_YC_FLAT; | ||
254 | 225 | ||
255 | if (udev->manufacturer) | 226 | if (udev->manufacturer) |
256 | strcat(mtouch->name, udev->manufacturer); | 227 | strlcpy(mtouch->name, udev->manufacturer, sizeof(mtouch->name)); |
257 | if (udev->product) | 228 | |
258 | sprintf(mtouch->name, "%s %s", mtouch->name, udev->product); | 229 | if (udev->product) { |
230 | if (udev->manufacturer) | ||
231 | strlcat(mtouch->name, " ", sizeof(mtouch->name)); | ||
232 | strlcat(mtouch->name, udev->product, sizeof(mtouch->name)); | ||
233 | } | ||
259 | 234 | ||
260 | if (!strlen(mtouch->name)) | 235 | if (!strlen(mtouch->name)) |
261 | sprintf(mtouch->name, "USB Touchscreen %04x:%04x", | 236 | snprintf(mtouch->name, sizeof(mtouch->name), |
262 | mtouch->input.id.vendor, mtouch->input.id.product); | 237 | "USB Touchscreen %04x:%04x", |
238 | le16_to_cpu(udev->descriptor.idVendor), | ||
239 | le16_to_cpu(udev->descriptor.idProduct)); | ||
240 | |||
241 | usb_make_path(udev, mtouch->phys, sizeof(mtouch->phys)); | ||
242 | strlcpy(mtouch->phys, "/input0", sizeof(mtouch->phys)); | ||
243 | |||
244 | input_dev->name = mtouch->name; | ||
245 | input_dev->phys = mtouch->phys; | ||
246 | usb_to_input_id(udev, &input_dev->id); | ||
247 | input_dev->cdev.dev = &intf->dev; | ||
248 | input_dev->private = mtouch; | ||
249 | |||
250 | input_dev->open = mtouchusb_open; | ||
251 | input_dev->close = mtouchusb_close; | ||
252 | |||
253 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
254 | input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
255 | input_set_abs_params(input_dev, ABS_X, MTOUCHUSB_MIN_XC, | ||
256 | raw_coordinates ? MTOUCHUSB_MAX_RAW_XC : MTOUCHUSB_MAX_CALIB_XC, | ||
257 | MTOUCHUSB_XC_FUZZ, MTOUCHUSB_XC_FLAT); | ||
258 | input_set_abs_params(input_dev, ABS_Y, MTOUCHUSB_MIN_YC, | ||
259 | raw_coordinates ? MTOUCHUSB_MAX_RAW_YC : MTOUCHUSB_MAX_CALIB_YC, | ||
260 | MTOUCHUSB_YC_FUZZ, MTOUCHUSB_YC_FLAT); | ||
263 | 261 | ||
264 | nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0), | 262 | nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0), |
265 | MTOUCHUSB_RESET, | 263 | MTOUCHUSB_RESET, |
@@ -272,9 +270,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i | |||
272 | mtouch->irq = usb_alloc_urb(0, GFP_KERNEL); | 270 | mtouch->irq = usb_alloc_urb(0, GFP_KERNEL); |
273 | if (!mtouch->irq) { | 271 | if (!mtouch->irq) { |
274 | dbg("%s - usb_alloc_urb failed: mtouch->irq", __FUNCTION__); | 272 | dbg("%s - usb_alloc_urb failed: mtouch->irq", __FUNCTION__); |
275 | mtouchusb_free_buffers(udev, mtouch); | 273 | goto fail2; |
276 | kfree(mtouch); | ||
277 | return -ENOMEM; | ||
278 | } | 274 | } |
279 | 275 | ||
280 | dbg("%s - usb_fill_int_urb", __FUNCTION__); | 276 | dbg("%s - usb_fill_int_urb", __FUNCTION__); |
@@ -284,7 +280,7 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i | |||
284 | mtouchusb_irq, mtouch, endpoint->bInterval); | 280 | mtouchusb_irq, mtouch, endpoint->bInterval); |
285 | 281 | ||
286 | dbg("%s - input_register_device", __FUNCTION__); | 282 | dbg("%s - input_register_device", __FUNCTION__); |
287 | input_register_device(&mtouch->input); | 283 | input_register_device(mtouch->input); |
288 | 284 | ||
289 | nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0), | 285 | nRet = usb_control_msg(mtouch->udev, usb_rcvctrlpipe(udev, 0), |
290 | MTOUCHUSB_ASYNC_REPORT, | 286 | MTOUCHUSB_ASYNC_REPORT, |
@@ -293,10 +289,13 @@ static int mtouchusb_probe(struct usb_interface *intf, const struct usb_device_i | |||
293 | dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", | 289 | dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", |
294 | __FUNCTION__, nRet); | 290 | __FUNCTION__, nRet); |
295 | 291 | ||
296 | printk(KERN_INFO "input: %s on %s\n", mtouch->name, path); | ||
297 | usb_set_intfdata(intf, mtouch); | 292 | usb_set_intfdata(intf, mtouch); |
298 | |||
299 | return 0; | 293 | return 0; |
294 | |||
295 | fail2: mtouchusb_free_buffers(udev, mtouch); | ||
296 | fail1: input_free_device(input_dev); | ||
297 | kfree(mtouch); | ||
298 | return -ENOMEM; | ||
300 | } | 299 | } |
301 | 300 | ||
302 | static void mtouchusb_disconnect(struct usb_interface *intf) | 301 | static void mtouchusb_disconnect(struct usb_interface *intf) |
@@ -308,7 +307,7 @@ static void mtouchusb_disconnect(struct usb_interface *intf) | |||
308 | if (mtouch) { | 307 | if (mtouch) { |
309 | dbg("%s - mtouch is initialized, cleaning up", __FUNCTION__); | 308 | dbg("%s - mtouch is initialized, cleaning up", __FUNCTION__); |
310 | usb_kill_urb(mtouch->irq); | 309 | usb_kill_urb(mtouch->irq); |
311 | input_unregister_device(&mtouch->input); | 310 | input_unregister_device(mtouch->input); |
312 | usb_free_urb(mtouch->irq); | 311 | usb_free_urb(mtouch->irq); |
313 | mtouchusb_free_buffers(interface_to_usbdev(intf), mtouch); | 312 | mtouchusb_free_buffers(interface_to_usbdev(intf), mtouch); |
314 | kfree(mtouch); | 313 | kfree(mtouch); |
diff --git a/drivers/usb/input/pid.c b/drivers/usb/input/pid.c index acc71ec560e9..a00672c96644 100644 --- a/drivers/usb/input/pid.c +++ b/drivers/usb/input/pid.c | |||
@@ -262,6 +262,7 @@ int hid_pid_init(struct hid_device *hid) | |||
262 | { | 262 | { |
263 | struct hid_ff_pid *private; | 263 | struct hid_ff_pid *private; |
264 | struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list); | 264 | struct hid_input *hidinput = list_entry(&hid->inputs, struct hid_input, list); |
265 | struct input_dev *input_dev = hidinput->input; | ||
265 | 266 | ||
266 | private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL); | 267 | private = hid->ff_private = kzalloc(sizeof(struct hid_ff_pid), GFP_KERNEL); |
267 | if (!private) | 268 | if (!private) |
@@ -281,11 +282,12 @@ int hid_pid_init(struct hid_device *hid) | |||
281 | usb_fill_control_urb(private->urbffout, hid->dev, 0, | 282 | usb_fill_control_urb(private->urbffout, hid->dev, 0, |
282 | (void *)&private->ffcr, private->ctrl_buffer, 8, | 283 | (void *)&private->ffcr, private->ctrl_buffer, 8, |
283 | hid_pid_ctrl_out, hid); | 284 | hid_pid_ctrl_out, hid); |
284 | hidinput->input.upload_effect = hid_pid_upload_effect; | 285 | |
285 | hidinput->input.flush = hid_pid_flush; | 286 | input_dev->upload_effect = hid_pid_upload_effect; |
286 | hidinput->input.ff_effects_max = 8; // A random default | 287 | input_dev->flush = hid_pid_flush; |
287 | set_bit(EV_FF, hidinput->input.evbit); | 288 | input_dev->ff_effects_max = 8; // A random default |
288 | set_bit(EV_FF_STATUS, hidinput->input.evbit); | 289 | set_bit(EV_FF, input_dev->evbit); |
290 | set_bit(EV_FF_STATUS, input_dev->evbit); | ||
289 | 291 | ||
290 | spin_lock_init(&private->lock); | 292 | spin_lock_init(&private->lock); |
291 | 293 | ||
diff --git a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c index ad4afe7e5897..b7476233ef5d 100644 --- a/drivers/usb/input/powermate.c +++ b/drivers/usb/input/powermate.c | |||
@@ -68,7 +68,7 @@ struct powermate_device { | |||
68 | struct usb_ctrlrequest *configcr; | 68 | struct usb_ctrlrequest *configcr; |
69 | dma_addr_t configcr_dma; | 69 | dma_addr_t configcr_dma; |
70 | struct usb_device *udev; | 70 | struct usb_device *udev; |
71 | struct input_dev input; | 71 | struct input_dev *input; |
72 | spinlock_t lock; | 72 | spinlock_t lock; |
73 | int static_brightness; | 73 | int static_brightness; |
74 | int pulse_speed; | 74 | int pulse_speed; |
@@ -106,10 +106,10 @@ static void powermate_irq(struct urb *urb, struct pt_regs *regs) | |||
106 | } | 106 | } |
107 | 107 | ||
108 | /* handle updates to device state */ | 108 | /* handle updates to device state */ |
109 | input_regs(&pm->input, regs); | 109 | input_regs(pm->input, regs); |
110 | input_report_key(&pm->input, BTN_0, pm->data[0] & 0x01); | 110 | input_report_key(pm->input, BTN_0, pm->data[0] & 0x01); |
111 | input_report_rel(&pm->input, REL_DIAL, pm->data[1]); | 111 | input_report_rel(pm->input, REL_DIAL, pm->data[1]); |
112 | input_sync(&pm->input); | 112 | input_sync(pm->input); |
113 | 113 | ||
114 | exit: | 114 | exit: |
115 | retval = usb_submit_urb (urb, GFP_ATOMIC); | 115 | retval = usb_submit_urb (urb, GFP_ATOMIC); |
@@ -153,10 +153,10 @@ static void powermate_sync_state(struct powermate_device *pm) | |||
153 | 153 | ||
154 | Only values of 'arg' quite close to 255 are particularly useful/spectacular. | 154 | Only values of 'arg' quite close to 255 are particularly useful/spectacular. |
155 | */ | 155 | */ |
156 | if (pm->pulse_speed < 255){ | 156 | if (pm->pulse_speed < 255) { |
157 | op = 0; // divide | 157 | op = 0; // divide |
158 | arg = 255 - pm->pulse_speed; | 158 | arg = 255 - pm->pulse_speed; |
159 | } else if (pm->pulse_speed > 255){ | 159 | } else if (pm->pulse_speed > 255) { |
160 | op = 2; // multiply | 160 | op = 2; // multiply |
161 | arg = pm->pulse_speed - 255; | 161 | arg = pm->pulse_speed - 255; |
162 | } else { | 162 | } else { |
@@ -166,11 +166,11 @@ static void powermate_sync_state(struct powermate_device *pm) | |||
166 | pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE ); | 166 | pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE ); |
167 | pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op ); | 167 | pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op ); |
168 | pm->requires_update &= ~UPDATE_PULSE_MODE; | 168 | pm->requires_update &= ~UPDATE_PULSE_MODE; |
169 | }else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS){ | 169 | } else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS) { |
170 | pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS ); | 170 | pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS ); |
171 | pm->configcr->wIndex = cpu_to_le16( pm->static_brightness ); | 171 | pm->configcr->wIndex = cpu_to_le16( pm->static_brightness ); |
172 | pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS; | 172 | pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS; |
173 | }else{ | 173 | } else { |
174 | printk(KERN_ERR "powermate: unknown update required"); | 174 | printk(KERN_ERR "powermate: unknown update required"); |
175 | pm->requires_update = 0; /* fudge the bug */ | 175 | pm->requires_update = 0; /* fudge the bug */ |
176 | return; | 176 | return; |
@@ -228,19 +228,19 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne | |||
228 | spin_lock_irqsave(&pm->lock, flags); | 228 | spin_lock_irqsave(&pm->lock, flags); |
229 | 229 | ||
230 | /* mark state updates which are required */ | 230 | /* mark state updates which are required */ |
231 | if (static_brightness != pm->static_brightness){ | 231 | if (static_brightness != pm->static_brightness) { |
232 | pm->static_brightness = static_brightness; | 232 | pm->static_brightness = static_brightness; |
233 | pm->requires_update |= UPDATE_STATIC_BRIGHTNESS; | 233 | pm->requires_update |= UPDATE_STATIC_BRIGHTNESS; |
234 | } | 234 | } |
235 | if (pulse_asleep != pm->pulse_asleep){ | 235 | if (pulse_asleep != pm->pulse_asleep) { |
236 | pm->pulse_asleep = pulse_asleep; | 236 | pm->pulse_asleep = pulse_asleep; |
237 | pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS); | 237 | pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS); |
238 | } | 238 | } |
239 | if (pulse_awake != pm->pulse_awake){ | 239 | if (pulse_awake != pm->pulse_awake) { |
240 | pm->pulse_awake = pulse_awake; | 240 | pm->pulse_awake = pulse_awake; |
241 | pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS); | 241 | pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS); |
242 | } | 242 | } |
243 | if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table){ | 243 | if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table) { |
244 | pm->pulse_speed = pulse_speed; | 244 | pm->pulse_speed = pulse_speed; |
245 | pm->pulse_table = pulse_table; | 245 | pm->pulse_table = pulse_table; |
246 | pm->requires_update |= UPDATE_PULSE_MODE; | 246 | pm->requires_update |= UPDATE_PULSE_MODE; |
@@ -283,6 +283,7 @@ static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_dev | |||
283 | SLAB_ATOMIC, &pm->data_dma); | 283 | SLAB_ATOMIC, &pm->data_dma); |
284 | if (!pm->data) | 284 | if (!pm->data) |
285 | return -1; | 285 | return -1; |
286 | |||
286 | pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)), | 287 | pm->configcr = usb_buffer_alloc(udev, sizeof(*(pm->configcr)), |
287 | SLAB_ATOMIC, &pm->configcr_dma); | 288 | SLAB_ATOMIC, &pm->configcr_dma); |
288 | if (!pm->configcr) | 289 | if (!pm->configcr) |
@@ -308,8 +309,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
308 | struct usb_host_interface *interface; | 309 | struct usb_host_interface *interface; |
309 | struct usb_endpoint_descriptor *endpoint; | 310 | struct usb_endpoint_descriptor *endpoint; |
310 | struct powermate_device *pm; | 311 | struct powermate_device *pm; |
312 | struct input_dev *input_dev; | ||
311 | int pipe, maxp; | 313 | int pipe, maxp; |
312 | char path[64]; | 314 | int err = -ENOMEM; |
313 | 315 | ||
314 | interface = intf->cur_altsetting; | 316 | interface = intf->cur_altsetting; |
315 | endpoint = &interface->endpoint[0].desc; | 317 | endpoint = &interface->endpoint[0].desc; |
@@ -323,42 +325,61 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
323 | 0, interface->desc.bInterfaceNumber, NULL, 0, | 325 | 0, interface->desc.bInterfaceNumber, NULL, 0, |
324 | USB_CTRL_SET_TIMEOUT); | 326 | USB_CTRL_SET_TIMEOUT); |
325 | 327 | ||
326 | if (!(pm = kmalloc(sizeof(struct powermate_device), GFP_KERNEL))) | 328 | pm = kzalloc(sizeof(struct powermate_device), GFP_KERNEL); |
327 | return -ENOMEM; | 329 | input_dev = input_allocate_device(); |
328 | 330 | if (!pm || !input_dev) | |
329 | memset(pm, 0, sizeof(struct powermate_device)); | 331 | goto fail1; |
330 | pm->udev = udev; | ||
331 | 332 | ||
332 | if (powermate_alloc_buffers(udev, pm)) { | 333 | if (powermate_alloc_buffers(udev, pm)) |
333 | powermate_free_buffers(udev, pm); | 334 | goto fail2; |
334 | kfree(pm); | ||
335 | return -ENOMEM; | ||
336 | } | ||
337 | 335 | ||
338 | pm->irq = usb_alloc_urb(0, GFP_KERNEL); | 336 | pm->irq = usb_alloc_urb(0, GFP_KERNEL); |
339 | if (!pm->irq) { | 337 | if (!pm->irq) |
340 | powermate_free_buffers(udev, pm); | 338 | goto fail2; |
341 | kfree(pm); | ||
342 | return -ENOMEM; | ||
343 | } | ||
344 | 339 | ||
345 | pm->config = usb_alloc_urb(0, GFP_KERNEL); | 340 | pm->config = usb_alloc_urb(0, GFP_KERNEL); |
346 | if (!pm->config) { | 341 | if (!pm->config) |
347 | usb_free_urb(pm->irq); | 342 | goto fail3; |
348 | powermate_free_buffers(udev, pm); | 343 | |
349 | kfree(pm); | 344 | pm->udev = udev; |
350 | return -ENOMEM; | 345 | pm->input = input_dev; |
351 | } | 346 | |
347 | usb_make_path(udev, pm->phys, sizeof(pm->phys)); | ||
348 | strlcpy(pm->phys, "/input0", sizeof(pm->phys)); | ||
352 | 349 | ||
353 | spin_lock_init(&pm->lock); | 350 | spin_lock_init(&pm->lock); |
354 | init_input_dev(&pm->input); | 351 | |
352 | switch (le16_to_cpu(udev->descriptor.idProduct)) { | ||
353 | case POWERMATE_PRODUCT_NEW: | ||
354 | input_dev->name = pm_name_powermate; | ||
355 | break; | ||
356 | case POWERMATE_PRODUCT_OLD: | ||
357 | input_dev->name = pm_name_soundknob; | ||
358 | break; | ||
359 | default: | ||
360 | input_dev->name = pm_name_soundknob; | ||
361 | printk(KERN_WARNING "powermate: unknown product id %04x\n", | ||
362 | le16_to_cpu(udev->descriptor.idProduct)); | ||
363 | } | ||
364 | |||
365 | input_dev->phys = pm->phys; | ||
366 | usb_to_input_id(udev, &input_dev->id); | ||
367 | input_dev->cdev.dev = &intf->dev; | ||
368 | input_dev->private = pm; | ||
369 | |||
370 | input_dev->event = powermate_input_event; | ||
371 | |||
372 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC); | ||
373 | input_dev->keybit[LONG(BTN_0)] = BIT(BTN_0); | ||
374 | input_dev->relbit[LONG(REL_DIAL)] = BIT(REL_DIAL); | ||
375 | input_dev->mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED); | ||
355 | 376 | ||
356 | /* get a handle to the interrupt data pipe */ | 377 | /* get a handle to the interrupt data pipe */ |
357 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); | 378 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); |
358 | maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); | 379 | maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); |
359 | 380 | ||
360 | if(maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX){ | 381 | if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) { |
361 | printk("powermate: Expected payload of %d--%d bytes, found %d bytes!\n", | 382 | printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n", |
362 | POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp); | 383 | POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp); |
363 | maxp = POWERMATE_PAYLOAD_SIZE_MAX; | 384 | maxp = POWERMATE_PAYLOAD_SIZE_MAX; |
364 | } | 385 | } |
@@ -371,35 +392,11 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
371 | 392 | ||
372 | /* register our interrupt URB with the USB system */ | 393 | /* register our interrupt URB with the USB system */ |
373 | if (usb_submit_urb(pm->irq, GFP_KERNEL)) { | 394 | if (usb_submit_urb(pm->irq, GFP_KERNEL)) { |
374 | powermate_free_buffers(udev, pm); | 395 | err = -EIO; |
375 | kfree(pm); | 396 | goto fail4; |
376 | return -EIO; /* failure */ | ||
377 | } | 397 | } |
378 | 398 | ||
379 | switch (le16_to_cpu(udev->descriptor.idProduct)) { | 399 | input_register_device(pm->input); |
380 | case POWERMATE_PRODUCT_NEW: pm->input.name = pm_name_powermate; break; | ||
381 | case POWERMATE_PRODUCT_OLD: pm->input.name = pm_name_soundknob; break; | ||
382 | default: | ||
383 | pm->input.name = pm_name_soundknob; | ||
384 | printk(KERN_WARNING "powermate: unknown product id %04x\n", | ||
385 | le16_to_cpu(udev->descriptor.idProduct)); | ||
386 | } | ||
387 | |||
388 | pm->input.private = pm; | ||
389 | pm->input.evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_MSC); | ||
390 | pm->input.keybit[LONG(BTN_0)] = BIT(BTN_0); | ||
391 | pm->input.relbit[LONG(REL_DIAL)] = BIT(REL_DIAL); | ||
392 | pm->input.mscbit[LONG(MSC_PULSELED)] = BIT(MSC_PULSELED); | ||
393 | usb_to_input_id(udev, &pm->input.id); | ||
394 | pm->input.event = powermate_input_event; | ||
395 | pm->input.dev = &intf->dev; | ||
396 | pm->input.phys = pm->phys; | ||
397 | |||
398 | input_register_device(&pm->input); | ||
399 | |||
400 | usb_make_path(udev, path, 64); | ||
401 | snprintf(pm->phys, 64, "%s/input0", path); | ||
402 | printk(KERN_INFO "input: %s on %s\n", pm->input.name, pm->input.phys); | ||
403 | 400 | ||
404 | /* force an update of everything */ | 401 | /* force an update of everything */ |
405 | pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS; | 402 | pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS; |
@@ -407,6 +404,13 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
407 | 404 | ||
408 | usb_set_intfdata(intf, pm); | 405 | usb_set_intfdata(intf, pm); |
409 | return 0; | 406 | return 0; |
407 | |||
408 | fail4: usb_free_urb(pm->config); | ||
409 | fail3: usb_free_urb(pm->irq); | ||
410 | fail2: powermate_free_buffers(udev, pm); | ||
411 | fail1: input_free_device(input_dev); | ||
412 | kfree(pm); | ||
413 | return err; | ||
410 | } | 414 | } |
411 | 415 | ||
412 | /* Called when a USB device we've accepted ownership of is removed */ | 416 | /* Called when a USB device we've accepted ownership of is removed */ |
@@ -418,7 +422,7 @@ static void powermate_disconnect(struct usb_interface *intf) | |||
418 | if (pm) { | 422 | if (pm) { |
419 | pm->requires_update = 0; | 423 | pm->requires_update = 0; |
420 | usb_kill_urb(pm->irq); | 424 | usb_kill_urb(pm->irq); |
421 | input_unregister_device(&pm->input); | 425 | input_unregister_device(pm->input); |
422 | usb_free_urb(pm->irq); | 426 | usb_free_urb(pm->irq); |
423 | usb_free_urb(pm->config); | 427 | usb_free_urb(pm->config); |
424 | powermate_free_buffers(interface_to_usbdev(intf), pm); | 428 | powermate_free_buffers(interface_to_usbdev(intf), pm); |
diff --git a/drivers/usb/input/touchkitusb.c b/drivers/usb/input/touchkitusb.c index 4276c24a5080..3766ccc271be 100644 --- a/drivers/usb/input/touchkitusb.c +++ b/drivers/usb/input/touchkitusb.c | |||
@@ -68,7 +68,7 @@ struct touchkit_usb { | |||
68 | dma_addr_t data_dma; | 68 | dma_addr_t data_dma; |
69 | struct urb *irq; | 69 | struct urb *irq; |
70 | struct usb_device *udev; | 70 | struct usb_device *udev; |
71 | struct input_dev input; | 71 | struct input_dev *input; |
72 | char name[128]; | 72 | char name[128]; |
73 | char phys[64]; | 73 | char phys[64]; |
74 | }; | 74 | }; |
@@ -115,12 +115,12 @@ static void touchkit_irq(struct urb *urb, struct pt_regs *regs) | |||
115 | y = TOUCHKIT_GET_Y(touchkit->data); | 115 | y = TOUCHKIT_GET_Y(touchkit->data); |
116 | } | 116 | } |
117 | 117 | ||
118 | input_regs(&touchkit->input, regs); | 118 | input_regs(touchkit->input, regs); |
119 | input_report_key(&touchkit->input, BTN_TOUCH, | 119 | input_report_key(touchkit->input, BTN_TOUCH, |
120 | TOUCHKIT_GET_TOUCHED(touchkit->data)); | 120 | TOUCHKIT_GET_TOUCHED(touchkit->data)); |
121 | input_report_abs(&touchkit->input, ABS_X, x); | 121 | input_report_abs(touchkit->input, ABS_X, x); |
122 | input_report_abs(&touchkit->input, ABS_Y, y); | 122 | input_report_abs(touchkit->input, ABS_Y, y); |
123 | input_sync(&touchkit->input); | 123 | input_sync(touchkit->input); |
124 | 124 | ||
125 | exit: | 125 | exit: |
126 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 126 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
@@ -171,87 +171,81 @@ static void touchkit_free_buffers(struct usb_device *udev, | |||
171 | static int touchkit_probe(struct usb_interface *intf, | 171 | static int touchkit_probe(struct usb_interface *intf, |
172 | const struct usb_device_id *id) | 172 | const struct usb_device_id *id) |
173 | { | 173 | { |
174 | int ret; | ||
175 | struct touchkit_usb *touchkit; | 174 | struct touchkit_usb *touchkit; |
175 | struct input_dev *input_dev; | ||
176 | struct usb_host_interface *interface; | 176 | struct usb_host_interface *interface; |
177 | struct usb_endpoint_descriptor *endpoint; | 177 | struct usb_endpoint_descriptor *endpoint; |
178 | struct usb_device *udev = interface_to_usbdev(intf); | 178 | struct usb_device *udev = interface_to_usbdev(intf); |
179 | char path[64]; | ||
180 | 179 | ||
181 | interface = intf->cur_altsetting; | 180 | interface = intf->cur_altsetting; |
182 | endpoint = &interface->endpoint[0].desc; | 181 | endpoint = &interface->endpoint[0].desc; |
183 | 182 | ||
184 | touchkit = kmalloc(sizeof(struct touchkit_usb), GFP_KERNEL); | 183 | touchkit = kzalloc(sizeof(struct touchkit_usb), GFP_KERNEL); |
185 | if (!touchkit) | 184 | input_dev = input_allocate_device(); |
186 | return -ENOMEM; | 185 | if (!touchkit || !input_dev) |
187 | |||
188 | memset(touchkit, 0, sizeof(struct touchkit_usb)); | ||
189 | touchkit->udev = udev; | ||
190 | |||
191 | if (touchkit_alloc_buffers(udev, touchkit)) { | ||
192 | ret = -ENOMEM; | ||
193 | goto out_free; | 186 | goto out_free; |
194 | } | ||
195 | |||
196 | touchkit->input.private = touchkit; | ||
197 | touchkit->input.open = touchkit_open; | ||
198 | touchkit->input.close = touchkit_close; | ||
199 | |||
200 | usb_make_path(udev, path, 64); | ||
201 | sprintf(touchkit->phys, "%s/input0", path); | ||
202 | |||
203 | touchkit->input.name = touchkit->name; | ||
204 | touchkit->input.phys = touchkit->phys; | ||
205 | usb_to_input_id(udev, &touchkit->input.id); | ||
206 | touchkit->input.dev = &intf->dev; | ||
207 | |||
208 | touchkit->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
209 | touchkit->input.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | ||
210 | touchkit->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
211 | |||
212 | /* Used to Scale Compensated Data */ | ||
213 | touchkit->input.absmin[ABS_X] = TOUCHKIT_MIN_XC; | ||
214 | touchkit->input.absmax[ABS_X] = TOUCHKIT_MAX_XC; | ||
215 | touchkit->input.absfuzz[ABS_X] = TOUCHKIT_XC_FUZZ; | ||
216 | touchkit->input.absflat[ABS_X] = TOUCHKIT_XC_FLAT; | ||
217 | touchkit->input.absmin[ABS_Y] = TOUCHKIT_MIN_YC; | ||
218 | touchkit->input.absmax[ABS_Y] = TOUCHKIT_MAX_YC; | ||
219 | touchkit->input.absfuzz[ABS_Y] = TOUCHKIT_YC_FUZZ; | ||
220 | touchkit->input.absflat[ABS_Y] = TOUCHKIT_YC_FLAT; | ||
221 | |||
222 | if (udev->manufacturer) | ||
223 | strcat(touchkit->name, udev->manufacturer); | ||
224 | if (udev->product) | ||
225 | sprintf(touchkit->name, "%s %s", touchkit->name, udev->product); | ||
226 | 187 | ||
227 | if (!strlen(touchkit->name)) | 188 | if (touchkit_alloc_buffers(udev, touchkit)) |
228 | sprintf(touchkit->name, "USB Touchscreen %04x:%04x", | 189 | goto out_free; |
229 | touchkit->input.id.vendor, touchkit->input.id.product); | ||
230 | 190 | ||
231 | touchkit->irq = usb_alloc_urb(0, GFP_KERNEL); | 191 | touchkit->irq = usb_alloc_urb(0, GFP_KERNEL); |
232 | if (!touchkit->irq) { | 192 | if (!touchkit->irq) { |
233 | dbg("%s - usb_alloc_urb failed: touchkit->irq", __FUNCTION__); | 193 | dbg("%s - usb_alloc_urb failed: touchkit->irq", __FUNCTION__); |
234 | ret = -ENOMEM; | ||
235 | goto out_free_buffers; | 194 | goto out_free_buffers; |
236 | } | 195 | } |
237 | 196 | ||
197 | touchkit->udev = udev; | ||
198 | touchkit->input = input_dev; | ||
199 | |||
200 | if (udev->manufacturer) | ||
201 | strlcpy(touchkit->name, udev->manufacturer, sizeof(touchkit->name)); | ||
202 | |||
203 | if (udev->product) { | ||
204 | if (udev->manufacturer) | ||
205 | strlcat(touchkit->name, " ", sizeof(touchkit->name)); | ||
206 | strlcat(touchkit->name, udev->product, sizeof(touchkit->name)); | ||
207 | } | ||
208 | |||
209 | if (!strlen(touchkit->name)) | ||
210 | snprintf(touchkit->name, sizeof(touchkit->name), | ||
211 | "USB Touchscreen %04x:%04x", | ||
212 | le16_to_cpu(udev->descriptor.idVendor), | ||
213 | le16_to_cpu(udev->descriptor.idProduct)); | ||
214 | |||
215 | usb_make_path(udev, touchkit->phys, sizeof(touchkit->phys)); | ||
216 | strlcpy(touchkit->phys, "/input0", sizeof(touchkit->phys)); | ||
217 | |||
218 | input_dev->name = touchkit->name; | ||
219 | input_dev->phys = touchkit->phys; | ||
220 | usb_to_input_id(udev, &input_dev->id); | ||
221 | input_dev->cdev.dev = &intf->dev; | ||
222 | input_dev->private = touchkit; | ||
223 | input_dev->open = touchkit_open; | ||
224 | input_dev->close = touchkit_close; | ||
225 | |||
226 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
227 | input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
228 | input_set_abs_params(input_dev, ABS_X, TOUCHKIT_MIN_XC, TOUCHKIT_MAX_XC, | ||
229 | TOUCHKIT_XC_FUZZ, TOUCHKIT_XC_FLAT); | ||
230 | input_set_abs_params(input_dev, ABS_Y, TOUCHKIT_MIN_YC, TOUCHKIT_MAX_YC, | ||
231 | TOUCHKIT_YC_FUZZ, TOUCHKIT_YC_FLAT); | ||
232 | |||
238 | usb_fill_int_urb(touchkit->irq, touchkit->udev, | 233 | usb_fill_int_urb(touchkit->irq, touchkit->udev, |
239 | usb_rcvintpipe(touchkit->udev, 0x81), | 234 | usb_rcvintpipe(touchkit->udev, 0x81), |
240 | touchkit->data, TOUCHKIT_REPORT_DATA_SIZE, | 235 | touchkit->data, TOUCHKIT_REPORT_DATA_SIZE, |
241 | touchkit_irq, touchkit, endpoint->bInterval); | 236 | touchkit_irq, touchkit, endpoint->bInterval); |
242 | 237 | ||
243 | input_register_device(&touchkit->input); | 238 | input_register_device(touchkit->input); |
244 | 239 | ||
245 | printk(KERN_INFO "input: %s on %s\n", touchkit->name, path); | ||
246 | usb_set_intfdata(intf, touchkit); | 240 | usb_set_intfdata(intf, touchkit); |
247 | |||
248 | return 0; | 241 | return 0; |
249 | 242 | ||
250 | out_free_buffers: | 243 | out_free_buffers: |
251 | touchkit_free_buffers(udev, touchkit); | 244 | touchkit_free_buffers(udev, touchkit); |
252 | out_free: | 245 | out_free: |
246 | input_free_device(input_dev); | ||
253 | kfree(touchkit); | 247 | kfree(touchkit); |
254 | return ret; | 248 | return -ENOMEM; |
255 | } | 249 | } |
256 | 250 | ||
257 | static void touchkit_disconnect(struct usb_interface *intf) | 251 | static void touchkit_disconnect(struct usb_interface *intf) |
@@ -265,8 +259,8 @@ static void touchkit_disconnect(struct usb_interface *intf) | |||
265 | 259 | ||
266 | dbg("%s - touchkit is initialized, cleaning up", __FUNCTION__); | 260 | dbg("%s - touchkit is initialized, cleaning up", __FUNCTION__); |
267 | usb_set_intfdata(intf, NULL); | 261 | usb_set_intfdata(intf, NULL); |
268 | input_unregister_device(&touchkit->input); | ||
269 | usb_kill_urb(touchkit->irq); | 262 | usb_kill_urb(touchkit->irq); |
263 | input_unregister_device(touchkit->input); | ||
270 | usb_free_urb(touchkit->irq); | 264 | usb_free_urb(touchkit->irq); |
271 | touchkit_free_buffers(interface_to_usbdev(intf), touchkit); | 265 | touchkit_free_buffers(interface_to_usbdev(intf), touchkit); |
272 | kfree(touchkit); | 266 | kfree(touchkit); |
diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index 28987f15eeee..226b6f90a907 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c | |||
@@ -66,7 +66,7 @@ static unsigned char usb_kbd_keycode[256] = { | |||
66 | }; | 66 | }; |
67 | 67 | ||
68 | struct usb_kbd { | 68 | struct usb_kbd { |
69 | struct input_dev dev; | 69 | struct input_dev *dev; |
70 | struct usb_device *usbdev; | 70 | struct usb_device *usbdev; |
71 | unsigned char old[8]; | 71 | unsigned char old[8]; |
72 | struct urb *irq, *led; | 72 | struct urb *irq, *led; |
@@ -99,29 +99,29 @@ static void usb_kbd_irq(struct urb *urb, struct pt_regs *regs) | |||
99 | goto resubmit; | 99 | goto resubmit; |
100 | } | 100 | } |
101 | 101 | ||
102 | input_regs(&kbd->dev, regs); | 102 | input_regs(kbd->dev, regs); |
103 | 103 | ||
104 | for (i = 0; i < 8; i++) | 104 | for (i = 0; i < 8; i++) |
105 | input_report_key(&kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1); | 105 | input_report_key(kbd->dev, usb_kbd_keycode[i + 224], (kbd->new[0] >> i) & 1); |
106 | 106 | ||
107 | for (i = 2; i < 8; i++) { | 107 | for (i = 2; i < 8; i++) { |
108 | 108 | ||
109 | if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) { | 109 | if (kbd->old[i] > 3 && memscan(kbd->new + 2, kbd->old[i], 6) == kbd->new + 8) { |
110 | if (usb_kbd_keycode[kbd->old[i]]) | 110 | if (usb_kbd_keycode[kbd->old[i]]) |
111 | input_report_key(&kbd->dev, usb_kbd_keycode[kbd->old[i]], 0); | 111 | input_report_key(kbd->dev, usb_kbd_keycode[kbd->old[i]], 0); |
112 | else | 112 | else |
113 | info("Unknown key (scancode %#x) released.", kbd->old[i]); | 113 | info("Unknown key (scancode %#x) released.", kbd->old[i]); |
114 | } | 114 | } |
115 | 115 | ||
116 | if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) { | 116 | if (kbd->new[i] > 3 && memscan(kbd->old + 2, kbd->new[i], 6) == kbd->old + 8) { |
117 | if (usb_kbd_keycode[kbd->new[i]]) | 117 | if (usb_kbd_keycode[kbd->new[i]]) |
118 | input_report_key(&kbd->dev, usb_kbd_keycode[kbd->new[i]], 1); | 118 | input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1); |
119 | else | 119 | else |
120 | info("Unknown key (scancode %#x) pressed.", kbd->new[i]); | 120 | info("Unknown key (scancode %#x) pressed.", kbd->new[i]); |
121 | } | 121 | } |
122 | } | 122 | } |
123 | 123 | ||
124 | input_sync(&kbd->dev); | 124 | input_sync(kbd->dev); |
125 | 125 | ||
126 | memcpy(kbd->old, kbd->new, 8); | 126 | memcpy(kbd->old, kbd->new, 8); |
127 | 127 | ||
@@ -227,12 +227,12 @@ static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) | |||
227 | static int usb_kbd_probe(struct usb_interface *iface, | 227 | static int usb_kbd_probe(struct usb_interface *iface, |
228 | const struct usb_device_id *id) | 228 | const struct usb_device_id *id) |
229 | { | 229 | { |
230 | struct usb_device * dev = interface_to_usbdev(iface); | 230 | struct usb_device *dev = interface_to_usbdev(iface); |
231 | struct usb_host_interface *interface; | 231 | struct usb_host_interface *interface; |
232 | struct usb_endpoint_descriptor *endpoint; | 232 | struct usb_endpoint_descriptor *endpoint; |
233 | struct usb_kbd *kbd; | 233 | struct usb_kbd *kbd; |
234 | struct input_dev *input_dev; | ||
234 | int i, pipe, maxp; | 235 | int i, pipe, maxp; |
235 | char path[64]; | ||
236 | 236 | ||
237 | interface = iface->cur_altsetting; | 237 | interface = iface->cur_altsetting; |
238 | 238 | ||
@@ -240,37 +240,59 @@ static int usb_kbd_probe(struct usb_interface *iface, | |||
240 | return -ENODEV; | 240 | return -ENODEV; |
241 | 241 | ||
242 | endpoint = &interface->endpoint[0].desc; | 242 | endpoint = &interface->endpoint[0].desc; |
243 | if (!(endpoint->bEndpointAddress & 0x80)) | 243 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) |
244 | return -ENODEV; | 244 | return -ENODEV; |
245 | if ((endpoint->bmAttributes & 3) != 3) | 245 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) |
246 | return -ENODEV; | 246 | return -ENODEV; |
247 | 247 | ||
248 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 248 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
249 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); | 249 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); |
250 | 250 | ||
251 | if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) | 251 | kbd = kzalloc(sizeof(struct usb_kbd), GFP_KERNEL); |
252 | return -ENOMEM; | 252 | input_dev = input_allocate_device(); |
253 | memset(kbd, 0, sizeof(struct usb_kbd)); | 253 | if (!kbd || !input_dev) |
254 | goto fail1; | ||
254 | 255 | ||
255 | if (usb_kbd_alloc_mem(dev, kbd)) { | 256 | if (usb_kbd_alloc_mem(dev, kbd)) |
256 | usb_kbd_free_mem(dev, kbd); | 257 | goto fail2; |
257 | kfree(kbd); | ||
258 | return -ENOMEM; | ||
259 | } | ||
260 | 258 | ||
261 | kbd->usbdev = dev; | 259 | kbd->usbdev = dev; |
260 | kbd->dev = input_dev; | ||
261 | |||
262 | if (dev->manufacturer) | ||
263 | strlcpy(kbd->name, dev->manufacturer, sizeof(kbd->name)); | ||
264 | |||
265 | if (dev->product) { | ||
266 | if (dev->manufacturer) | ||
267 | strlcat(kbd->name, " ", sizeof(kbd->name)); | ||
268 | strlcat(kbd->name, dev->product, sizeof(kbd->name)); | ||
269 | } | ||
270 | |||
271 | if (!strlen(kbd->name)) | ||
272 | snprintf(kbd->name, sizeof(kbd->name), | ||
273 | "USB HIDBP Keyboard %04x:%04x", | ||
274 | le16_to_cpu(dev->descriptor.idVendor), | ||
275 | le16_to_cpu(dev->descriptor.idProduct)); | ||
276 | |||
277 | usb_make_path(dev, kbd->phys, sizeof(kbd->phys)); | ||
278 | strlcpy(kbd->phys, "/input0", sizeof(kbd->phys)); | ||
262 | 279 | ||
263 | kbd->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); | 280 | input_dev->name = kbd->name; |
264 | kbd->dev.ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA); | 281 | input_dev->phys = kbd->phys; |
282 | usb_to_input_id(dev, &input_dev->id); | ||
283 | input_dev->cdev.dev = &iface->dev; | ||
284 | input_dev->private = kbd; | ||
285 | |||
286 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP); | ||
287 | input_dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA); | ||
265 | 288 | ||
266 | for (i = 0; i < 255; i++) | 289 | for (i = 0; i < 255; i++) |
267 | set_bit(usb_kbd_keycode[i], kbd->dev.keybit); | 290 | set_bit(usb_kbd_keycode[i], input_dev->keybit); |
268 | clear_bit(0, kbd->dev.keybit); | 291 | clear_bit(0, input_dev->keybit); |
269 | 292 | ||
270 | kbd->dev.private = kbd; | 293 | input_dev->event = usb_kbd_event; |
271 | kbd->dev.event = usb_kbd_event; | 294 | input_dev->open = usb_kbd_open; |
272 | kbd->dev.open = usb_kbd_open; | 295 | input_dev->close = usb_kbd_close; |
273 | kbd->dev.close = usb_kbd_close; | ||
274 | 296 | ||
275 | usb_fill_int_urb(kbd->irq, dev, pipe, | 297 | usb_fill_int_urb(kbd->irq, dev, pipe, |
276 | kbd->new, (maxp > 8 ? 8 : maxp), | 298 | kbd->new, (maxp > 8 ? 8 : maxp), |
@@ -284,37 +306,22 @@ static int usb_kbd_probe(struct usb_interface *iface, | |||
284 | kbd->cr->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); | 306 | kbd->cr->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); |
285 | kbd->cr->wLength = cpu_to_le16(1); | 307 | kbd->cr->wLength = cpu_to_le16(1); |
286 | 308 | ||
287 | usb_make_path(dev, path, 64); | ||
288 | sprintf(kbd->phys, "%s/input0", path); | ||
289 | |||
290 | kbd->dev.name = kbd->name; | ||
291 | kbd->dev.phys = kbd->phys; | ||
292 | usb_to_input_id(dev, &kbd->dev.id); | ||
293 | kbd->dev.dev = &iface->dev; | ||
294 | |||
295 | if (dev->manufacturer) | ||
296 | strcat(kbd->name, dev->manufacturer); | ||
297 | if (dev->product) | ||
298 | sprintf(kbd->name, "%s %s", kbd->name, dev->product); | ||
299 | |||
300 | if (!strlen(kbd->name)) | ||
301 | sprintf(kbd->name, "USB HIDBP Keyboard %04x:%04x", | ||
302 | kbd->dev.id.vendor, kbd->dev.id.product); | ||
303 | |||
304 | usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0), | 309 | usb_fill_control_urb(kbd->led, dev, usb_sndctrlpipe(dev, 0), |
305 | (void *) kbd->cr, kbd->leds, 1, | 310 | (void *) kbd->cr, kbd->leds, 1, |
306 | usb_kbd_led, kbd); | 311 | usb_kbd_led, kbd); |
307 | kbd->led->setup_dma = kbd->cr_dma; | 312 | kbd->led->setup_dma = kbd->cr_dma; |
308 | kbd->led->transfer_dma = kbd->leds_dma; | 313 | kbd->led->transfer_dma = kbd->leds_dma; |
309 | kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | 314 | kbd->led->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); |
310 | | URB_NO_SETUP_DMA_MAP); | ||
311 | 315 | ||
312 | input_register_device(&kbd->dev); | 316 | input_register_device(kbd->dev); |
313 | |||
314 | printk(KERN_INFO "input: %s on %s\n", kbd->name, path); | ||
315 | 317 | ||
316 | usb_set_intfdata(iface, kbd); | 318 | usb_set_intfdata(iface, kbd); |
317 | return 0; | 319 | return 0; |
320 | |||
321 | fail2: usb_kbd_free_mem(dev, kbd); | ||
322 | fail1: input_free_device(input_dev); | ||
323 | kfree(kbd); | ||
324 | return -ENOMEM; | ||
318 | } | 325 | } |
319 | 326 | ||
320 | static void usb_kbd_disconnect(struct usb_interface *intf) | 327 | static void usb_kbd_disconnect(struct usb_interface *intf) |
@@ -324,7 +331,7 @@ static void usb_kbd_disconnect(struct usb_interface *intf) | |||
324 | usb_set_intfdata(intf, NULL); | 331 | usb_set_intfdata(intf, NULL); |
325 | if (kbd) { | 332 | if (kbd) { |
326 | usb_kill_urb(kbd->irq); | 333 | usb_kill_urb(kbd->irq); |
327 | input_unregister_device(&kbd->dev); | 334 | input_unregister_device(kbd->dev); |
328 | usb_kbd_free_mem(interface_to_usbdev(intf), kbd); | 335 | usb_kbd_free_mem(interface_to_usbdev(intf), kbd); |
329 | kfree(kbd); | 336 | kfree(kbd); |
330 | } | 337 | } |
diff --git a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c index 4104dec847fb..230f6b1b314a 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c | |||
@@ -50,7 +50,7 @@ struct usb_mouse { | |||
50 | char name[128]; | 50 | char name[128]; |
51 | char phys[64]; | 51 | char phys[64]; |
52 | struct usb_device *usbdev; | 52 | struct usb_device *usbdev; |
53 | struct input_dev dev; | 53 | struct input_dev *dev; |
54 | struct urb *irq; | 54 | struct urb *irq; |
55 | 55 | ||
56 | signed char *data; | 56 | signed char *data; |
@@ -61,7 +61,7 @@ static void usb_mouse_irq(struct urb *urb, struct pt_regs *regs) | |||
61 | { | 61 | { |
62 | struct usb_mouse *mouse = urb->context; | 62 | struct usb_mouse *mouse = urb->context; |
63 | signed char *data = mouse->data; | 63 | signed char *data = mouse->data; |
64 | struct input_dev *dev = &mouse->dev; | 64 | struct input_dev *dev = mouse->dev; |
65 | int status; | 65 | int status; |
66 | 66 | ||
67 | switch (urb->status) { | 67 | switch (urb->status) { |
@@ -115,14 +115,14 @@ static void usb_mouse_close(struct input_dev *dev) | |||
115 | usb_kill_urb(mouse->irq); | 115 | usb_kill_urb(mouse->irq); |
116 | } | 116 | } |
117 | 117 | ||
118 | static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_id * id) | 118 | static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id) |
119 | { | 119 | { |
120 | struct usb_device * dev = interface_to_usbdev(intf); | 120 | struct usb_device *dev = interface_to_usbdev(intf); |
121 | struct usb_host_interface *interface; | 121 | struct usb_host_interface *interface; |
122 | struct usb_endpoint_descriptor *endpoint; | 122 | struct usb_endpoint_descriptor *endpoint; |
123 | struct usb_mouse *mouse; | 123 | struct usb_mouse *mouse; |
124 | struct input_dev *input_dev; | ||
124 | int pipe, maxp; | 125 | int pipe, maxp; |
125 | char path[64]; | ||
126 | 126 | ||
127 | interface = intf->cur_altsetting; | 127 | interface = intf->cur_altsetting; |
128 | 128 | ||
@@ -130,59 +130,62 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_ | |||
130 | return -ENODEV; | 130 | return -ENODEV; |
131 | 131 | ||
132 | endpoint = &interface->endpoint[0].desc; | 132 | endpoint = &interface->endpoint[0].desc; |
133 | if (!(endpoint->bEndpointAddress & 0x80)) | 133 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) |
134 | return -ENODEV; | 134 | return -ENODEV; |
135 | if ((endpoint->bmAttributes & 3) != 3) | 135 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) |
136 | return -ENODEV; | 136 | return -ENODEV; |
137 | 137 | ||
138 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 138 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
139 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); | 139 | maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); |
140 | 140 | ||
141 | if (!(mouse = kmalloc(sizeof(struct usb_mouse), GFP_KERNEL))) | 141 | mouse = kzalloc(sizeof(struct usb_mouse), GFP_KERNEL); |
142 | return -ENOMEM; | 142 | input_dev = input_allocate_device(); |
143 | memset(mouse, 0, sizeof(struct usb_mouse)); | 143 | if (!mouse || !input_dev) |
144 | goto fail1; | ||
144 | 145 | ||
145 | mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma); | 146 | mouse->data = usb_buffer_alloc(dev, 8, SLAB_ATOMIC, &mouse->data_dma); |
146 | if (!mouse->data) { | 147 | if (!mouse->data) |
147 | kfree(mouse); | 148 | goto fail1; |
148 | return -ENOMEM; | ||
149 | } | ||
150 | 149 | ||
151 | mouse->irq = usb_alloc_urb(0, GFP_KERNEL); | 150 | mouse->irq = usb_alloc_urb(0, GFP_KERNEL); |
152 | if (!mouse->irq) { | 151 | if (!mouse->irq) |
153 | usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); | 152 | goto fail2; |
154 | kfree(mouse); | ||
155 | return -ENODEV; | ||
156 | } | ||
157 | 153 | ||
158 | mouse->usbdev = dev; | 154 | mouse->usbdev = dev; |
155 | mouse->dev = input_dev; | ||
156 | |||
157 | if (dev->manufacturer) | ||
158 | strlcpy(mouse->name, dev->manufacturer, sizeof(mouse->name)); | ||
159 | 159 | ||
160 | mouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | 160 | if (dev->product) { |
161 | mouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | 161 | if (dev->manufacturer) |
162 | mouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y); | 162 | strlcat(mouse->name, " ", sizeof(mouse->name)); |
163 | mouse->dev.keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA); | 163 | strlcat(mouse->name, dev->product, sizeof(mouse->name)); |
164 | mouse->dev.relbit[0] |= BIT(REL_WHEEL); | 164 | } |
165 | 165 | ||
166 | mouse->dev.private = mouse; | 166 | if (!strlen(mouse->name)) |
167 | mouse->dev.open = usb_mouse_open; | 167 | snprintf(mouse->name, sizeof(mouse->name), |
168 | mouse->dev.close = usb_mouse_close; | 168 | "USB HIDBP Mouse %04x:%04x", |
169 | le16_to_cpu(dev->descriptor.idVendor), | ||
170 | le16_to_cpu(dev->descriptor.idProduct)); | ||
169 | 171 | ||
170 | usb_make_path(dev, path, 64); | 172 | usb_make_path(dev, mouse->phys, sizeof(mouse->phys)); |
171 | sprintf(mouse->phys, "%s/input0", path); | 173 | strlcat(mouse->phys, "/input0", sizeof(mouse->phys)); |
172 | 174 | ||
173 | mouse->dev.name = mouse->name; | 175 | input_dev->name = mouse->name; |
174 | mouse->dev.phys = mouse->phys; | 176 | input_dev->phys = mouse->phys; |
175 | usb_to_input_id(dev, &mouse->dev.id); | 177 | usb_to_input_id(dev, &input_dev->id); |
176 | mouse->dev.dev = &intf->dev; | 178 | input_dev->cdev.dev = &intf->dev; |
177 | 179 | ||
178 | if (dev->manufacturer) | 180 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
179 | strcat(mouse->name, dev->manufacturer); | 181 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); |
180 | if (dev->product) | 182 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); |
181 | sprintf(mouse->name, "%s %s", mouse->name, dev->product); | 183 | input_dev->keybit[LONG(BTN_MOUSE)] |= BIT(BTN_SIDE) | BIT(BTN_EXTRA); |
184 | input_dev->relbit[0] |= BIT(REL_WHEEL); | ||
182 | 185 | ||
183 | if (!strlen(mouse->name)) | 186 | input_dev->private = mouse; |
184 | sprintf(mouse->name, "USB HIDBP Mouse %04x:%04x", | 187 | input_dev->open = usb_mouse_open; |
185 | mouse->dev.id.vendor, mouse->dev.id.product); | 188 | input_dev->close = usb_mouse_close; |
186 | 189 | ||
187 | usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data, | 190 | usb_fill_int_urb(mouse->irq, dev, pipe, mouse->data, |
188 | (maxp > 8 ? 8 : maxp), | 191 | (maxp > 8 ? 8 : maxp), |
@@ -190,11 +193,15 @@ static int usb_mouse_probe(struct usb_interface * intf, const struct usb_device_ | |||
190 | mouse->irq->transfer_dma = mouse->data_dma; | 193 | mouse->irq->transfer_dma = mouse->data_dma; |
191 | mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 194 | mouse->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
192 | 195 | ||
193 | input_register_device(&mouse->dev); | 196 | input_register_device(mouse->dev); |
194 | printk(KERN_INFO "input: %s on %s\n", mouse->name, path); | ||
195 | 197 | ||
196 | usb_set_intfdata(intf, mouse); | 198 | usb_set_intfdata(intf, mouse); |
197 | return 0; | 199 | return 0; |
200 | |||
201 | fail2: usb_buffer_free(dev, 8, mouse->data, mouse->data_dma); | ||
202 | fail1: input_free_device(input_dev); | ||
203 | kfree(mouse); | ||
204 | return -ENOMEM; | ||
198 | } | 205 | } |
199 | 206 | ||
200 | static void usb_mouse_disconnect(struct usb_interface *intf) | 207 | static void usb_mouse_disconnect(struct usb_interface *intf) |
@@ -204,7 +211,7 @@ static void usb_mouse_disconnect(struct usb_interface *intf) | |||
204 | usb_set_intfdata(intf, NULL); | 211 | usb_set_intfdata(intf, NULL); |
205 | if (mouse) { | 212 | if (mouse) { |
206 | usb_kill_urb(mouse->irq); | 213 | usb_kill_urb(mouse->irq); |
207 | input_unregister_device(&mouse->dev); | 214 | input_unregister_device(mouse->dev); |
208 | usb_free_urb(mouse->irq); | 215 | usb_free_urb(mouse->irq); |
209 | usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma); | 216 | usb_buffer_free(interface_to_usbdev(intf), 8, mouse->data, mouse->data_dma); |
210 | kfree(mouse); | 217 | kfree(mouse); |
diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c index 3b266af3048a..ea0f75773ae1 100644 --- a/drivers/usb/input/wacom.c +++ b/drivers/usb/input/wacom.c | |||
@@ -111,7 +111,7 @@ struct wacom_features { | |||
111 | struct wacom { | 111 | struct wacom { |
112 | signed char *data; | 112 | signed char *data; |
113 | dma_addr_t data_dma; | 113 | dma_addr_t data_dma; |
114 | struct input_dev dev; | 114 | struct input_dev *dev; |
115 | struct usb_device *usbdev; | 115 | struct usb_device *usbdev; |
116 | struct urb *irq; | 116 | struct urb *irq; |
117 | struct wacom_features *features; | 117 | struct wacom_features *features; |
@@ -135,7 +135,7 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs) | |||
135 | { | 135 | { |
136 | struct wacom *wacom = urb->context; | 136 | struct wacom *wacom = urb->context; |
137 | unsigned char *data = wacom->data; | 137 | unsigned char *data = wacom->data; |
138 | struct input_dev *dev = &wacom->dev; | 138 | struct input_dev *dev = wacom->dev; |
139 | int prox, pressure; | 139 | int prox, pressure; |
140 | int retval; | 140 | int retval; |
141 | 141 | ||
@@ -225,7 +225,7 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs) | |||
225 | { | 225 | { |
226 | struct wacom *wacom = urb->context; | 226 | struct wacom *wacom = urb->context; |
227 | unsigned char *data = wacom->data; | 227 | unsigned char *data = wacom->data; |
228 | struct input_dev *dev = &wacom->dev; | 228 | struct input_dev *dev = wacom->dev; |
229 | int retval; | 229 | int retval; |
230 | 230 | ||
231 | switch (urb->status) { | 231 | switch (urb->status) { |
@@ -275,7 +275,7 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs) | |||
275 | { | 275 | { |
276 | struct wacom *wacom = urb->context; | 276 | struct wacom *wacom = urb->context; |
277 | unsigned char *data = wacom->data; | 277 | unsigned char *data = wacom->data; |
278 | struct input_dev *dev = &wacom->dev; | 278 | struct input_dev *dev = wacom->dev; |
279 | int retval; | 279 | int retval; |
280 | 280 | ||
281 | switch (urb->status) { | 281 | switch (urb->status) { |
@@ -318,7 +318,7 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) | |||
318 | { | 318 | { |
319 | struct wacom *wacom = urb->context; | 319 | struct wacom *wacom = urb->context; |
320 | unsigned char *data = wacom->data; | 320 | unsigned char *data = wacom->data; |
321 | struct input_dev *dev = &wacom->dev; | 321 | struct input_dev *dev = wacom->dev; |
322 | int x, y; | 322 | int x, y; |
323 | int retval; | 323 | int retval; |
324 | 324 | ||
@@ -397,7 +397,7 @@ static int wacom_intuos_inout(struct urb *urb) | |||
397 | { | 397 | { |
398 | struct wacom *wacom = urb->context; | 398 | struct wacom *wacom = urb->context; |
399 | unsigned char *data = wacom->data; | 399 | unsigned char *data = wacom->data; |
400 | struct input_dev *dev = &wacom->dev; | 400 | struct input_dev *dev = wacom->dev; |
401 | int idx; | 401 | int idx; |
402 | 402 | ||
403 | /* tool number */ | 403 | /* tool number */ |
@@ -479,7 +479,7 @@ static void wacom_intuos_general(struct urb *urb) | |||
479 | { | 479 | { |
480 | struct wacom *wacom = urb->context; | 480 | struct wacom *wacom = urb->context; |
481 | unsigned char *data = wacom->data; | 481 | unsigned char *data = wacom->data; |
482 | struct input_dev *dev = &wacom->dev; | 482 | struct input_dev *dev = wacom->dev; |
483 | unsigned int t; | 483 | unsigned int t; |
484 | 484 | ||
485 | /* general pen packet */ | 485 | /* general pen packet */ |
@@ -509,7 +509,7 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) | |||
509 | { | 509 | { |
510 | struct wacom *wacom = urb->context; | 510 | struct wacom *wacom = urb->context; |
511 | unsigned char *data = wacom->data; | 511 | unsigned char *data = wacom->data; |
512 | struct input_dev *dev = &wacom->dev; | 512 | struct input_dev *dev = wacom->dev; |
513 | unsigned int t; | 513 | unsigned int t; |
514 | int idx; | 514 | int idx; |
515 | int retval; | 515 | int retval; |
@@ -738,95 +738,83 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
738 | { | 738 | { |
739 | struct usb_device *dev = interface_to_usbdev(intf); | 739 | struct usb_device *dev = interface_to_usbdev(intf); |
740 | struct usb_endpoint_descriptor *endpoint; | 740 | struct usb_endpoint_descriptor *endpoint; |
741 | char rep_data[2] = {0x02, 0x02}; | ||
742 | struct wacom *wacom; | 741 | struct wacom *wacom; |
743 | char path[64]; | 742 | struct input_dev *input_dev; |
743 | char rep_data[2] = {0x02, 0x02}; | ||
744 | 744 | ||
745 | if (!(wacom = kmalloc(sizeof(struct wacom), GFP_KERNEL))) | 745 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
746 | return -ENOMEM; | 746 | input_dev = input_allocate_device(); |
747 | memset(wacom, 0, sizeof(struct wacom)); | 747 | if (!wacom || !input_dev) |
748 | goto fail1; | ||
748 | 749 | ||
749 | wacom->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma); | 750 | wacom->data = usb_buffer_alloc(dev, 10, GFP_KERNEL, &wacom->data_dma); |
750 | if (!wacom->data) { | 751 | if (!wacom->data) |
751 | kfree(wacom); | 752 | goto fail1; |
752 | return -ENOMEM; | ||
753 | } | ||
754 | 753 | ||
755 | wacom->irq = usb_alloc_urb(0, GFP_KERNEL); | 754 | wacom->irq = usb_alloc_urb(0, GFP_KERNEL); |
756 | if (!wacom->irq) { | 755 | if (!wacom->irq) |
757 | usb_buffer_free(dev, 10, wacom->data, wacom->data_dma); | 756 | goto fail2; |
758 | kfree(wacom); | 757 | |
759 | return -ENOMEM; | 758 | wacom->usbdev = dev; |
760 | } | 759 | wacom->dev = input_dev; |
760 | usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); | ||
761 | strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); | ||
761 | 762 | ||
762 | wacom->features = wacom_features + (id - wacom_ids); | 763 | wacom->features = wacom_features + (id - wacom_ids); |
764 | if (wacom->features->pktlen > 10) | ||
765 | BUG(); | ||
766 | |||
767 | input_dev->name = wacom->features->name; | ||
768 | usb_to_input_id(dev, &input_dev->id); | ||
763 | 769 | ||
764 | wacom->dev.evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS); | 770 | input_dev->cdev.dev = &intf->dev; |
765 | wacom->dev.absbit[0] |= BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE); | 771 | input_dev->private = wacom; |
766 | wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS); | 772 | input_dev->open = wacom_open; |
773 | input_dev->close = wacom_close; | ||
774 | |||
775 | input_dev->evbit[0] |= BIT(EV_KEY) | BIT(EV_ABS); | ||
776 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_PEN) | BIT(BTN_TOUCH) | BIT(BTN_STYLUS); | ||
777 | input_set_abs_params(input_dev, ABS_X, 0, wacom->features->y_max, 4, 0); | ||
778 | input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0); | ||
779 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); | ||
767 | 780 | ||
768 | switch (wacom->features->type) { | 781 | switch (wacom->features->type) { |
769 | case GRAPHIRE: | 782 | case GRAPHIRE: |
770 | wacom->dev.evbit[0] |= BIT(EV_REL); | 783 | input_dev->evbit[0] |= BIT(EV_REL); |
771 | wacom->dev.relbit[0] |= BIT(REL_WHEEL); | 784 | input_dev->relbit[0] |= BIT(REL_WHEEL); |
772 | wacom->dev.absbit[0] |= BIT(ABS_DISTANCE); | 785 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); |
773 | wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | 786 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2); |
774 | wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_STYLUS2); | 787 | input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0); |
775 | break; | 788 | break; |
776 | 789 | ||
777 | case INTUOS3: | 790 | case INTUOS3: |
778 | case CINTIQ: | 791 | case CINTIQ: |
779 | wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); | 792 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); |
780 | wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); | 793 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); |
781 | wacom->dev.absbit[0] |= BIT(ABS_RX) | BIT(ABS_RY); | 794 | input_set_abs_params(input_dev, ABS_RX, 0, 4097, 0, 0); |
795 | input_set_abs_params(input_dev, ABS_RY, 0, 4097, 0, 0); | ||
782 | /* fall through */ | 796 | /* fall through */ |
783 | 797 | ||
784 | case INTUOS: | 798 | case INTUOS: |
785 | wacom->dev.evbit[0] |= BIT(EV_MSC) | BIT(EV_REL); | 799 | input_dev->evbit[0] |= BIT(EV_MSC) | BIT(EV_REL); |
786 | wacom->dev.mscbit[0] |= BIT(MSC_SERIAL); | 800 | input_dev->mscbit[0] |= BIT(MSC_SERIAL); |
787 | wacom->dev.relbit[0] |= BIT(REL_WHEEL); | 801 | input_dev->relbit[0] |= BIT(REL_WHEEL); |
788 | wacom->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA); | 802 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE) | BIT(BTN_SIDE) | BIT(BTN_EXTRA); |
789 | wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH) | 803 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_RUBBER) | BIT(BTN_TOOL_MOUSE) | BIT(BTN_TOOL_BRUSH) |
790 | | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2); | 804 | | BIT(BTN_TOOL_PENCIL) | BIT(BTN_TOOL_AIRBRUSH) | BIT(BTN_TOOL_LENS) | BIT(BTN_STYLUS2); |
791 | wacom->dev.absbit[0] |= BIT(ABS_DISTANCE) | BIT(ABS_WHEEL) | BIT(ABS_TILT_X) | BIT(ABS_TILT_Y) | BIT(ABS_RZ) | BIT(ABS_THROTTLE); | 805 | input_set_abs_params(input_dev, ABS_DISTANCE, 0, wacom->features->distance_max, 0, 0); |
806 | input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); | ||
807 | input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); | ||
808 | input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); | ||
809 | input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0); | ||
810 | input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); | ||
792 | break; | 811 | break; |
793 | 812 | ||
794 | case PL: | 813 | case PL: |
795 | wacom->dev.keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER); | 814 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_STYLUS2) | BIT(BTN_TOOL_RUBBER); |
796 | break; | 815 | break; |
797 | } | 816 | } |
798 | 817 | ||
799 | wacom->dev.absmax[ABS_X] = wacom->features->x_max; | ||
800 | wacom->dev.absmax[ABS_Y] = wacom->features->y_max; | ||
801 | wacom->dev.absmax[ABS_PRESSURE] = wacom->features->pressure_max; | ||
802 | wacom->dev.absmax[ABS_DISTANCE] = wacom->features->distance_max; | ||
803 | wacom->dev.absmax[ABS_TILT_X] = 127; | ||
804 | wacom->dev.absmax[ABS_TILT_Y] = 127; | ||
805 | wacom->dev.absmax[ABS_WHEEL] = 1023; | ||
806 | |||
807 | wacom->dev.absmax[ABS_RX] = 4097; | ||
808 | wacom->dev.absmax[ABS_RY] = 4097; | ||
809 | wacom->dev.absmin[ABS_RZ] = -900; | ||
810 | wacom->dev.absmax[ABS_RZ] = 899; | ||
811 | wacom->dev.absmin[ABS_THROTTLE] = -1023; | ||
812 | wacom->dev.absmax[ABS_THROTTLE] = 1023; | ||
813 | |||
814 | wacom->dev.absfuzz[ABS_X] = 4; | ||
815 | wacom->dev.absfuzz[ABS_Y] = 4; | ||
816 | |||
817 | wacom->dev.private = wacom; | ||
818 | wacom->dev.open = wacom_open; | ||
819 | wacom->dev.close = wacom_close; | ||
820 | |||
821 | usb_make_path(dev, path, 64); | ||
822 | sprintf(wacom->phys, "%s/input0", path); | ||
823 | |||
824 | wacom->dev.name = wacom->features->name; | ||
825 | wacom->dev.phys = wacom->phys; | ||
826 | usb_to_input_id(dev, &wacom->dev.id); | ||
827 | wacom->dev.dev = &intf->dev; | ||
828 | wacom->usbdev = dev; | ||
829 | |||
830 | endpoint = &intf->cur_altsetting->endpoint[0].desc; | 818 | endpoint = &intf->cur_altsetting->endpoint[0].desc; |
831 | 819 | ||
832 | if (wacom->features->pktlen > 10) | 820 | if (wacom->features->pktlen > 10) |
@@ -839,18 +827,20 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
839 | wacom->irq->transfer_dma = wacom->data_dma; | 827 | wacom->irq->transfer_dma = wacom->data_dma; |
840 | wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 828 | wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
841 | 829 | ||
842 | input_register_device(&wacom->dev); | 830 | input_register_device(wacom->dev); |
843 | 831 | ||
844 | /* ask the tablet to report tablet data */ | 832 | /* ask the tablet to report tablet data */ |
845 | usb_set_report(intf, 3, 2, rep_data, 2); | 833 | usb_set_report(intf, 3, 2, rep_data, 2); |
846 | /* repeat once (not sure why the first call often fails) */ | 834 | /* repeat once (not sure why the first call often fails) */ |
847 | usb_set_report(intf, 3, 2, rep_data, 2); | 835 | usb_set_report(intf, 3, 2, rep_data, 2); |
848 | 836 | ||
849 | printk(KERN_INFO "input: %s on %s\n", wacom->features->name, path); | ||
850 | |||
851 | usb_set_intfdata(intf, wacom); | 837 | usb_set_intfdata(intf, wacom); |
852 | |||
853 | return 0; | 838 | return 0; |
839 | |||
840 | fail2: usb_buffer_free(dev, 10, wacom->data, wacom->data_dma); | ||
841 | fail1: input_free_device(input_dev); | ||
842 | kfree(wacom); | ||
843 | return -ENOMEM; | ||
854 | } | 844 | } |
855 | 845 | ||
856 | static void wacom_disconnect(struct usb_interface *intf) | 846 | static void wacom_disconnect(struct usb_interface *intf) |
@@ -860,7 +850,7 @@ static void wacom_disconnect(struct usb_interface *intf) | |||
860 | usb_set_intfdata(intf, NULL); | 850 | usb_set_intfdata(intf, NULL); |
861 | if (wacom) { | 851 | if (wacom) { |
862 | usb_kill_urb(wacom->irq); | 852 | usb_kill_urb(wacom->irq); |
863 | input_unregister_device(&wacom->dev); | 853 | input_unregister_device(wacom->dev); |
864 | usb_free_urb(wacom->irq); | 854 | usb_free_urb(wacom->irq); |
865 | usb_buffer_free(interface_to_usbdev(intf), 10, wacom->data, wacom->data_dma); | 855 | usb_buffer_free(interface_to_usbdev(intf), 10, wacom->data, wacom->data_dma); |
866 | kfree(wacom); | 856 | kfree(wacom); |
diff --git a/drivers/usb/input/xpad.c b/drivers/usb/input/xpad.c index 18125e0bffa2..43112f040b6d 100644 --- a/drivers/usb/input/xpad.c +++ b/drivers/usb/input/xpad.c | |||
@@ -103,7 +103,7 @@ static struct usb_device_id xpad_table [] = { | |||
103 | MODULE_DEVICE_TABLE (usb, xpad_table); | 103 | MODULE_DEVICE_TABLE (usb, xpad_table); |
104 | 104 | ||
105 | struct usb_xpad { | 105 | struct usb_xpad { |
106 | struct input_dev dev; /* input device interface */ | 106 | struct input_dev *dev; /* input device interface */ |
107 | struct usb_device *udev; /* usb device */ | 107 | struct usb_device *udev; /* usb device */ |
108 | 108 | ||
109 | struct urb *irq_in; /* urb for interrupt in report */ | 109 | struct urb *irq_in; /* urb for interrupt in report */ |
@@ -125,7 +125,7 @@ struct usb_xpad { | |||
125 | 125 | ||
126 | static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, struct pt_regs *regs) | 126 | static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, struct pt_regs *regs) |
127 | { | 127 | { |
128 | struct input_dev *dev = &xpad->dev; | 128 | struct input_dev *dev = xpad->dev; |
129 | 129 | ||
130 | input_regs(dev, regs); | 130 | input_regs(dev, regs); |
131 | 131 | ||
@@ -214,9 +214,9 @@ static void xpad_close (struct input_dev *dev) | |||
214 | static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) | 214 | static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) |
215 | { | 215 | { |
216 | struct usb_device *udev = interface_to_usbdev (intf); | 216 | struct usb_device *udev = interface_to_usbdev (intf); |
217 | struct usb_xpad *xpad = NULL; | 217 | struct usb_xpad *xpad; |
218 | struct input_dev *input_dev; | ||
218 | struct usb_endpoint_descriptor *ep_irq_in; | 219 | struct usb_endpoint_descriptor *ep_irq_in; |
219 | char path[64]; | ||
220 | int i; | 220 | int i; |
221 | 221 | ||
222 | for (i = 0; xpad_device[i].idVendor; i++) { | 222 | for (i = 0; xpad_device[i].idVendor; i++) { |
@@ -225,89 +225,80 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
225 | break; | 225 | break; |
226 | } | 226 | } |
227 | 227 | ||
228 | if ((xpad = kmalloc (sizeof(struct usb_xpad), GFP_KERNEL)) == NULL) { | 228 | xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); |
229 | err("cannot allocate memory for new pad"); | 229 | input_dev = input_allocate_device(); |
230 | return -ENOMEM; | 230 | if (!xpad || !input_dev) |
231 | } | 231 | goto fail1; |
232 | memset(xpad, 0, sizeof(struct usb_xpad)); | ||
233 | 232 | ||
234 | xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN, | 233 | xpad->idata = usb_buffer_alloc(udev, XPAD_PKT_LEN, |
235 | SLAB_ATOMIC, &xpad->idata_dma); | 234 | SLAB_ATOMIC, &xpad->idata_dma); |
236 | if (!xpad->idata) { | 235 | if (!xpad->idata) |
237 | kfree(xpad); | 236 | goto fail1; |
238 | return -ENOMEM; | ||
239 | } | ||
240 | 237 | ||
241 | xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); | 238 | xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); |
242 | if (!xpad->irq_in) { | 239 | if (!xpad->irq_in) |
243 | err("cannot allocate memory for new pad irq urb"); | 240 | goto fail2; |
244 | usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); | ||
245 | kfree(xpad); | ||
246 | return -ENOMEM; | ||
247 | } | ||
248 | |||
249 | ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; | ||
250 | |||
251 | usb_fill_int_urb(xpad->irq_in, udev, | ||
252 | usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), | ||
253 | xpad->idata, XPAD_PKT_LEN, xpad_irq_in, | ||
254 | xpad, ep_irq_in->bInterval); | ||
255 | xpad->irq_in->transfer_dma = xpad->idata_dma; | ||
256 | xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
257 | 241 | ||
258 | xpad->udev = udev; | 242 | xpad->udev = udev; |
243 | xpad->dev = input_dev; | ||
244 | usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); | ||
245 | strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); | ||
259 | 246 | ||
260 | usb_to_input_id(udev, &xpad->dev.id); | 247 | input_dev->name = xpad_device[i].name; |
261 | xpad->dev.dev = &intf->dev; | 248 | input_dev->phys = xpad->phys; |
262 | xpad->dev.private = xpad; | 249 | usb_to_input_id(udev, &input_dev->id); |
263 | xpad->dev.name = xpad_device[i].name; | 250 | input_dev->cdev.dev = &intf->dev; |
264 | xpad->dev.phys = xpad->phys; | 251 | input_dev->private = xpad; |
265 | xpad->dev.open = xpad_open; | 252 | input_dev->open = xpad_open; |
266 | xpad->dev.close = xpad_close; | 253 | input_dev->close = xpad_close; |
267 | |||
268 | usb_make_path(udev, path, 64); | ||
269 | snprintf(xpad->phys, 64, "%s/input0", path); | ||
270 | 254 | ||
271 | xpad->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 255 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
272 | 256 | ||
273 | for (i = 0; xpad_btn[i] >= 0; i++) | 257 | for (i = 0; xpad_btn[i] >= 0; i++) |
274 | set_bit(xpad_btn[i], xpad->dev.keybit); | 258 | set_bit(xpad_btn[i], input_dev->keybit); |
275 | 259 | ||
276 | for (i = 0; xpad_abs[i] >= 0; i++) { | 260 | for (i = 0; xpad_abs[i] >= 0; i++) { |
277 | 261 | ||
278 | signed short t = xpad_abs[i]; | 262 | signed short t = xpad_abs[i]; |
279 | 263 | ||
280 | set_bit(t, xpad->dev.absbit); | 264 | set_bit(t, input_dev->absbit); |
281 | 265 | ||
282 | switch (t) { | 266 | switch (t) { |
283 | case ABS_X: | 267 | case ABS_X: |
284 | case ABS_Y: | 268 | case ABS_Y: |
285 | case ABS_RX: | 269 | case ABS_RX: |
286 | case ABS_RY: /* the two sticks */ | 270 | case ABS_RY: /* the two sticks */ |
287 | xpad->dev.absmax[t] = 32767; | 271 | input_set_abs_params(input_dev, t, -32768, 32767, 16, 128); |
288 | xpad->dev.absmin[t] = -32768; | ||
289 | xpad->dev.absflat[t] = 128; | ||
290 | xpad->dev.absfuzz[t] = 16; | ||
291 | break; | 272 | break; |
292 | case ABS_Z: | 273 | case ABS_Z: |
293 | case ABS_RZ: /* the triggers */ | 274 | case ABS_RZ: /* the triggers */ |
294 | xpad->dev.absmax[t] = 255; | 275 | input_set_abs_params(input_dev, t, 0, 255, 0, 0); |
295 | xpad->dev.absmin[t] = 0; | ||
296 | break; | 276 | break; |
297 | case ABS_HAT0X: | 277 | case ABS_HAT0X: |
298 | case ABS_HAT0Y: /* the d-pad */ | 278 | case ABS_HAT0Y: /* the d-pad */ |
299 | xpad->dev.absmax[t] = 1; | 279 | input_set_abs_params(input_dev, t, -1, 1, 0, 0); |
300 | xpad->dev.absmin[t] = -1; | ||
301 | break; | 280 | break; |
302 | } | 281 | } |
303 | } | 282 | } |
304 | 283 | ||
305 | input_register_device(&xpad->dev); | 284 | ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; |
285 | usb_fill_int_urb(xpad->irq_in, udev, | ||
286 | usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), | ||
287 | xpad->idata, XPAD_PKT_LEN, xpad_irq_in, | ||
288 | xpad, ep_irq_in->bInterval); | ||
289 | xpad->irq_in->transfer_dma = xpad->idata_dma; | ||
290 | xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
306 | 291 | ||
307 | printk(KERN_INFO "input: %s on %s", xpad->dev.name, path); | 292 | input_register_device(xpad->dev); |
308 | 293 | ||
309 | usb_set_intfdata(intf, xpad); | 294 | usb_set_intfdata(intf, xpad); |
310 | return 0; | 295 | return 0; |
296 | |||
297 | fail2: usb_buffer_free(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); | ||
298 | fail1: input_free_device(input_dev); | ||
299 | kfree(xpad); | ||
300 | return -ENOMEM; | ||
301 | |||
311 | } | 302 | } |
312 | 303 | ||
313 | static void xpad_disconnect(struct usb_interface *intf) | 304 | static void xpad_disconnect(struct usb_interface *intf) |
@@ -317,7 +308,7 @@ static void xpad_disconnect(struct usb_interface *intf) | |||
317 | usb_set_intfdata(intf, NULL); | 308 | usb_set_intfdata(intf, NULL); |
318 | if (xpad) { | 309 | if (xpad) { |
319 | usb_kill_urb(xpad->irq_in); | 310 | usb_kill_urb(xpad->irq_in); |
320 | input_unregister_device(&xpad->dev); | 311 | input_unregister_device(xpad->dev); |
321 | usb_free_urb(xpad->irq_in); | 312 | usb_free_urb(xpad->irq_in); |
322 | usb_buffer_free(interface_to_usbdev(intf), XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); | 313 | usb_buffer_free(interface_to_usbdev(intf), XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); |
323 | kfree(xpad); | 314 | kfree(xpad); |
diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c index 58a176ef96a5..f526aebea502 100644 --- a/drivers/usb/input/yealink.c +++ b/drivers/usb/input/yealink.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <linux/module.h> | 54 | #include <linux/module.h> |
55 | #include <linux/rwsem.h> | 55 | #include <linux/rwsem.h> |
56 | #include <linux/usb.h> | 56 | #include <linux/usb.h> |
57 | #include <linux/usb_input.h> | ||
57 | 58 | ||
58 | #include "map_to_7segment.h" | 59 | #include "map_to_7segment.h" |
59 | #include "yealink.h" | 60 | #include "yealink.h" |
@@ -101,12 +102,12 @@ static const struct lcd_segment_map { | |||
101 | }; | 102 | }; |
102 | 103 | ||
103 | struct yealink_dev { | 104 | struct yealink_dev { |
104 | struct input_dev idev; /* input device */ | 105 | struct input_dev *idev; /* input device */ |
105 | struct usb_device *udev; /* usb device */ | 106 | struct usb_device *udev; /* usb device */ |
106 | 107 | ||
107 | /* irq input channel */ | 108 | /* irq input channel */ |
108 | struct yld_ctl_packet *irq_data; | 109 | struct yld_ctl_packet *irq_data; |
109 | dma_addr_t irq_dma; | 110 | dma_addr_t irq_dma; |
110 | struct urb *urb_irq; | 111 | struct urb *urb_irq; |
111 | 112 | ||
112 | /* control output channel */ | 113 | /* control output channel */ |
@@ -237,7 +238,7 @@ static int map_p1k_to_key(int scancode) | |||
237 | */ | 238 | */ |
238 | static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs) | 239 | static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs) |
239 | { | 240 | { |
240 | struct input_dev *idev = &yld->idev; | 241 | struct input_dev *idev = yld->idev; |
241 | 242 | ||
242 | input_regs(idev, regs); | 243 | input_regs(idev, regs); |
243 | if (yld->key_code >= 0) { | 244 | if (yld->key_code >= 0) { |
@@ -809,8 +810,12 @@ static int usb_cleanup(struct yealink_dev *yld, int err) | |||
809 | } | 810 | } |
810 | if (yld->urb_ctl) | 811 | if (yld->urb_ctl) |
811 | usb_free_urb(yld->urb_ctl); | 812 | usb_free_urb(yld->urb_ctl); |
812 | if (yld->idev.dev) | 813 | if (yld->idev) { |
813 | input_unregister_device(&yld->idev); | 814 | if (err) |
815 | input_free_device(yld->idev); | ||
816 | else | ||
817 | input_unregister_device(yld->idev); | ||
818 | } | ||
814 | if (yld->ctl_req) | 819 | if (yld->ctl_req) |
815 | usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)), | 820 | usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)), |
816 | yld->ctl_req, yld->ctl_req_dma); | 821 | yld->ctl_req, yld->ctl_req_dma); |
@@ -857,7 +862,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
857 | struct usb_host_interface *interface; | 862 | struct usb_host_interface *interface; |
858 | struct usb_endpoint_descriptor *endpoint; | 863 | struct usb_endpoint_descriptor *endpoint; |
859 | struct yealink_dev *yld; | 864 | struct yealink_dev *yld; |
860 | char path[64]; | 865 | struct input_dev *input_dev; |
861 | int ret, pipe, i; | 866 | int ret, pipe, i; |
862 | 867 | ||
863 | i = usb_match(udev); | 868 | i = usb_match(udev); |
@@ -866,17 +871,21 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
866 | 871 | ||
867 | interface = intf->cur_altsetting; | 872 | interface = intf->cur_altsetting; |
868 | endpoint = &interface->endpoint[0].desc; | 873 | endpoint = &interface->endpoint[0].desc; |
869 | if (!(endpoint->bEndpointAddress & 0x80)) | 874 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) |
870 | return -EIO; | 875 | return -EIO; |
871 | if ((endpoint->bmAttributes & 3) != 3) | 876 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) |
872 | return -EIO; | 877 | return -EIO; |
873 | 878 | ||
874 | if ((yld = kmalloc(sizeof(struct yealink_dev), GFP_KERNEL)) == NULL) | 879 | yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); |
880 | if (!yld) | ||
875 | return -ENOMEM; | 881 | return -ENOMEM; |
876 | 882 | ||
877 | memset(yld, 0, sizeof(*yld)); | ||
878 | yld->udev = udev; | 883 | yld->udev = udev; |
879 | 884 | ||
885 | yld->idev = input_dev = input_allocate_device(); | ||
886 | if (!input_dev) | ||
887 | return usb_cleanup(yld, -ENOMEM); | ||
888 | |||
880 | /* allocate usb buffers */ | 889 | /* allocate usb buffers */ |
881 | yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN, | 890 | yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN, |
882 | SLAB_ATOMIC, &yld->irq_dma); | 891 | SLAB_ATOMIC, &yld->irq_dma); |
@@ -935,42 +944,37 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
935 | yld->urb_ctl->dev = udev; | 944 | yld->urb_ctl->dev = udev; |
936 | 945 | ||
937 | /* find out the physical bus location */ | 946 | /* find out the physical bus location */ |
938 | if (usb_make_path(udev, path, sizeof(path)) > 0) | 947 | usb_make_path(udev, yld->phys, sizeof(yld->phys)); |
939 | snprintf(yld->phys, sizeof(yld->phys)-1, "%s/input0", path); | 948 | strlcat(yld->phys, "/input0", sizeof(yld->phys)); |
940 | 949 | ||
941 | /* register settings for the input device */ | 950 | /* register settings for the input device */ |
942 | init_input_dev(&yld->idev); | 951 | input_dev->name = yld_device[i].name; |
943 | yld->idev.private = yld; | 952 | input_dev->phys = yld->phys; |
944 | yld->idev.id.bustype = BUS_USB; | 953 | usb_to_input_id(udev, &input_dev->id); |
945 | yld->idev.id.vendor = le16_to_cpu(udev->descriptor.idVendor); | 954 | input_dev->cdev.dev = &intf->dev; |
946 | yld->idev.id.product = le16_to_cpu(udev->descriptor.idProduct); | 955 | |
947 | yld->idev.id.version = le16_to_cpu(udev->descriptor.bcdDevice); | 956 | input_dev->private = yld; |
948 | yld->idev.dev = &intf->dev; | 957 | input_dev->open = input_open; |
949 | yld->idev.name = yld_device[i].name; | 958 | input_dev->close = input_close; |
950 | yld->idev.phys = yld->phys; | 959 | /* input_dev->event = input_ev; TODO */ |
951 | /* yld->idev.event = input_ev; TODO */ | ||
952 | yld->idev.open = input_open; | ||
953 | yld->idev.close = input_close; | ||
954 | 960 | ||
955 | /* register available key events */ | 961 | /* register available key events */ |
956 | yld->idev.evbit[0] = BIT(EV_KEY); | 962 | input_dev->evbit[0] = BIT(EV_KEY); |
957 | for (i = 0; i < 256; i++) { | 963 | for (i = 0; i < 256; i++) { |
958 | int k = map_p1k_to_key(i); | 964 | int k = map_p1k_to_key(i); |
959 | if (k >= 0) { | 965 | if (k >= 0) { |
960 | set_bit(k & 0xff, yld->idev.keybit); | 966 | set_bit(k & 0xff, input_dev->keybit); |
961 | if (k >> 8) | 967 | if (k >> 8) |
962 | set_bit(k >> 8, yld->idev.keybit); | 968 | set_bit(k >> 8, input_dev->keybit); |
963 | } | 969 | } |
964 | } | 970 | } |
965 | 971 | ||
966 | printk(KERN_INFO "input: %s on %s\n", yld->idev.name, path); | 972 | input_register_device(yld->idev); |
967 | |||
968 | input_register_device(&yld->idev); | ||
969 | 973 | ||
970 | usb_set_intfdata(intf, yld); | 974 | usb_set_intfdata(intf, yld); |
971 | 975 | ||
972 | /* clear visible elements */ | 976 | /* clear visible elements */ |
973 | for (i=0; i<ARRAY_SIZE(lcdMap); i++) | 977 | for (i = 0; i < ARRAY_SIZE(lcdMap); i++) |
974 | setChar(yld, i, ' '); | 978 | setChar(yld, i, ' '); |
975 | 979 | ||
976 | /* display driver version on LCD line 3 */ | 980 | /* display driver version on LCD line 3 */ |