aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/dvb-core/dvbdev.h
diff options
context:
space:
mode:
authorAndrew de Quincey <adq_dvb@lidskialf.net>2006-08-08 09:10:08 -0300
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-09-26 11:53:24 -0300
commitd995506062c974133ba66d0822e58a923d4d74d9 (patch)
tree160bfd17a7c96276f3543960c66b9d46b559d98d /drivers/media/dvb/dvb-core/dvbdev.h
parentV4L/DVB (4384): Remove remaining static function calls (diff)
downloadlinux-dev-d995506062c974133ba66d0822e58a923d4d74d9.tar.xz
linux-dev-d995506062c974133ba66d0822e58a923d4d74d9.zip
V4L/DVB (4385): Add dvb_attach() macro and supporting routines
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>
Diffstat (limited to 'drivers/media/dvb/dvb-core/dvbdev.h')
-rw-r--r--drivers/media/dvb/dvb-core/dvbdev.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h
index 7a7f75fd168c..66d91e530f85 100644
--- a/drivers/media/dvb/dvb-core/dvbdev.h
+++ b/drivers/media/dvb/dvb-core/dvbdev.h
@@ -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_ */