diff options
author | Sean Young <sean@mess.org> | 2012-08-28 20:18:32 +0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-09-15 20:28:03 +0400 |
commit | 3404cb5c4dbbbac884722f418d5561d81dba969f (patch) | |
tree | 4949e3abc5be14832d2b070dc79c73f80cbbad54 /drivers/media/rc/ttusbir.c | |
parent | d9751fd02a70bbfd9868f8584c6e9fd10a713d65 (diff) | |
download | linux-3404cb5c4dbbbac884722f418d5561d81dba969f.tar.xz |
[media] ttusbir: ad support suspend and resume
While here, fix the led name: the led is green, not yellow.
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/rc/ttusbir.c')
-rw-r--r-- | drivers/media/rc/ttusbir.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/drivers/media/rc/ttusbir.c b/drivers/media/rc/ttusbir.c index 1aee57fd2f32..fef05235234a 100644 --- a/drivers/media/rc/ttusbir.c +++ b/drivers/media/rc/ttusbir.c @@ -66,11 +66,11 @@ static void ttusbir_set_led(struct ttusbir *tt) smp_mb(); - if (tt->led_on != tt->is_led_on && + if (tt->led_on != tt->is_led_on && tt->udev && atomic_add_unless(&tt->led_complete, 1, 1)) { tt->bulk_buffer[4] = tt->is_led_on = tt->led_on; ret = usb_submit_urb(tt->bulk_urb, GFP_ATOMIC); - if (ret && ret != -ENODEV) { + if (ret) { dev_warn(tt->dev, "failed to submit bulk urb: %d\n", ret); atomic_dec(&tt->led_complete); @@ -300,7 +300,7 @@ static int __devinit ttusbir_probe(struct usb_interface *intf, tt->bulk_out_endp), tt->bulk_buffer, sizeof(tt->bulk_buffer), ttusbir_bulk_complete, tt); - tt->led.name = "ttusbir:yellow:power"; + tt->led.name = "ttusbir:green:power"; tt->led.brightness_set = ttusbir_brightness_set; tt->led.brightness_get = ttusbir_brightness_get; tt->is_led_on = tt->led_on = true; @@ -370,13 +370,16 @@ out: static void __devexit ttusbir_disconnect(struct usb_interface *intf) { struct ttusbir *tt = usb_get_intfdata(intf); + struct usb_device *udev = tt->udev; int i; + tt->udev = NULL; + rc_unregister_device(tt->rc); led_classdev_unregister(&tt->led); for (i = 0; i < NUM_URBS; i++) { usb_kill_urb(tt->urb[i]); - usb_free_coherent(tt->udev, 128, tt->urb[i]->transfer_buffer, + usb_free_coherent(udev, 128, tt->urb[i]->transfer_buffer, tt->urb[i]->transfer_dma); usb_free_urb(tt->urb[i]); } @@ -386,6 +389,40 @@ static void __devexit ttusbir_disconnect(struct usb_interface *intf) kfree(tt); } +static int ttusbir_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct ttusbir *tt = usb_get_intfdata(intf); + int i; + + for (i = 0; i < NUM_URBS; i++) + usb_kill_urb(tt->urb[i]); + + led_classdev_suspend(&tt->led); + usb_kill_urb(tt->bulk_urb); + + return 0; +} + +static int ttusbir_resume(struct usb_interface *intf) +{ + struct ttusbir *tt = usb_get_intfdata(intf); + int i, rc; + + led_classdev_resume(&tt->led); + tt->is_led_on = true; + ttusbir_set_led(tt); + + for (i = 0; i < NUM_URBS; i++) { + rc = usb_submit_urb(tt->urb[i], GFP_KERNEL); + if (rc) { + dev_warn(tt->dev, "failed to submit urb: %d\n", rc); + break; + } + } + + return rc; +} + static const struct usb_device_id ttusbir_table[] = { { USB_DEVICE(0x0b48, 0x2003) }, { } @@ -395,6 +432,9 @@ static struct usb_driver ttusbir_driver = { .name = DRIVER_NAME, .id_table = ttusbir_table, .probe = ttusbir_probe, + .suspend = ttusbir_suspend, + .resume = ttusbir_resume, + .reset_resume = ttusbir_resume, .disconnect = __devexit_p(ttusbir_disconnect) }; |