[media] dvb-usb-v2: add frontend_detach callback
authorAntti Palosaari <crope@iki.fi>
Thu, 4 Sep 2014 20:04:44 +0000 (17:04 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sun, 21 Sep 2014 22:48:30 +0000 (19:48 -0300)
Add frontend_detach callback in order to allow custom detach. It is
needed when demod driver is implemented I2C client or some other
kernel bus, but not proprietary dvb_attach / dvb_detach.

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

index 124b4baa7e975d9ec63ac8c243d3e2741fd8d4c7..7e36ee02f9577c576597736fc000011a44ffe78e 100644 (file)
@@ -214,6 +214,7 @@ struct dvb_usb_adapter_properties {
  * @read_config: called to resolve device configuration
  * @read_mac_address: called to resolve adapter mac-address
  * @frontend_attach: called to attach the possible frontends
+ * @frontend_detach: called to detach the possible frontends
  * @tuner_attach: called to attach the possible tuners
  * @frontend_ctrl: called to power on/off active frontend
  * @streaming_ctrl: called to start/stop the usb streaming of adapter
@@ -254,6 +255,7 @@ struct dvb_usb_device_properties {
        int (*read_config) (struct dvb_usb_device *d);
        int (*read_mac_address) (struct dvb_usb_adapter *, u8 []);
        int (*frontend_attach) (struct dvb_usb_adapter *);
+       int (*frontend_detach)(struct dvb_usb_adapter *);
        int (*tuner_attach) (struct dvb_usb_adapter *);
        int (*frontend_ctrl) (struct dvb_frontend *, int);
        int (*streaming_ctrl) (struct dvb_frontend *, int);
index adca05f27fbaa84134829ff65ceb2bfdec4b02aa..02c43b52c90694db2942678716d5b7fd2ed17f77 100644 (file)
@@ -664,9 +664,10 @@ err:
 
 static int dvb_usbv2_adapter_frontend_exit(struct dvb_usb_adapter *adap)
 {
-       int i;
-       dev_dbg(&adap_to_d(adap)->udev->dev, "%s: adap=%d\n", __func__,
-                       adap->id);
+       int ret, i;
+       struct dvb_usb_device *d = adap_to_d(adap);
+
+       dev_dbg(&d->udev->dev, "%s: adap=%d\n", __func__, adap->id);
 
        for (i = MAX_NO_OF_FE_PER_ADAP - 1; i >= 0; i--) {
                if (adap->fe[i]) {
@@ -675,6 +676,15 @@ static int dvb_usbv2_adapter_frontend_exit(struct dvb_usb_adapter *adap)
                }
        }
 
+       if (d->props->frontend_detach) {
+               ret = d->props->frontend_detach(adap);
+               if (ret < 0) {
+                       dev_dbg(&d->udev->dev,
+                                       "%s: frontend_detach() failed=%d\n",
+                                       __func__, ret);
+               }
+       }
+
        return 0;
 }