diff options
Diffstat (limited to 'drivers/usb/input/mtouchusb.c')
| -rw-r--r-- | drivers/usb/input/mtouchusb.c | 111 |
1 files changed, 55 insertions, 56 deletions
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); |
