[media] ttusbir: ad support suspend and resume
authorSean Young <sean@mess.org>
Tue, 28 Aug 2012 16:18:32 +0000 (13:18 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 15 Sep 2012 16:28:03 +0000 (13:28 -0300)
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>
drivers/media/rc/ttusbir.c

index 1aee57fd2f328aff4dd7df675ca4f48daaa2c98d..fef05235234a7b232197429e771522fa5adad882 100644 (file)
@@ -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)
 };