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

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
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -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;
+2 −6
Original line number Diff line number Diff line
@@ -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);

+32 −0
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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);
+0 −18
Original line number Diff line number Diff line
@@ -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_ */
Loading