Input: bcm5974 - implement autosuspend support
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 8 Aug 2008 18:59:32 +0000 (14:59 -0400)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 8 Aug 2008 20:24:21 +0000 (16:24 -0400)
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/mouse/bcm5974.c

index 6f852786c5287fa6152b12182c4affb082533917..2ec921bf3c6016b6dc19e5999e3ccf6682e209bf 100644 (file)
@@ -150,6 +150,7 @@ struct bcm5974_config {
 struct bcm5974 {
        char phys[64];
        struct usb_device *udev;        /* usb device */
+       struct usb_interface *intf;     /* our interface */
        struct input_dev *input;        /* input dev */
        struct bcm5974_config cfg;      /* device configuration */
        struct mutex pm_mutex;          /* serialize access to open/suspend */
@@ -478,6 +479,10 @@ static int bcm5974_open(struct input_dev *input)
        struct bcm5974 *dev = input_get_drvdata(input);
        int error;
 
+       error = usb_autopm_get_interface(dev->intf);
+       if (error)
+               return error;
+
        mutex_lock(&dev->pm_mutex);
 
        error = bcm5974_start_traffic(dev);
@@ -486,6 +491,9 @@ static int bcm5974_open(struct input_dev *input)
 
        mutex_unlock(&dev->pm_mutex);
 
+       if (error)
+               usb_autopm_put_interface(dev->intf);
+
        return error;
 }
 
@@ -499,6 +507,8 @@ static void bcm5974_close(struct input_dev *input)
        dev->opened = 0;
 
        mutex_unlock(&dev->pm_mutex);
+
+       usb_autopm_put_interface(dev->intf);
 }
 
 static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message)
@@ -551,6 +561,7 @@ static int bcm5974_probe(struct usb_interface *iface,
        }
 
        dev->udev = udev;
+       dev->intf = iface;
        dev->input = input_dev;
        dev->cfg = *cfg;
        mutex_init(&dev->pm_mutex);
@@ -652,6 +663,7 @@ static struct usb_driver bcm5974_driver = {
        .resume                 = bcm5974_resume,
        .reset_resume           = bcm5974_resume,
        .id_table               = bcm5974_table,
+       .supports_autosuspend   = 1,
 };
 
 static int __init bcm5974_init(void)