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

V4L/DVB (4385): Add dvb_attach() macro and supporting routines



Add dvb_attach() macro and supporting routines

Signed-off-by: default avatarAndrew de Quincey <adq_dvb@lidskialf.net>
Acked-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Acked-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent c10d14d6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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) */
+1 −11
Original line number Diff line number Diff line
@@ -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);
+40 −0
Original line number Diff line number Diff line
@@ -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_ */