Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78e92006 authored by Janne Grunau's avatar Janne Grunau Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (7538): Adds selectable adapter numbers as per module option



The adapter_nr module options can be used to allocate static adapter
numbers on a driver level. It avoids problems with changing DVB apapter
numbers after warm/cold boot or device unplugging and repluging.

Each driver holds DVB_MAX_ADAPTER long array of the preferred order of
adapter numbers.

options dvb-usb-dib0700 adapter_nr=7,6,5,4,3,2,1,0 would result in a
reversed allocation of adapter numbers.

With adapter_nr=2,5 it tries first to get adapter number 2 and 5. If
both are already in use it will allocate the lowest free adapter number.

Signed-off-by: default avatarJanne Grunau <janne-dvb@grunau.be>
Acked-by: default avatarHermann Pitton <hermann.pitton@arcor.de>
Signed-off-by: default avatarMichael Krufky <mkrufky@linuxtv.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 9950c1b5
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -49,6 +49,8 @@ module_param_named(debug, b2c2_flexcop_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debug level (1=info,2=tuner,4=i2c,8=ts,16=sram,32=reg (|-able))." DEBSTATUS);
#undef DEBSTATUS

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

/* global zero for ibi values */
flexcop_ibi_value ibi_zero;

@@ -66,8 +68,10 @@ static int flexcop_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)

static int flexcop_dvb_init(struct flexcop_device *fc)
{
	int ret;
	if ((ret = dvb_register_adapter(&fc->dvb_adapter,"FlexCop Digital TV device",fc->owner,fc->dev)) < 0) {
	int ret = dvb_register_adapter(&fc->dvb_adapter,
				       "FlexCop Digital TV device", fc->owner,
				       fc->dev, adapter_nr);
	if (ret < 0) {
		err("error registering DVB adapter");
		return ret;
	}
+6 −1
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ static int debug;
module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

#define dprintk( args... ) \
	do { \
		if (debug) printk(KERN_DEBUG args); \
@@ -717,7 +719,10 @@ static int __devinit dvb_bt8xx_load_card(struct dvb_bt8xx_card *card, u32 type)
{
	int result;

	if ((result = dvb_register_adapter(&card->dvb_adapter, card->card_name, THIS_MODULE, &card->bt->dev->dev)) < 0) {
	result = dvb_register_adapter(&card->dvb_adapter, card->card_name,
				      THIS_MODULE, &card->bt->dev->dev,
				      adapter_nr);
	if (result < 0) {
		printk("dvb_bt8xx: dvb_register_adapter failed (errno = %d)\n", result);
		return result;
	}
+6 −1
Original line number Diff line number Diff line
@@ -58,6 +58,8 @@ static int debug;
module_param_named(debug, debug, int, 0644);
MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");

DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);

#define dprintk(level, args...)						\
do {									\
	if ((debug & level)) {						\
@@ -938,7 +940,10 @@ static int cinergyt2_probe (struct usb_interface *intf,
		return -ENOMEM;
	}

	if ((err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME, THIS_MODULE, &cinergyt2->udev->dev)) < 0) {
	err = dvb_register_adapter(&cinergyt2->adapter, DRIVER_NAME,
				   THIS_MODULE, &cinergyt2->udev->dev,
				   adapter_nr);
	if (err < 0) {
		kfree(cinergyt2);
		return err;
	}
+31 −10
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@ static const char * const dnames[] = {
	"net", "osd"
};

#define DVB_MAX_ADAPTERS	8
#define DVB_MAX_IDS		4
#define nums2minor(num,type,id)	((num << 6) | (id << 4) | type)
#define MAX_DVB_MINORS		(DVB_MAX_ADAPTERS*64)
@@ -262,18 +261,25 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
}
EXPORT_SYMBOL(dvb_unregister_device);

static int dvbdev_check_free_adapter_num(int num)
{
	struct list_head *entry;
	list_for_each(entry, &dvb_adapter_list) {
		struct dvb_adapter *adap;
		adap = list_entry(entry, struct dvb_adapter, list_head);
		if (adap->num == num)
			return 0;
	}
	return 1;
}

static int dvbdev_get_free_adapter_num (void)
{
	int num = 0;

	while (num < DVB_MAX_ADAPTERS) {
		struct dvb_adapter *adap;
		list_for_each_entry(adap, &dvb_adapter_list, list_head)
			if (adap->num == num)
				goto skip;
		if (dvbdev_check_free_adapter_num(num))
			return num;
skip:
		num++;
	}

@@ -281,13 +287,28 @@ static int dvbdev_get_free_adapter_num (void)
}


int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct module *module, struct device *device)
int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
			 struct module *module, struct device *device,
			 short *adapter_nums)
{
	int num;
	int i, num;

	mutex_lock(&dvbdev_register_lock);

	if ((num = dvbdev_get_free_adapter_num ()) < 0) {
	for (i = 0; i < DVB_MAX_ADAPTERS; ++i) {
		num = adapter_nums[i];
		if (num >= 0  &&  num < DVB_MAX_ADAPTERS) {
		/* use the one the driver asked for */
			if (dvbdev_check_free_adapter_num(num))
				break;
		} else {
			num = dvbdev_get_free_adapter_num();
			break;
		}
		num = -1;
	}

	if (num < 0) {
		mutex_unlock(&dvbdev_register_lock);
		return -ENFILE;
	}
+12 −1
Original line number Diff line number Diff line
@@ -31,6 +31,10 @@

#define DVB_MAJOR 212

#define DVB_MAX_ADAPTERS 8

#define DVB_UNSET (-1)

#define DVB_DEVICE_VIDEO      0
#define DVB_DEVICE_AUDIO      1
#define DVB_DEVICE_SEC        2
@@ -41,6 +45,11 @@
#define DVB_DEVICE_NET        7
#define DVB_DEVICE_OSD        8

#define DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr) \
	static short adapter_nr[] = \
		{[0 ... (DVB_MAX_ADAPTERS - 1)] = DVB_UNSET }; \
	module_param_array(adapter_nr, short, NULL, 0444); \
	MODULE_PARM_DESC(adapter_nr, "DVB adapter numbers")

struct dvb_adapter {
	int num;
@@ -78,7 +87,9 @@ struct dvb_device {
};


extern int dvb_register_adapter (struct dvb_adapter *adap, const char *name, struct module *module, struct device *device);
extern int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
				struct module *module, struct device *device,
				short *adapter_nums);
extern int dvb_unregister_adapter (struct dvb_adapter *adap);

extern int dvb_register_device (struct dvb_adapter *adap,
Loading