V4L/DVB (4385): Add dvb_attach() macro and supporting routines
authorAndrew de Quincey <adq_dvb@lidskialf.net>
Tue, 8 Aug 2006 12:10:08 +0000 (09:10 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Tue, 26 Sep 2006 14:53:24 +0000 (11:53 -0300)
Add dvb_attach() macro and supporting routines

Signed-off-by: Andrew de Quincey <adq_dvb@lidskialf.net>
Acked-by: Michael Krufky <mkrufky@linuxtv.org>
Acked-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/b2c2/flexcop-fe-tuner.c
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvbdev.h

index 3be87c72e37b7f6bf13053f3db75a0fd9a4229af..816e700ae14b8af80edb29f8831defa7106c7337 100644 (file)
@@ -527,7 +527,7 @@ int flexcop_frontend_init(struct flexcop_device *fc)
        /* try the air atsc 2nd generation (nxt2002) */
        if ((fc->fe = nxt200x_attach(&samsung_tbmv_config, &fc->i2c_adap)) != NULL) {
                fc->dev_type          = FC_AIR_ATSC2;
-               dvb_pll_attach(fc->fe, 0x61, &fc->i2c_adap, &dvb_pll_samsung_tbmv);
+               dvb_attach(dvb_pll_attach, fc->fe, 0x61, &fc->i2c_adap, &dvb_pll_samsung_tbmv);
                info("found the nxt2002 at i2c address: 0x%02x",samsung_tbmv_config.demod_address);
        } else
        /* try the air atsc 3nd generation (lgdt3303) */
index 832116d09256b2600858a28ec5cf1e9e768ce969..d544731bed7d7191335433855b0d92518a074b76 100644 (file)
@@ -1105,17 +1105,7 @@ int dvb_unregister_frontend(struct dvb_frontend* fe)
        mutex_lock(&frontend_mutex);
        dvb_unregister_device (fepriv->dvbdev);
        dvb_frontend_stop (fe);
-       if (fe->ops.release_sec)
-               fe->ops.release_sec(fe);
-       if (fe->ops.tuner_ops.release) {
-               fe->ops.tuner_ops.release(fe);
-               if (fe->ops.i2c_gate_ctrl)
-                       fe->ops.i2c_gate_ctrl(fe, 0);
-       }
-       if (fe->ops.release)
-               fe->ops.release(fe);
-       else
-               printk("dvb_frontend: Demodulator (%s) does not have a release callback!\n", fe->ops.info.name);
+
        /* fe is invalid now */
        kfree(fepriv);
        mutex_unlock(&frontend_mutex);
index 7a7f75fd168c30f19bf622a349322994914ca336..66d91e530f85f49f13b358f945e8eb565e140d13 100644 (file)
@@ -102,4 +102,44 @@ extern int dvb_usercopy(struct inode *inode, struct file *file,
                            int (*func)(struct inode *inode, struct file *file,
                            unsigned int cmd, void *arg));
 
+
+/** generic DVB attach function. */
+#ifdef CONFIG_DVB_CORE_ATTACH
+#define dvb_attach(FUNCTION, ARGS...) ({ \
+       void *__r = NULL; \
+       typeof(&FUNCTION) __a = symbol_request(FUNCTION); \
+       if (__a) { \
+               __r = (void *) __a(ARGS); \
+               if (__r == NULL) \
+                       symbol_put(FUNCTION); \
+       } else { \
+               printk(KERN_ERR "DVB: Unable to find symbol "#FUNCTION"()\n"); \
+       } \
+       __r; \
+})
+
+#define dvb_detach(FUNCPTR, ARGS...) ({ \
+       typeof((FUNCPTR)) __funcptrtmp = FUNCPTR; \
+       if (__funcptrtmp) { \
+               __funcptrtmp(ARGS); \
+               symbol_put_addr(__funcptrtmp); \
+       } \
+       FUNCPTR = NULL; \
+})
+
+#else
+#define dvb_attach(FUNCTION, ARGS...) ({ \
+       FUNCTION(ARGS); \
+})
+
+#define dvb_detach(FUNCPTR, ARGS...) \
+do { \
+       if (FUNCPTR) \
+               FUNCPTR(ARGS); \
+       FUNCPTR = NULL; \
+} while(0)
+
+#endif
+
+
 #endif /* #ifndef _DVBDEV_H_ */