diff options
-rw-r--r-- | drivers/media/dvb/b2c2/flexcop-fe-tuner.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/bt8xx/dvb-bt8xx.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-core/dvb_frontend.c | 32 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-core/dvb_frontend.h | 2 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-core/dvbdev.h | 18 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dvb-usb-dvb.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-av.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-ci.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-patch.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget.c | 8 | ||||
-rw-r--r-- | drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c | 8 | ||||
-rw-r--r-- | drivers/media/video/video-buf-dvb.c | 8 |
13 files changed, 54 insertions, 78 deletions
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c index e2d2e65dea52..0c3bab37d8df 100644 --- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c +++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c @@ -571,9 +571,7 @@ int flexcop_frontend_init(struct flexcop_device *fc) } else { if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) { err("frontend registration failed!"); - dvb_detach(fc->fe->ops.release_sec, fc->fe); - dvb_detach(fc->fe->ops.tuner_ops.release, fc->fe); - dvb_detach(fc->fe->ops.release, fc->fe); + dvb_frontend_detach(fc->fe); fc->fe = NULL; return -EINVAL; } @@ -586,9 +584,7 @@ void flexcop_frontend_exit(struct flexcop_device *fc) { if (fc->init_state & FC_STATE_FE_INIT) { dvb_unregister_frontend(fc->fe); - dvb_detach(fc->fe->ops.release_sec, fc->fe); - dvb_detach(fc->fe->ops.tuner_ops.release, fc->fe); - dvb_detach(fc->fe->ops.release, fc->fe); + dvb_frontend_detach(fc->fe); } fc->init_state &= ~FC_STATE_FE_INIT; diff --git a/drivers/media/dvb/bt8xx/dvb-bt8xx.c b/drivers/media/dvb/bt8xx/dvb-bt8xx.c index 6f0bb7360991..db1eba9a5c36 100644 --- a/drivers/media/dvb/bt8xx/dvb-bt8xx.c +++ b/drivers/media/dvb/bt8xx/dvb-bt8xx.c @@ -706,9 +706,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) else if (dvb_register_frontend(&card->dvb_adapter, card->fe)) { printk("dvb-bt8xx: Frontend registration failed!\n"); - dvb_detach(card->fe->ops.release_sec, card->fe); - dvb_detach(card->fe->ops.tuner_ops.release, card->fe); - dvb_detach(card->fe->ops.release, card->fe); + dvb_frontend_detach(card->fe); card->fe = NULL; } } @@ -927,9 +925,7 @@ static void dvb_bt8xx_remove(struct bttv_sub_device *sub) dvb_dmx_release(&card->demux); if (card->fe) { dvb_unregister_frontend(card->fe); - dvb_detach(card->fe->ops.release_sec, card->fe); - dvb_detach(card->fe->ops.tuner_ops.release, card->fe); - dvb_detach(card->fe->ops.release, card->fe); + dvb_frontend_detach(card->fe); } dvb_unregister_adapter(&card->dvb_adapter); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index d544731bed7d..86dadc71cd61 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -1112,3 +1112,35 @@ int dvb_unregister_frontend(struct dvb_frontend* fe) return 0; } EXPORT_SYMBOL(dvb_unregister_frontend); + +#ifdef CONFIG_DVB_DETACH +void dvb_frontend_detach(struct dvb_frontend* fe) +{ + void *ptr; + + if (fe->ops.release_sec) { + fe->ops.release_sec(fe); + symbol_put_addr(fe->ops.release_sec); + } + if (fe->ops.tuner_ops.release) { + fe->ops.tuner_ops.release(fe); + symbol_put_addr(fe->ops.tuner_ops.release); + } + ptr = (void*)fe->ops.release; + if (ptr) { + fe->ops.release(fe); + symbol_put_addr(ptr); + } +} +#else +void dvb_frontend_detach(struct dvb_frontend* 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.release) + fe->ops.release(fe); +} +#endif +EXPORT_SYMBOL(dvb_frontend_detach); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h index 6bea01af4400..e5d5028b3694 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.h +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h @@ -158,6 +158,8 @@ extern int dvb_register_frontend(struct dvb_adapter* dvb, extern int dvb_unregister_frontend(struct dvb_frontend* fe); +extern void dvb_frontend_detach(struct dvb_frontend* fe); + extern void dvb_frontend_reinitialise(struct dvb_frontend *fe); extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec); diff --git a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h index 66d91e530f85..620e7887b3d3 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.h +++ b/drivers/media/dvb/dvb-core/dvbdev.h @@ -102,7 +102,6 @@ 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...) ({ \ @@ -118,28 +117,11 @@ extern int dvb_usercopy(struct inode *inode, struct file *file, __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_ */ diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c index f0da15ebe33b..9f8d3f0ca5a1 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-dvb.c @@ -188,9 +188,7 @@ int dvb_usb_fe_init(struct dvb_usb_device* d) if (dvb_register_frontend(&d->dvb_adap, d->fe)) { err("Frontend registration failed."); - dvb_detach(d->fe->ops.release_sec, d->fe); - dvb_detach(d->fe->ops.tuner_ops.release, d->fe); - dvb_detach(d->fe->ops.release, d->fe); + dvb_frontend_detach(d->fe); d->fe = NULL; return -ENODEV; } @@ -207,9 +205,7 @@ int dvb_usb_fe_exit(struct dvb_usb_device *d) { if (d->fe != NULL) { dvb_unregister_frontend(d->fe); - dvb_detach(d->fe->ops.release_sec, d->fe); - dvb_detach(d->fe->ops.tuner_ops.release, d->fe); - dvb_detach(d->fe->ops.release, d->fe); + dvb_frontend_detach(d->fe); } return 0; } diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index d195cf591081..5742154d8841 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c @@ -1385,9 +1385,7 @@ static void dvb_unregister(struct av7110 *av7110) if (av7110->fe != NULL) { dvb_unregister_frontend(av7110->fe); - dvb_detach(av7110->fe->ops.release_sec, av7110->fe); - dvb_detach(av7110->fe->ops.tuner_ops.release, av7110->fe); - dvb_detach(av7110->fe->ops.release, av7110->fe); + dvb_frontend_detach(av7110->fe); } dvb_unregister_device(av7110->osd_dev); av7110_av_unregister(av7110); @@ -2259,9 +2257,7 @@ static int frontend_init(struct av7110 *av7110) ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe); if (ret < 0) { printk("av7110: Frontend registration failed!\n"); - dvb_detach(av7110->fe->ops.release_sec, av7110->fe); - dvb_detach(av7110->fe->ops.tuner_ops.release, av7110->fe); - dvb_detach(av7110->fe->ops.release, av7110->fe); + dvb_frontend_detach(av7110->fe); av7110->fe = NULL; } } diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index c648c01c8ec5..6f1c41fb2cb4 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c @@ -1192,9 +1192,7 @@ static void frontend_init(struct budget_av *budget_av) if (dvb_register_frontend(&budget_av->budget.dvb_adapter, budget_av->budget.dvb_frontend)) { printk(KERN_ERR "budget-av: Frontend registration failed!\n"); - dvb_detach(budget_av->budget.dvb_frontend->ops.release_sec, budget_av->budget.dvb_frontend); - dvb_detach(budget_av->budget.dvb_frontend->ops.tuner_ops.release, budget_av->budget.dvb_frontend); - dvb_detach(budget_av->budget.dvb_frontend->ops.release, budget_av->budget.dvb_frontend); + dvb_frontend_detach(budget_av->budget.dvb_frontend); budget_av->budget.dvb_frontend = NULL; } } @@ -1230,9 +1228,7 @@ static int budget_av_detach(struct saa7146_dev *dev) if (budget_av->budget.dvb_frontend != NULL) { dvb_unregister_frontend(budget_av->budget.dvb_frontend); - dvb_detach(budget_av->budget.dvb_frontend->ops.release_sec, budget_av->budget.dvb_frontend); - dvb_detach(budget_av->budget.dvb_frontend->ops.tuner_ops.release, budget_av->budget.dvb_frontend); - dvb_detach(budget_av->budget.dvb_frontend->ops.release, budget_av->budget.dvb_frontend); + dvb_frontend_detach(budget_av->budget.dvb_frontend); } err = ttpci_budget_deinit(&budget_av->budget); diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index 20b5e8dc8739..e440fa100b94 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c @@ -1065,9 +1065,7 @@ static void frontend_init(struct budget_ci *budget_ci) if (dvb_register_frontend (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) { printk("budget-ci: Frontend registration failed!\n"); - dvb_detach(budget_ci->budget.dvb_frontend->ops.release_sec, budget_ci->budget.dvb_frontend); - dvb_detach(budget_ci->budget.dvb_frontend->ops.tuner_ops.release, budget_ci->budget.dvb_frontend); - dvb_detach(budget_ci->budget.dvb_frontend->ops.release, budget_ci->budget.dvb_frontend); + dvb_frontend_detach(budget_ci->budget.dvb_frontend); budget_ci->budget.dvb_frontend = NULL; } } @@ -1117,9 +1115,7 @@ static int budget_ci_detach(struct saa7146_dev *dev) ciintf_deinit(budget_ci); if (budget_ci->budget.dvb_frontend) { dvb_unregister_frontend(budget_ci->budget.dvb_frontend); - dvb_detach(budget_ci->budget.dvb_frontend->ops.release_sec, budget_ci->budget.dvb_frontend); - dvb_detach(budget_ci->budget.dvb_frontend->ops.tuner_ops.release, budget_ci->budget.dvb_frontend); - dvb_detach(budget_ci->budget.dvb_frontend->ops.release, budget_ci->budget.dvb_frontend); + dvb_frontend_detach(budget_ci->budget.dvb_frontend); } err = ttpci_budget_deinit(&budget_ci->budget); diff --git a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c index 82dbef863e51..d043e1f50d92 100644 --- a/drivers/media/dvb/ttpci/budget-patch.c +++ b/drivers/media/dvb/ttpci/budget-patch.c @@ -367,9 +367,7 @@ static void frontend_init(struct budget_patch* budget) } else { if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) { printk("budget-av: Frontend registration failed!\n"); - dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.tuner_ops.release, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release, budget->dvb_frontend); + dvb_frontend_detach(budget->dvb_frontend); budget->dvb_frontend = NULL; } } @@ -630,9 +628,7 @@ static int budget_patch_detach (struct saa7146_dev* dev) if (budget->dvb_frontend) { dvb_unregister_frontend(budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.tuner_ops.release, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release, budget->dvb_frontend); + dvb_frontend_detach(budget->dvb_frontend); } err = ttpci_budget_deinit (budget); diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 19beb11f9664..e846b9620170 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c @@ -442,9 +442,7 @@ static void frontend_init(struct budget *budget) error_out: printk("budget: Frontend registration failed!\n"); - dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.tuner_ops.release, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release, budget->dvb_frontend); + dvb_frontend_detach(budget->dvb_frontend); budget->dvb_frontend = NULL; return; } @@ -484,9 +482,7 @@ static int budget_detach (struct saa7146_dev* dev) if (budget->dvb_frontend) { dvb_unregister_frontend(budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.tuner_ops.release, budget->dvb_frontend); - dvb_detach(budget->dvb_frontend->ops.release, budget->dvb_frontend); + dvb_frontend_detach(budget->dvb_frontend); } err = ttpci_budget_deinit (budget); diff --git a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c index 6f58c66d6ef9..234199875f53 100644 --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c @@ -1625,9 +1625,7 @@ static void frontend_init(struct ttusb* ttusb) } else { if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) { printk("dvb-ttusb-budget: Frontend registration failed!\n"); - dvb_detach(ttusb->fe->ops.release_sec, ttusb->fe); - dvb_detach(ttusb->fe->ops.tuner_ops.release, ttusb->fe); - dvb_detach(ttusb->fe->ops.release, ttusb->fe); + dvb_frontend_detach(ttusb->fe); ttusb->fe = NULL; } } @@ -1766,9 +1764,7 @@ static void ttusb_disconnect(struct usb_interface *intf) dvb_dmx_release(&ttusb->dvb_demux); if (ttusb->fe != NULL) { dvb_unregister_frontend(ttusb->fe); - dvb_detach(ttusb->fe->ops.release_sec, ttusb->fe); - dvb_detach(ttusb->fe->ops.tuner_ops.release, ttusb->fe); - dvb_detach(ttusb->fe->ops.release, ttusb->fe); + dvb_frontend_detach(ttusb->fe); } i2c_del_adapter(&ttusb->i2c_adap); dvb_unregister_adapter(&ttusb->adapter); diff --git a/drivers/media/video/video-buf-dvb.c b/drivers/media/video/video-buf-dvb.c index 376d354b27f6..f53edf1923b7 100644 --- a/drivers/media/video/video-buf-dvb.c +++ b/drivers/media/video/video-buf-dvb.c @@ -223,9 +223,7 @@ fail_dmxdev: fail_dmx: dvb_unregister_frontend(dvb->frontend); fail_frontend: - dvb_detach(dvb->frontend->ops.release_sec, dvb->frontend); - dvb_detach(dvb->frontend->ops.tuner_ops.release, dvb->frontend); - dvb_detach(dvb->frontend->ops.release, dvb->frontend); + dvb_frontend_detach(dvb->frontend); dvb_unregister_adapter(&dvb->adapter); fail_adapter: return result; @@ -239,9 +237,7 @@ void videobuf_dvb_unregister(struct videobuf_dvb *dvb) dvb_dmxdev_release(&dvb->dmxdev); dvb_dmx_release(&dvb->demux); dvb_unregister_frontend(dvb->frontend); - dvb_detach(dvb->frontend->ops.release_sec, dvb->frontend); - dvb_detach(dvb->frontend->ops.tuner_ops.release, dvb->frontend); - dvb_detach(dvb->frontend->ops.release, dvb->frontend); + dvb_frontend_detach(dvb->frontend); dvb_unregister_adapter(&dvb->adapter); } |