[media] dvb_usb_v2: fix pid_filter callback error logging
[firefly-linux-kernel-4.4.55.git] / drivers / media / usb / dvb-usb-v2 / dvb_usb_core.c
index a0e70e91834a6bda5dcd028d1144be7a24e02a72..ba51f65204de833cb9965f5f0764f85c8ce9166e 100644 (file)
@@ -265,7 +265,6 @@ static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed,
        /* stop feeding if it is last pid */
        if (adap->feed_count == 0) {
                dev_dbg(&d->udev->dev, "%s: stop feeding\n", __func__);
-               usb_urb_killv2(&adap->stream);
 
                if (d->props->streaming_ctrl) {
                        ret = d->props->streaming_ctrl(
@@ -274,22 +273,23 @@ static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed,
                                dev_err(&d->udev->dev, "%s: streaming_ctrl() " \
                                                "failed=%d\n", KBUILD_MODNAME,
                                                ret);
+                               usb_urb_killv2(&adap->stream);
                                goto err_mutex_unlock;
                        }
                }
+               usb_urb_killv2(&adap->stream);
                mutex_unlock(&adap->sync_mutex);
        }
 
        /* activate the pid on the device pid filter */
        if (adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER &&
-                       adap->pid_filtering &&
-                       adap->props->pid_filter)
+                       adap->pid_filtering && adap->props->pid_filter) {
                ret = adap->props->pid_filter(adap, dvbdmxfeed->index,
                                dvbdmxfeed->pid, (count == 1) ? 1 : 0);
-                       if (ret < 0)
-                               dev_err(&d->udev->dev, "%s: pid_filter() " \
-                                               "failed=%d\n", KBUILD_MODNAME,
-                                               ret);
+               if (ret < 0)
+                       dev_err(&d->udev->dev, "%s: pid_filter() failed=%d\n",
+                                       KBUILD_MODNAME, ret);
+       }
 
        /* start feeding if it is first pid */
        if (adap->feed_count == 1 && count == 1) {
@@ -611,8 +611,10 @@ err_dvb_unregister_frontend:
 
 err_dvb_frontend_detach:
        for (i = MAX_NO_OF_FE_PER_ADAP - 1; i >= 0; i--) {
-               if (adap->fe[i])
+               if (adap->fe[i]) {
                        dvb_frontend_detach(adap->fe[i]);
+                       adap->fe[i] = NULL;
+               }
        }
 
 err:
@@ -952,7 +954,7 @@ EXPORT_SYMBOL(dvb_usbv2_disconnect);
 int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg)
 {
        struct dvb_usb_device *d = usb_get_intfdata(intf);
-       int i, active_fe;
+       int ret = 0, i, active_fe;
        struct dvb_frontend *fe;
        dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
@@ -972,18 +974,17 @@ int dvb_usbv2_suspend(struct usb_interface *intf, pm_message_t msg)
                        /* stop usb streaming */
                        usb_urb_killv2(&d->adapter[i].stream);
 
-                       dvb_frontend_suspend(fe);
+                       ret = dvb_frontend_suspend(fe);
                }
        }
 
-       return 0;
+       return ret;
 }
 EXPORT_SYMBOL(dvb_usbv2_suspend);
 
-int dvb_usbv2_resume(struct usb_interface *intf)
+static int dvb_usbv2_resume_common(struct dvb_usb_device *d)
 {
-       struct dvb_usb_device *d = usb_get_intfdata(intf);
-       int i, active_fe;
+       int ret = 0, i, active_fe;
        struct dvb_frontend *fe;
        dev_dbg(&d->udev->dev, "%s:\n", __func__);
 
@@ -992,7 +993,7 @@ int dvb_usbv2_resume(struct usb_interface *intf)
                if (d->adapter[i].dvb_adap.priv && active_fe != -1) {
                        fe = d->adapter[i].fe[active_fe];
 
-                       dvb_frontend_resume(fe);
+                       ret = dvb_frontend_resume(fe);
 
                        /* resume usb streaming */
                        usb_urb_submitv2(&d->adapter[i].stream, NULL);
@@ -1009,10 +1010,37 @@ int dvb_usbv2_resume(struct usb_interface *intf)
                schedule_delayed_work(&d->rc_query_work,
                                msecs_to_jiffies(d->rc.interval));
 
-       return 0;
+       return ret;
+}
+
+int dvb_usbv2_resume(struct usb_interface *intf)
+{
+       struct dvb_usb_device *d = usb_get_intfdata(intf);
+       dev_dbg(&d->udev->dev, "%s:\n", __func__);
+
+       return dvb_usbv2_resume_common(d);
 }
 EXPORT_SYMBOL(dvb_usbv2_resume);
 
+int dvb_usbv2_reset_resume(struct usb_interface *intf)
+{
+       struct dvb_usb_device *d = usb_get_intfdata(intf);
+       int ret;
+       dev_dbg(&d->udev->dev, "%s:\n", __func__);
+
+       dvb_usbv2_device_power_ctrl(d, 1);
+
+       if (d->props->init)
+               d->props->init(d);
+
+       ret = dvb_usbv2_resume_common(d);
+
+       dvb_usbv2_device_power_ctrl(d, 0);
+
+       return ret;
+}
+EXPORT_SYMBOL(dvb_usbv2_reset_resume);
+
 MODULE_VERSION("2.0");
 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@desy.de>");
 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");