Commit f52a838b authored by Andrew de Quincey's avatar Andrew de Quincey Committed by Mauro Carvalho Chehab

V4L/DVB (4391): Refactor dvb_detach calls into a single dvb_frontend_detach function.

Remove buggy dvb_detach() macro and replace with unified
dvb_frontend_detach() call.
Signed-off-by: default avatarAndrew de Quincey <adq_dvb@lidskialf.net>
Acked-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 2a514dea
...@@ -571,9 +571,7 @@ int flexcop_frontend_init(struct flexcop_device *fc) ...@@ -571,9 +571,7 @@ int flexcop_frontend_init(struct flexcop_device *fc)
} else { } else {
if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) { if (dvb_register_frontend(&fc->dvb_adapter, fc->fe)) {
err("frontend registration failed!"); err("frontend registration failed!");
dvb_detach(fc->fe->ops.release_sec, fc->fe); dvb_frontend_detach(fc->fe);
dvb_detach(fc->fe->ops.tuner_ops.release, fc->fe);
dvb_detach(fc->fe->ops.release, fc->fe);
fc->fe = NULL; fc->fe = NULL;
return -EINVAL; return -EINVAL;
} }
...@@ -586,9 +584,7 @@ void flexcop_frontend_exit(struct flexcop_device *fc) ...@@ -586,9 +584,7 @@ void flexcop_frontend_exit(struct flexcop_device *fc)
{ {
if (fc->init_state & FC_STATE_FE_INIT) { if (fc->init_state & FC_STATE_FE_INIT) {
dvb_unregister_frontend(fc->fe); dvb_unregister_frontend(fc->fe);
dvb_detach(fc->fe->ops.release_sec, fc->fe); dvb_frontend_detach(fc->fe);
dvb_detach(fc->fe->ops.tuner_ops.release, fc->fe);
dvb_detach(fc->fe->ops.release, fc->fe);
} }
fc->init_state &= ~FC_STATE_FE_INIT; fc->init_state &= ~FC_STATE_FE_INIT;
......
...@@ -706,9 +706,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -706,9 +706,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
else else
if (dvb_register_frontend(&card->dvb_adapter, card->fe)) { if (dvb_register_frontend(&card->dvb_adapter, card->fe)) {
printk("dvb-bt8xx: Frontend registration failed!\n"); printk("dvb-bt8xx: Frontend registration failed!\n");
dvb_detach(card->fe->ops.release_sec, card->fe); dvb_frontend_detach(card->fe);
dvb_detach(card->fe->ops.tuner_ops.release, card->fe);
dvb_detach(card->fe->ops.release, card->fe);
card->fe = NULL; card->fe = NULL;
} }
} }
...@@ -927,9 +925,7 @@ static void dvb_bt8xx_remove(struct bttv_sub_device *sub) ...@@ -927,9 +925,7 @@ static void dvb_bt8xx_remove(struct bttv_sub_device *sub)
dvb_dmx_release(&card->demux); dvb_dmx_release(&card->demux);
if (card->fe) { if (card->fe) {
dvb_unregister_frontend(card->fe); dvb_unregister_frontend(card->fe);
dvb_detach(card->fe->ops.release_sec, card->fe); dvb_frontend_detach(card->fe);
dvb_detach(card->fe->ops.tuner_ops.release, card->fe);
dvb_detach(card->fe->ops.release, card->fe);
} }
dvb_unregister_adapter(&card->dvb_adapter); dvb_unregister_adapter(&card->dvb_adapter);
......
...@@ -1112,3 +1112,35 @@ int dvb_unregister_frontend(struct dvb_frontend* fe) ...@@ -1112,3 +1112,35 @@ int dvb_unregister_frontend(struct dvb_frontend* fe)
return 0; return 0;
} }
EXPORT_SYMBOL(dvb_unregister_frontend); 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);
...@@ -158,6 +158,8 @@ extern int dvb_register_frontend(struct dvb_adapter* dvb, ...@@ -158,6 +158,8 @@ extern int dvb_register_frontend(struct dvb_adapter* dvb,
extern int dvb_unregister_frontend(struct dvb_frontend* fe); 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_reinitialise(struct dvb_frontend *fe);
extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec); extern void dvb_frontend_sleep_until(struct timeval *waketime, u32 add_usec);
......
...@@ -102,7 +102,6 @@ extern int dvb_usercopy(struct inode *inode, struct file *file, ...@@ -102,7 +102,6 @@ extern int dvb_usercopy(struct inode *inode, struct file *file,
int (*func)(struct inode *inode, struct file *file, int (*func)(struct inode *inode, struct file *file,
unsigned int cmd, void *arg)); unsigned int cmd, void *arg));
/** generic DVB attach function. */ /** generic DVB attach function. */
#ifdef CONFIG_DVB_CORE_ATTACH #ifdef CONFIG_DVB_CORE_ATTACH
#define dvb_attach(FUNCTION, ARGS...) ({ \ #define dvb_attach(FUNCTION, ARGS...) ({ \
...@@ -118,28 +117,11 @@ extern int dvb_usercopy(struct inode *inode, struct file *file, ...@@ -118,28 +117,11 @@ extern int dvb_usercopy(struct inode *inode, struct file *file,
__r; \ __r; \
}) })
#define dvb_detach(FUNCPTR, ARGS...) ({ \
typeof((FUNCPTR)) __funcptrtmp = FUNCPTR; \
if (__funcptrtmp) { \
__funcptrtmp(ARGS); \
symbol_put_addr(__funcptrtmp); \
} \
FUNCPTR = NULL; \
})
#else #else
#define dvb_attach(FUNCTION, ARGS...) ({ \ #define dvb_attach(FUNCTION, ARGS...) ({ \
FUNCTION(ARGS); \ FUNCTION(ARGS); \
}) })
#define dvb_detach(FUNCPTR, ARGS...) \
do { \
if (FUNCPTR) \
FUNCPTR(ARGS); \
FUNCPTR = NULL; \
} while(0)
#endif #endif
#endif /* #ifndef _DVBDEV_H_ */ #endif /* #ifndef _DVBDEV_H_ */
...@@ -188,9 +188,7 @@ int dvb_usb_fe_init(struct dvb_usb_device* d) ...@@ -188,9 +188,7 @@ int dvb_usb_fe_init(struct dvb_usb_device* d)
if (dvb_register_frontend(&d->dvb_adap, d->fe)) { if (dvb_register_frontend(&d->dvb_adap, d->fe)) {
err("Frontend registration failed."); err("Frontend registration failed.");
dvb_detach(d->fe->ops.release_sec, d->fe); dvb_frontend_detach(d->fe);
dvb_detach(d->fe->ops.tuner_ops.release, d->fe);
dvb_detach(d->fe->ops.release, d->fe);
d->fe = NULL; d->fe = NULL;
return -ENODEV; return -ENODEV;
} }
...@@ -207,9 +205,7 @@ int dvb_usb_fe_exit(struct dvb_usb_device *d) ...@@ -207,9 +205,7 @@ int dvb_usb_fe_exit(struct dvb_usb_device *d)
{ {
if (d->fe != NULL) { if (d->fe != NULL) {
dvb_unregister_frontend(d->fe); dvb_unregister_frontend(d->fe);
dvb_detach(d->fe->ops.release_sec, d->fe); dvb_frontend_detach(d->fe);
dvb_detach(d->fe->ops.tuner_ops.release, d->fe);
dvb_detach(d->fe->ops.release, d->fe);
} }
return 0; return 0;
} }
...@@ -1385,9 +1385,7 @@ static void dvb_unregister(struct av7110 *av7110) ...@@ -1385,9 +1385,7 @@ static void dvb_unregister(struct av7110 *av7110)
if (av7110->fe != NULL) { if (av7110->fe != NULL) {
dvb_unregister_frontend(av7110->fe); dvb_unregister_frontend(av7110->fe);
dvb_detach(av7110->fe->ops.release_sec, av7110->fe); dvb_frontend_detach(av7110->fe);
dvb_detach(av7110->fe->ops.tuner_ops.release, av7110->fe);
dvb_detach(av7110->fe->ops.release, av7110->fe);
} }
dvb_unregister_device(av7110->osd_dev); dvb_unregister_device(av7110->osd_dev);
av7110_av_unregister(av7110); av7110_av_unregister(av7110);
...@@ -2259,9 +2257,7 @@ static int frontend_init(struct av7110 *av7110) ...@@ -2259,9 +2257,7 @@ static int frontend_init(struct av7110 *av7110)
ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe); ret = dvb_register_frontend(&av7110->dvb_adapter, av7110->fe);
if (ret < 0) { if (ret < 0) {
printk("av7110: Frontend registration failed!\n"); printk("av7110: Frontend registration failed!\n");
dvb_detach(av7110->fe->ops.release_sec, av7110->fe); dvb_frontend_detach(av7110->fe);
dvb_detach(av7110->fe->ops.tuner_ops.release, av7110->fe);
dvb_detach(av7110->fe->ops.release, av7110->fe);
av7110->fe = NULL; av7110->fe = NULL;
} }
} }
......
...@@ -1192,9 +1192,7 @@ static void frontend_init(struct budget_av *budget_av) ...@@ -1192,9 +1192,7 @@ static void frontend_init(struct budget_av *budget_av)
if (dvb_register_frontend(&budget_av->budget.dvb_adapter, if (dvb_register_frontend(&budget_av->budget.dvb_adapter,
budget_av->budget.dvb_frontend)) { budget_av->budget.dvb_frontend)) {
printk(KERN_ERR "budget-av: Frontend registration failed!\n"); 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_frontend_detach(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);
budget_av->budget.dvb_frontend = NULL; budget_av->budget.dvb_frontend = NULL;
} }
} }
...@@ -1230,9 +1228,7 @@ static int budget_av_detach(struct saa7146_dev *dev) ...@@ -1230,9 +1228,7 @@ static int budget_av_detach(struct saa7146_dev *dev)
if (budget_av->budget.dvb_frontend != NULL) { if (budget_av->budget.dvb_frontend != NULL) {
dvb_unregister_frontend(budget_av->budget.dvb_frontend); dvb_unregister_frontend(budget_av->budget.dvb_frontend);
dvb_detach(budget_av->budget.dvb_frontend->ops.release_sec, budget_av->budget.dvb_frontend); dvb_frontend_detach(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);
} }
err = ttpci_budget_deinit(&budget_av->budget); err = ttpci_budget_deinit(&budget_av->budget);
......
...@@ -1065,9 +1065,7 @@ static void frontend_init(struct budget_ci *budget_ci) ...@@ -1065,9 +1065,7 @@ static void frontend_init(struct budget_ci *budget_ci)
if (dvb_register_frontend if (dvb_register_frontend
(&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) { (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) {
printk("budget-ci: Frontend registration failed!\n"); printk("budget-ci: Frontend registration failed!\n");
dvb_detach(budget_ci->budget.dvb_frontend->ops.release_sec, budget_ci->budget.dvb_frontend); dvb_frontend_detach(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);
budget_ci->budget.dvb_frontend = NULL; budget_ci->budget.dvb_frontend = NULL;
} }
} }
...@@ -1117,9 +1115,7 @@ static int budget_ci_detach(struct saa7146_dev *dev) ...@@ -1117,9 +1115,7 @@ static int budget_ci_detach(struct saa7146_dev *dev)
ciintf_deinit(budget_ci); ciintf_deinit(budget_ci);
if (budget_ci->budget.dvb_frontend) { if (budget_ci->budget.dvb_frontend) {
dvb_unregister_frontend(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_frontend_detach(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);
} }
err = ttpci_budget_deinit(&budget_ci->budget); err = ttpci_budget_deinit(&budget_ci->budget);
......
...@@ -367,9 +367,7 @@ static void frontend_init(struct budget_patch* budget) ...@@ -367,9 +367,7 @@ static void frontend_init(struct budget_patch* budget)
} else { } else {
if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) { if (dvb_register_frontend(&budget->dvb_adapter, budget->dvb_frontend)) {
printk("budget-av: Frontend registration failed!\n"); printk("budget-av: Frontend registration failed!\n");
dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); dvb_frontend_detach(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);
budget->dvb_frontend = NULL; budget->dvb_frontend = NULL;
} }
} }
...@@ -630,9 +628,7 @@ static int budget_patch_detach (struct saa7146_dev* dev) ...@@ -630,9 +628,7 @@ static int budget_patch_detach (struct saa7146_dev* dev)
if (budget->dvb_frontend) { if (budget->dvb_frontend) {
dvb_unregister_frontend(budget->dvb_frontend); dvb_unregister_frontend(budget->dvb_frontend);
dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); dvb_frontend_detach(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);
} }
err = ttpci_budget_deinit (budget); err = ttpci_budget_deinit (budget);
......
...@@ -442,9 +442,7 @@ static void frontend_init(struct budget *budget) ...@@ -442,9 +442,7 @@ static void frontend_init(struct budget *budget)
error_out: error_out:
printk("budget: Frontend registration failed!\n"); printk("budget: Frontend registration failed!\n");
dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); dvb_frontend_detach(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);
budget->dvb_frontend = NULL; budget->dvb_frontend = NULL;
return; return;
} }
...@@ -484,9 +482,7 @@ static int budget_detach (struct saa7146_dev* dev) ...@@ -484,9 +482,7 @@ static int budget_detach (struct saa7146_dev* dev)
if (budget->dvb_frontend) { if (budget->dvb_frontend) {
dvb_unregister_frontend(budget->dvb_frontend); dvb_unregister_frontend(budget->dvb_frontend);
dvb_detach(budget->dvb_frontend->ops.release_sec, budget->dvb_frontend); dvb_frontend_detach(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);
} }
err = ttpci_budget_deinit (budget); err = ttpci_budget_deinit (budget);
......
...@@ -1625,9 +1625,7 @@ static void frontend_init(struct ttusb* ttusb) ...@@ -1625,9 +1625,7 @@ static void frontend_init(struct ttusb* ttusb)
} else { } else {
if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) { if (dvb_register_frontend(&ttusb->adapter, ttusb->fe)) {
printk("dvb-ttusb-budget: Frontend registration failed!\n"); printk("dvb-ttusb-budget: Frontend registration failed!\n");
dvb_detach(ttusb->fe->ops.release_sec, ttusb->fe); dvb_frontend_detach(ttusb->fe);
dvb_detach(ttusb->fe->ops.tuner_ops.release, ttusb->fe);
dvb_detach(ttusb->fe->ops.release, ttusb->fe);
ttusb->fe = NULL; ttusb->fe = NULL;
} }
} }
...@@ -1766,9 +1764,7 @@ static void ttusb_disconnect(struct usb_interface *intf) ...@@ -1766,9 +1764,7 @@ static void ttusb_disconnect(struct usb_interface *intf)
dvb_dmx_release(&ttusb->dvb_demux); dvb_dmx_release(&ttusb->dvb_demux);
if (ttusb->fe != NULL) { if (ttusb->fe != NULL) {
dvb_unregister_frontend(ttusb->fe); dvb_unregister_frontend(ttusb->fe);
dvb_detach(ttusb->fe->ops.release_sec, ttusb->fe); dvb_frontend_detach(ttusb->fe);
dvb_detach(ttusb->fe->ops.tuner_ops.release, ttusb->fe);
dvb_detach(ttusb->fe->ops.release, ttusb->fe);
} }
i2c_del_adapter(&ttusb->i2c_adap); i2c_del_adapter(&ttusb->i2c_adap);
dvb_unregister_adapter(&ttusb->adapter); dvb_unregister_adapter(&ttusb->adapter);
......
...@@ -223,9 +223,7 @@ int videobuf_dvb_register(struct videobuf_dvb *dvb, ...@@ -223,9 +223,7 @@ int videobuf_dvb_register(struct videobuf_dvb *dvb,
fail_dmx: fail_dmx:
dvb_unregister_frontend(dvb->frontend); dvb_unregister_frontend(dvb->frontend);
fail_frontend: fail_frontend:
dvb_detach(dvb->frontend->ops.release_sec, dvb->frontend); dvb_frontend_detach(dvb->frontend);
dvb_detach(dvb->frontend->ops.tuner_ops.release, dvb->frontend);
dvb_detach(dvb->frontend->ops.release, dvb->frontend);
dvb_unregister_adapter(&dvb->adapter); dvb_unregister_adapter(&dvb->adapter);
fail_adapter: fail_adapter:
return result; return result;
...@@ -239,9 +237,7 @@ void videobuf_dvb_unregister(struct videobuf_dvb *dvb) ...@@ -239,9 +237,7 @@ void videobuf_dvb_unregister(struct videobuf_dvb *dvb)
dvb_dmxdev_release(&dvb->dmxdev); dvb_dmxdev_release(&dvb->dmxdev);
dvb_dmx_release(&dvb->demux); dvb_dmx_release(&dvb->demux);
dvb_unregister_frontend(dvb->frontend); dvb_unregister_frontend(dvb->frontend);
dvb_detach(dvb->frontend->ops.release_sec, dvb->frontend); dvb_frontend_detach(dvb->frontend);
dvb_detach(dvb->frontend->ops.tuner_ops.release, dvb->frontend);
dvb_detach(dvb->frontend->ops.release, dvb->frontend);
dvb_unregister_adapter(&dvb->adapter); dvb_unregister_adapter(&dvb->adapter);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment