summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorSean Young <sean@mess.org>2012-08-28 13:18:32 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-09-15 13:28:03 -0300
commit3404cb5c4dbbbac884722f418d5561d81dba969f (patch)
tree4949e3abc5be14832d2b070dc79c73f80cbbad54 /drivers/media
parentd9751fd02a70bbfd9868f8584c6e9fd10a713d65 (diff)
downloadlinux-3.10-3404cb5c4dbbbac884722f418d5561d81dba969f.tar.gz
linux-3.10-3404cb5c4dbbbac884722f418d5561d81dba969f.tar.bz2
linux-3.10-3404cb5c4dbbbac884722f418d5561d81dba969f.zip
[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')
-rw-r--r--drivers/media/rc/ttusbir.c48
1 files changed, 44 insertions, 4 deletions
diff --git a/drivers/media/rc/ttusbir.c b/drivers/media/rc/ttusbir.c
index 1aee57fd2f3..fef05235234 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)
};