diff options
Diffstat (limited to 'drivers/usb/input/powermate.c')
-rw-r--r-- | drivers/usb/input/powermate.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/usb/input/powermate.c b/drivers/usb/input/powermate.c index fea97e5437f8..4f93a760faee 100644 --- a/drivers/usb/input/powermate.c +++ b/drivers/usb/input/powermate.c | |||
@@ -252,7 +252,7 @@ static void powermate_pulse_led(struct powermate_device *pm, int static_brightne | |||
252 | static int powermate_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int _value) | 252 | static int powermate_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int _value) |
253 | { | 253 | { |
254 | unsigned int command = (unsigned int)_value; | 254 | unsigned int command = (unsigned int)_value; |
255 | struct powermate_device *pm = dev->private; | 255 | struct powermate_device *pm = input_get_drvdata(dev); |
256 | 256 | ||
257 | if (type == EV_MSC && code == MSC_PULSELED){ | 257 | if (type == EV_MSC && code == MSC_PULSELED){ |
258 | /* | 258 | /* |
@@ -308,7 +308,7 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
308 | struct powermate_device *pm; | 308 | struct powermate_device *pm; |
309 | struct input_dev *input_dev; | 309 | struct input_dev *input_dev; |
310 | int pipe, maxp; | 310 | int pipe, maxp; |
311 | int err = -ENOMEM; | 311 | int error = -ENOMEM; |
312 | 312 | ||
313 | interface = intf->cur_altsetting; | 313 | interface = intf->cur_altsetting; |
314 | endpoint = &interface->endpoint[0].desc; | 314 | endpoint = &interface->endpoint[0].desc; |
@@ -359,8 +359,9 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
359 | 359 | ||
360 | input_dev->phys = pm->phys; | 360 | input_dev->phys = pm->phys; |
361 | usb_to_input_id(udev, &input_dev->id); | 361 | usb_to_input_id(udev, &input_dev->id); |
362 | input_dev->cdev.dev = &intf->dev; | 362 | input_dev->dev.parent = &intf->dev; |
363 | input_dev->private = pm; | 363 | |
364 | input_set_drvdata(input_dev, pm); | ||
364 | 365 | ||
365 | input_dev->event = powermate_input_event; | 366 | input_dev->event = powermate_input_event; |
366 | 367 | ||
@@ -387,11 +388,14 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
387 | 388 | ||
388 | /* register our interrupt URB with the USB system */ | 389 | /* register our interrupt URB with the USB system */ |
389 | if (usb_submit_urb(pm->irq, GFP_KERNEL)) { | 390 | if (usb_submit_urb(pm->irq, GFP_KERNEL)) { |
390 | err = -EIO; | 391 | error = -EIO; |
391 | goto fail4; | 392 | goto fail4; |
392 | } | 393 | } |
393 | 394 | ||
394 | input_register_device(pm->input); | 395 | error = input_register_device(pm->input); |
396 | if (error) | ||
397 | goto fail5; | ||
398 | |||
395 | 399 | ||
396 | /* force an update of everything */ | 400 | /* force an update of everything */ |
397 | pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS; | 401 | pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS; |
@@ -400,12 +404,13 @@ static int powermate_probe(struct usb_interface *intf, const struct usb_device_i | |||
400 | usb_set_intfdata(intf, pm); | 404 | usb_set_intfdata(intf, pm); |
401 | return 0; | 405 | return 0; |
402 | 406 | ||
403 | fail4: usb_free_urb(pm->config); | 407 | fail5: usb_kill_urb(pm->irq); |
404 | fail3: usb_free_urb(pm->irq); | 408 | fail4: usb_free_urb(pm->config); |
405 | fail2: powermate_free_buffers(udev, pm); | 409 | fail3: usb_free_urb(pm->irq); |
406 | fail1: input_free_device(input_dev); | 410 | fail2: powermate_free_buffers(udev, pm); |
411 | fail1: input_free_device(input_dev); | ||
407 | kfree(pm); | 412 | kfree(pm); |
408 | return err; | 413 | return error; |
409 | } | 414 | } |
410 | 415 | ||
411 | /* 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 */ |