24 #include <linux/types.h>
25 #include <linux/errno.h>
26 #include <linux/string.h>
27 #include <linux/module.h>
28 #include <linux/kernel.h>
30 #include <linux/slab.h>
31 #include <linux/device.h>
38 static int dvbdev_debug;
41 MODULE_PARM_DESC(dvbdev_debug,
"Turn on/off device debugging (default:off).");
43 #define dprintk if (dvbdev_debug) printk
48 static const char *
const dnames[] = {
49 "video",
"audio",
"sec",
"frontend",
"demux",
"dvr",
"ca",
53 #ifdef CONFIG_DVB_DYNAMIC_MINORS
54 #define MAX_DVB_MINORS 256
55 #define DVB_MAX_IDS MAX_DVB_MINORS
58 #define nums2minor(num,type,id) ((num << 6) | (id << 4) | type)
59 #define MAX_DVB_MINORS (DVB_MAX_ADAPTERS*64)
62 static struct class *dvb_class;
73 dvbdev = dvb_minors[iminor(inode)];
75 if (dvbdev && dvbdev->
fops) {
80 old_fops = file->
f_op;
83 file->
f_op = old_fops;
87 err = file->
f_op->open(inode,file);
107 .open = dvb_device_open,
111 static struct cdev dvb_device_cdev;
159 unsigned int cmd,
unsigned long arg)
181 if (dev->type == type && dev->
id ==
id)
202 if ((
id = dvbdev_get_free_id (adap, type)) < 0){
229 dvbdev->
fops = dvbdevfops;
233 dvbdevfops->
owner = adap->module;
238 #ifdef CONFIG_DVB_DYNAMIC_MINORS
240 if (dvb_minors[minor] ==
NULL)
243 if (minor == MAX_DVB_MINORS) {
254 dvbdev->
minor = minor;
255 dvb_minors[minor] = dvbdev;
262 dvbdev,
"dvb%d.%s%d", adap->num, dnames[type],
id);
263 if (IS_ERR(clsdev)) {
265 __func__, adap->num, dnames[type],
id, PTR_ERR(clsdev));
266 return PTR_ERR(clsdev);
270 adap->num, dnames[type],
id, minor, minor);
294 static int dvbdev_check_free_adapter_num(
int num)
300 if (adap->
num == num)
306 static int dvbdev_get_free_adapter_num (
void)
311 if (dvbdev_check_free_adapter_num(num))
329 num = adapter_nums[
i];
330 if (num >= 0 && num < DVB_MAX_ADAPTERS) {
332 if (dvbdev_check_free_adapter_num(num))
335 num = dvbdev_get_free_adapter_num();
383 unsigned int cmd,
unsigned long arg,
384 int (*
func)(
struct file *file,
385 unsigned int cmd,
void *arg))
463 static int __init init_dvbdev(
void)
473 cdev_init(&dvb_device_cdev, &dvb_device_fops);
480 if (IS_ERR(dvb_class)) {
481 retval = PTR_ERR(dvb_class);
485 dvb_class->
devnode = dvb_devnode;
495 static void __exit exit_dvbdev(
void)
506 MODULE_AUTHOR(
"Marcus Metzler, Ralph Metzler, Holger Waechtler");