[media] dvb_usb_v2: change rc polling active/deactive logic
authorAntti Palosaari <crope@iki.fi>
Mon, 10 Dec 2012 00:23:30 +0000 (21:23 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 6 Jan 2013 12:20:03 +0000 (10:20 -0200)
Use own flag to mark when rc polling is active/deactive and make
decisions, like start/stop polling on suspend/resume, against that.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/dvb-usb-v2/dvb_usb.h
drivers/media/usb/dvb-usb-v2/dvb_usb_core.c

index 059291b892b81c2e250da9e7b2ea64266db95f0c..3cac8bd0b11654d15d2d978f9909675be1181840 100644 (file)
@@ -347,6 +347,7 @@ struct dvb_usb_adapter {
  * @props: device properties
  * @name: device name
  * @rc_map: name of rc codes table
+ * @rc_polling_active: set when RC polling is active
  * @udev: pointer to the device's struct usb_device
  * @intf: pointer to the device's usb interface
  * @rc: remote controller configuration
@@ -364,7 +365,7 @@ struct dvb_usb_device {
        const struct dvb_usb_device_properties *props;
        const char *name;
        const char *rc_map;
-
+       bool rc_polling_active;
        struct usb_device *udev;
        struct usb_interface *intf;
        struct dvb_usb_rc rc;
index 1330c644dd8dfa5652df9833081e34d672242017..95968d39c1cae090f3ce12c05b24c6f9488426ab 100644 (file)
@@ -113,13 +113,16 @@ static void dvb_usb_read_remote_control(struct work_struct *work)
         * When the parameter has been set to 1 via sysfs while the
         * driver was running, or when bulk mode is enabled after IR init.
         */
-       if (dvb_usbv2_disable_rc_polling || d->rc.bulk_mode)
+       if (dvb_usbv2_disable_rc_polling || d->rc.bulk_mode) {
+               d->rc_polling_active = false;
                return;
+       }
 
        ret = d->rc.query(d);
        if (ret < 0) {
                dev_err(&d->udev->dev, "%s: rc.query() failed=%d\n",
                                KBUILD_MODNAME, ret);
+               d->rc_polling_active = false;
                return; /* stop polling */
        }
 
@@ -183,6 +186,7 @@ static int dvb_usbv2_remote_init(struct dvb_usb_device *d)
                                d->rc.interval);
                schedule_delayed_work(&d->rc_query_work,
                                msecs_to_jiffies(d->rc.interval));
+               d->rc_polling_active = true;
        }
 
        return 0;
@@ -964,7 +968,7 @@ int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg)
        dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
        /* stop remote controller poll */
-       if (d->rc.query && !d->rc.bulk_mode)
+       if (d->rc_polling_active)
                cancel_delayed_work_sync(&d->rc_query_work);
 
        for (i = MAX_NO_OF_ADAPTER_PER_DEVICE - 1; i >= 0; i--) {
@@ -1011,7 +1015,7 @@ static int dvb_usbv2_resume_common(struct dvb_usb_device *d)
        }
 
        /* start remote controller poll */
-       if (d->rc.query && !d->rc.bulk_mode)
+       if (d->rc_polling_active)
                schedule_delayed_work(&d->rc_query_work,
                                msecs_to_jiffies(d->rc.interval));