dvbdev.c 24.6 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * dvbdev.c
 *
 * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
 *                  & Marcus Metzler <marcus@convergence.de>
 *                    for convergence integrated media GmbH
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

20 21
#define pr_fmt(fmt) "dvbdev: " fmt

L
Linus Torvalds 已提交
22 23 24 25 26
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/module.h>
#include <linux/kernel.h>
27
#include <linux/i2c.h>
L
Linus Torvalds 已提交
28 29 30 31 32
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/cdev.h>
33
#include <linux/mutex.h>
34
#include <media/dvbdev.h>
L
Linus Torvalds 已提交
35

36 37 38
/* Due to enum tuner_pad_index */
#include <media/tuner.h>

A
Arnd Bergmann 已提交
39
static DEFINE_MUTEX(dvbdev_mutex);
L
Linus Torvalds 已提交
40 41 42 43 44
static int dvbdev_debug;

module_param(dvbdev_debug, int, 0644);
MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");

45 46 47 48 49
#define dprintk(fmt, arg...) do {					\
	if (dvbdev_debug)						\
		printk(KERN_DEBUG pr_fmt("%s: " fmt),			\
		       __func__, ##arg);				\
} while (0)
L
Linus Torvalds 已提交
50 51

static LIST_HEAD(dvb_adapter_list);
52
static DEFINE_MUTEX(dvbdev_register_lock);
L
Linus Torvalds 已提交
53 54

static const char * const dnames[] = {
55 56 57 58 59 60 61 62 63
	[DVB_DEVICE_VIDEO] =		"video",
	[DVB_DEVICE_AUDIO] =		"audio",
	[DVB_DEVICE_SEC] =		"sec",
	[DVB_DEVICE_FRONTEND] =		"frontend",
	[DVB_DEVICE_DEMUX] =		"demux",
	[DVB_DEVICE_DVR] =		"dvr",
	[DVB_DEVICE_CA] =		"ca",
	[DVB_DEVICE_NET] =		"net",
	[DVB_DEVICE_OSD] =		"osd"
L
Linus Torvalds 已提交
64 65
};

66 67 68 69
#ifdef CONFIG_DVB_DYNAMIC_MINORS
#define MAX_DVB_MINORS		256
#define DVB_MAX_IDS		MAX_DVB_MINORS
#else
L
Linus Torvalds 已提交
70
#define DVB_MAX_IDS		4
71

72 73 74 75 76 77 78 79 80 81 82 83 84 85
static const u8 minor_type[] = {
       [DVB_DEVICE_VIDEO]      = 0,
       [DVB_DEVICE_AUDIO]      = 1,
       [DVB_DEVICE_SEC]        = 2,
       [DVB_DEVICE_FRONTEND]   = 3,
       [DVB_DEVICE_DEMUX]      = 4,
       [DVB_DEVICE_DVR]        = 5,
       [DVB_DEVICE_CA]         = 6,
       [DVB_DEVICE_NET]        = 7,
       [DVB_DEVICE_OSD]        = 8,
};

#define nums2minor(num, type, id) \
       (((num) << 6) | ((id) << 4) | minor_type[type])
86

L
Linus Torvalds 已提交
87
#define MAX_DVB_MINORS		(DVB_MAX_ADAPTERS*64)
88
#endif
L
Linus Torvalds 已提交
89

90
static struct class *dvb_class;
L
Linus Torvalds 已提交
91

92 93
static struct dvb_device *dvb_minors[MAX_DVB_MINORS];
static DECLARE_RWSEM(minor_rwsem);
L
Linus Torvalds 已提交
94 95 96 97 98

static int dvb_device_open(struct inode *inode, struct file *file)
{
	struct dvb_device *dvbdev;

A
Arnd Bergmann 已提交
99
	mutex_lock(&dvbdev_mutex);
100 101
	down_read(&minor_rwsem);
	dvbdev = dvb_minors[iminor(inode)];
L
Linus Torvalds 已提交
102 103 104

	if (dvbdev && dvbdev->fops) {
		int err = 0;
105
		const struct file_operations *new_fops;
L
Linus Torvalds 已提交
106

107 108
		new_fops = fops_get(dvbdev->fops);
		if (!new_fops)
L
Laurent Pinchart 已提交
109
			goto fail;
110 111 112
		file->private_data = dvbdev;
		replace_fops(file, new_fops);
		if (file->f_op->open)
113
			err = file->f_op->open(inode, file);
114
		up_read(&minor_rwsem);
A
Arnd Bergmann 已提交
115
		mutex_unlock(&dvbdev_mutex);
116
		return err;
L
Linus Torvalds 已提交
117
	}
L
Laurent Pinchart 已提交
118
fail:
119
	up_read(&minor_rwsem);
A
Arnd Bergmann 已提交
120
	mutex_unlock(&dvbdev_mutex);
L
Linus Torvalds 已提交
121 122 123 124
	return -ENODEV;
}


125
static const struct file_operations dvb_device_fops =
L
Linus Torvalds 已提交
126 127 128
{
	.owner =	THIS_MODULE,
	.open =		dvb_device_open,
129
	.llseek =	noop_llseek,
L
Linus Torvalds 已提交
130 131
};

132
static struct cdev dvb_device_cdev;
L
Linus Torvalds 已提交
133 134 135

int dvb_generic_open(struct inode *inode, struct file *file)
{
136
	struct dvb_device *dvbdev = file->private_data;
L
Linus Torvalds 已提交
137

138 139
	if (!dvbdev)
		return -ENODEV;
L
Linus Torvalds 已提交
140 141

	if (!dvbdev->users)
142
		return -EBUSY;
L
Linus Torvalds 已提交
143 144

	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
145 146
		if (!dvbdev->readers)
			return -EBUSY;
L
Linus Torvalds 已提交
147 148
		dvbdev->readers--;
	} else {
149 150
		if (!dvbdev->writers)
			return -EBUSY;
L
Linus Torvalds 已提交
151 152 153 154 155 156 157 158 159 160 161
		dvbdev->writers--;
	}

	dvbdev->users--;
	return 0;
}
EXPORT_SYMBOL(dvb_generic_open);


int dvb_generic_release(struct inode *inode, struct file *file)
{
162
	struct dvb_device *dvbdev = file->private_data;
L
Linus Torvalds 已提交
163 164

	if (!dvbdev)
165
		return -ENODEV;
L
Linus Torvalds 已提交
166 167 168 169 170 171 172 173 174 175 176 177 178

	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
		dvbdev->readers++;
	} else {
		dvbdev->writers++;
	}

	dvbdev->users++;
	return 0;
}
EXPORT_SYMBOL(dvb_generic_release);


179 180
long dvb_generic_ioctl(struct file *file,
		       unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
181
{
182
	struct dvb_device *dvbdev = file->private_data;
L
Linus Torvalds 已提交
183

184 185
	if (!dvbdev)
		return -ENODEV;
L
Linus Torvalds 已提交
186 187 188 189

	if (!dvbdev->kernel_ioctl)
		return -EINVAL;

A
Arnd Bergmann 已提交
190
	return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
L
Linus Torvalds 已提交
191 192 193 194 195 196 197 198 199
}
EXPORT_SYMBOL(dvb_generic_ioctl);


static int dvbdev_get_free_id (struct dvb_adapter *adap, int type)
{
	u32 id = 0;

	while (id < DVB_MAX_IDS) {
200 201
		struct dvb_device *dev;
		list_for_each_entry(dev, &adap->device_list, list_head)
L
Linus Torvalds 已提交
202 203 204 205 206 207 208 209 210
			if (dev->type == type && dev->id == id)
				goto skip;
		return id;
skip:
		id++;
	}
	return -ENFILE;
}

211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
static void dvb_media_device_free(struct dvb_device *dvbdev)
{
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
	if (dvbdev->entity) {
		media_device_unregister_entity(dvbdev->entity);
		kfree(dvbdev->entity);
		kfree(dvbdev->pads);
		dvbdev->entity = NULL;
		dvbdev->pads = NULL;
	}

	if (dvbdev->tsout_entity) {
		int i;

		for (i = 0; i < dvbdev->tsout_num_entities; i++) {
			media_device_unregister_entity(&dvbdev->tsout_entity[i]);
			kfree(dvbdev->tsout_entity[i].name);
		}
		kfree(dvbdev->tsout_entity);
		kfree(dvbdev->tsout_pads);
		dvbdev->tsout_entity = NULL;
		dvbdev->tsout_pads = NULL;

		dvbdev->tsout_num_entities = 0;
	}

	if (dvbdev->intf_devnode) {
		media_devnode_remove(dvbdev->intf_devnode);
		dvbdev->intf_devnode = NULL;
	}
241 242 243

	if (dvbdev->adapter->conn) {
		media_device_unregister_entity(dvbdev->adapter->conn);
244
		kfree(dvbdev->adapter->conn);
245 246 247 248
		dvbdev->adapter->conn = NULL;
		kfree(dvbdev->adapter->conn_pads);
		dvbdev->adapter->conn_pads = NULL;
	}
249 250 251
#endif
}

252
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
253
static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
254 255 256 257 258 259 260
				    const char *name, int npads)
{
	int i, ret = 0;

	dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads),
				     GFP_KERNEL);
	if (!dvbdev->tsout_pads)
261 262
		return -ENOMEM;

263 264
	dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity),
				       GFP_KERNEL);
265 266 267 268 269
	if (!dvbdev->tsout_entity)
		return -ENOMEM;

	dvbdev->tsout_num_entities = npads;

270 271 272 273 274
	for (i = 0; i < npads; i++) {
		struct media_pad *pads = &dvbdev->tsout_pads[i];
		struct media_entity *entity = &dvbdev->tsout_entity[i];

		entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i);
275 276
		if (!entity->name)
			return -ENOMEM;
277

278
		entity->function = MEDIA_ENT_F_IO_DTV;
279 280
		pads->flags = MEDIA_PAD_FL_SINK;

281
		ret = media_entity_pads_init(entity, 1, pads);
282
		if (ret < 0)
283
			return ret;
284 285 286 287

		ret = media_device_register_entity(dvbdev->adapter->mdev,
						   entity);
		if (ret < 0)
288
			return ret;
289
	}
290
	return 0;
291 292 293 294 295
}

#define DEMUX_TSOUT	"demux-tsout"
#define DVR_TSOUT	"dvr-tsout"

296 297
static int dvb_create_media_entity(struct dvb_device *dvbdev,
				   int type, int demux_sink_pads)
298
{
299
	int i, ret, npads;
300

301 302 303 304
	switch (type) {
	case DVB_DEVICE_FRONTEND:
		npads = 2;
		break;
305
	case DVB_DEVICE_DVR:
306 307 308
		ret = dvb_create_tsout_entity(dvbdev, DVR_TSOUT,
					      demux_sink_pads);
		return ret;
309
	case DVB_DEVICE_DEMUX:
310
		npads = 1 + demux_sink_pads;
311 312 313 314
		ret = dvb_create_tsout_entity(dvbdev, DEMUX_TSOUT,
					      demux_sink_pads);
		if (ret < 0)
			return ret;
315 316 317 318 319 320 321 322 323 324 325 326 327 328
		break;
	case DVB_DEVICE_CA:
		npads = 2;
		break;
	case DVB_DEVICE_NET:
		/*
		 * We should be creating entities for the MPE/ULE
		 * decapsulation hardware (or software implementation).
		 *
		 * However, the number of for the MPE/ULE decaps may not be
		 * fixed. As we don't have yet dynamic support for PADs at
		 * the Media Controller, let's not create the decap
		 * entities yet.
		 */
329
		return 0;
330
	default:
331
		return 0;
332
	}
333 334 335

	dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
	if (!dvbdev->entity)
336
		return -ENOMEM;
337 338

	dvbdev->entity->name = dvbdev->name;
339 340 341 342

	if (npads) {
		dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
				       GFP_KERNEL);
343 344
		if (!dvbdev->pads) {
			kfree(dvbdev->entity);
345
			return -ENOMEM;
346
		}
347 348
	}

349 350
	switch (type) {
	case DVB_DEVICE_FRONTEND:
351
		dvbdev->entity->function = MEDIA_ENT_F_DTV_DEMOD;
352 353
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
354 355
		break;
	case DVB_DEVICE_DEMUX:
356
		dvbdev->entity->function = MEDIA_ENT_F_TS_DEMUX;
357
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
358 359
		for (i = 1; i < npads; i++)
			dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE;
360 361
		break;
	case DVB_DEVICE_CA:
362
		dvbdev->entity->function = MEDIA_ENT_F_DTV_CA;
363 364
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
365 366
		break;
	default:
367
		/* Should never happen, as the first switch prevents it */
368
		kfree(dvbdev->entity);
369
		kfree(dvbdev->pads);
370
		dvbdev->entity = NULL;
371 372
		dvbdev->pads = NULL;
		return 0;
373 374
	}

375
	if (npads) {
376
		ret = media_entity_pads_init(dvbdev->entity, npads, dvbdev->pads);
377 378
		if (ret)
			return ret;
379
	}
380 381 382
	ret = media_device_register_entity(dvbdev->adapter->mdev,
					   dvbdev->entity);
	if (ret)
383
		return ret;
384

385
	pr_info("%s: media entity '%s' registered.\n",
386
		__func__, dvbdev->entity->name);
387 388

	return 0;
389
}
390
#endif
L
Linus Torvalds 已提交
391

392 393 394
static int dvb_register_media_device(struct dvb_device *dvbdev,
				     int type, int minor,
				     unsigned demux_sink_pads)
395 396
{
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
397
	struct media_link *link;
398
	u32 intf_type;
399
	int ret;
400 401

	if (!dvbdev->adapter->mdev)
402
		return 0;
403

404 405 406
	ret = dvb_create_media_entity(dvbdev, type, demux_sink_pads);
	if (ret)
		return ret;
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

	switch (type) {
	case DVB_DEVICE_FRONTEND:
		intf_type = MEDIA_INTF_T_DVB_FE;
		break;
	case DVB_DEVICE_DEMUX:
		intf_type = MEDIA_INTF_T_DVB_DEMUX;
		break;
	case DVB_DEVICE_DVR:
		intf_type = MEDIA_INTF_T_DVB_DVR;
		break;
	case DVB_DEVICE_CA:
		intf_type = MEDIA_INTF_T_DVB_CA;
		break;
	case DVB_DEVICE_NET:
		intf_type = MEDIA_INTF_T_DVB_NET;
		break;
	default:
425
		return 0;
426 427 428
	}

	dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev,
429
						    intf_type, 0,
430
						    DVB_MAJOR, minor);
431 432 433

	if (!dvbdev->intf_devnode)
		return -ENOMEM;
434 435 436 437 438 439 440 441 442

	/*
	 * Create the "obvious" link, e. g. the ones that represent
	 * a direct association between an interface and an entity.
	 * Other links should be created elsewhere, like:
	 *		DVB FE intf    -> tuner
	 *		DVB demux intf -> dvr
	 */

443 444
	if (!dvbdev->entity)
		return 0;
445

446 447 448 449
	link = media_create_intf_link(dvbdev->entity,
				      &dvbdev->intf_devnode->intf,
				      MEDIA_LNK_FL_ENABLED |
				      MEDIA_LNK_FL_IMMUTABLE);
450 451
	if (!link)
		return -ENOMEM;
452
#endif
453
	return 0;
454 455
}

L
Linus Torvalds 已提交
456
int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
457 458
			const struct dvb_device *template, void *priv,
			enum dvb_device_type type, int demux_sink_pads)
L
Linus Torvalds 已提交
459 460
{
	struct dvb_device *dvbdev;
461
	struct file_operations *dvbdevfops;
462
	struct device *clsdev;
463
	int minor;
464
	int id, ret;
L
Linus Torvalds 已提交
465

466
	mutex_lock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
467

468
	if ((id = dvbdev_get_free_id (adap, type)) < 0){
469
		mutex_unlock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
470
		*pdvbdev = NULL;
471
		pr_err("%s: couldn't find free device id\n", __func__);
L
Linus Torvalds 已提交
472 473 474
		return -ENFILE;
	}

475
	*pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
L
Linus Torvalds 已提交
476

477 478 479 480 481
	if (!dvbdev){
		mutex_unlock(&dvbdev_register_lock);
		return -ENOMEM;
	}

482
	dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
483 484 485

	if (!dvbdevfops){
		kfree (dvbdev);
486
		mutex_unlock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
487 488 489 490 491 492 493 494
		return -ENOMEM;
	}

	memcpy(dvbdev, template, sizeof(struct dvb_device));
	dvbdev->type = type;
	dvbdev->id = id;
	dvbdev->adapter = adap;
	dvbdev->priv = priv;
495
	dvbdev->fops = dvbdevfops;
496
	init_waitqueue_head (&dvbdev->wait_queue);
L
Linus Torvalds 已提交
497

498
	dvbdevfops->owner = adap->module;
L
Linus Torvalds 已提交
499 500 501

	list_add_tail (&dvbdev->list_head, &adap->device_list);

502 503 504 505 506 507 508 509 510
	down_write(&minor_rwsem);
#ifdef CONFIG_DVB_DYNAMIC_MINORS
	for (minor = 0; minor < MAX_DVB_MINORS; minor++)
		if (dvb_minors[minor] == NULL)
			break;

	if (minor == MAX_DVB_MINORS) {
		kfree(dvbdevfops);
		kfree(dvbdev);
511
		up_write(&minor_rwsem);
512 513 514 515 516 517 518 519 520 521 522
		mutex_unlock(&dvbdev_register_lock);
		return -EINVAL;
	}
#else
	minor = nums2minor(adap->num, type, id);
#endif

	dvbdev->minor = minor;
	dvb_minors[minor] = dvbdev;
	up_write(&minor_rwsem);

523 524
	ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
	if (ret) {
525
		pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
526 527 528 529 530 531 532 533 534
		      __func__);

		dvb_media_device_free(dvbdev);
		kfree(dvbdevfops);
		kfree(dvbdev);
		mutex_unlock(&dvbdev_register_lock);
		return ret;
	}

535 536
	mutex_unlock(&dvbdev_register_lock);

537
	clsdev = device_create(dvb_class, adap->device,
538
			       MKDEV(DVB_MAJOR, minor),
539
			       dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
540
	if (IS_ERR(clsdev)) {
541
		pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
542
		       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
543 544 545
		dvb_media_device_free(dvbdev);
		kfree(dvbdevfops);
		kfree(dvbdev);
546 547
		return PTR_ERR(clsdev);
	}
548
	dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
549
		adap->num, dnames[type], id, minor, minor);
L
Linus Torvalds 已提交
550 551 552 553 554 555

	return 0;
}
EXPORT_SYMBOL(dvb_register_device);


556
void dvb_remove_device(struct dvb_device *dvbdev)
L
Linus Torvalds 已提交
557 558 559 560
{
	if (!dvbdev)
		return;

561 562 563 564
	down_write(&minor_rwsem);
	dvb_minors[dvbdev->minor] = NULL;
	up_write(&minor_rwsem);

565
	dvb_media_device_free(dvbdev);
566

567
	device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
568

L
Linus Torvalds 已提交
569
	list_del (&dvbdev->list_head);
570 571 572 573 574 575 576 577 578
}
EXPORT_SYMBOL(dvb_remove_device);


void dvb_free_device(struct dvb_device *dvbdev)
{
	if (!dvbdev)
		return;

579
	kfree (dvbdev->fops);
L
Linus Torvalds 已提交
580 581
	kfree (dvbdev);
}
582 583 584 585 586 587 588 589
EXPORT_SYMBOL(dvb_free_device);


void dvb_unregister_device(struct dvb_device *dvbdev)
{
	dvb_remove_device(dvbdev);
	dvb_free_device(dvbdev);
}
L
Linus Torvalds 已提交
590 591
EXPORT_SYMBOL(dvb_unregister_device);

592 593

#ifdef CONFIG_MEDIA_CONTROLLER_DVB
594 595 596 597 598 599 600 601 602 603 604 605 606 607

static int dvb_create_io_intf_links(struct dvb_adapter *adap,
				    struct media_interface *intf,
				    char *name)
{
	struct media_device *mdev = adap->mdev;
	struct media_entity *entity;
	struct media_link *link;

	media_device_for_each_entity(entity, mdev) {
		if (entity->function == MEDIA_ENT_F_IO_DTV) {
			if (strncmp(entity->name, name, strlen(name)))
				continue;
			link = media_create_intf_link(entity, intf,
608 609
						      MEDIA_LNK_FL_ENABLED |
						      MEDIA_LNK_FL_IMMUTABLE);
610 611 612 613 614 615 616
			if (!link)
				return -ENOMEM;
		}
	}
	return 0;
}

617 618
int dvb_create_media_graph(struct dvb_adapter *adap,
			   bool create_rf_connector)
619 620
{
	struct media_device *mdev = adap->mdev;
621
	struct media_entity *entity, *tuner = NULL, *demod = NULL, *conn;
622
	struct media_entity *demux = NULL, *ca = NULL;
623
	struct media_link *link;
624
	struct media_interface *intf;
625 626
	unsigned demux_pad = 0;
	unsigned dvr_pad = 0;
627
	unsigned ntuner = 0, ndemod = 0;
628
	int ret, pad_source, pad_sink;
629
	static const char *connector_name = "Television";
630 631

	if (!mdev)
632
		return 0;
633 634

	media_device_for_each_entity(entity, mdev) {
635
		switch (entity->function) {
636
		case MEDIA_ENT_F_TUNER:
637
			tuner = entity;
638
			ntuner++;
639
			break;
640
		case MEDIA_ENT_F_DTV_DEMOD:
641
			demod = entity;
642
			ndemod++;
643
			break;
644
		case MEDIA_ENT_F_TS_DEMUX:
645 646
			demux = entity;
			break;
647
		case MEDIA_ENT_F_DTV_CA:
648 649 650 651 652
			ca = entity;
			break;
		}
	}

653 654 655 656 657 658 659 660 661 662 663 664
	/*
	 * Prepare to signalize to media_create_pad_links() that multiple
	 * entities of the same type exists and a 1:n or n:1 links need to be
	 * created.
	 * NOTE: if both tuner and demod have multiple instances, it is up
	 * to the caller driver to create such links.
	 */
	if (ntuner > 1)
		tuner = NULL;
	if (ndemod > 1)
		demod = NULL;

665 666 667 668 669 670
	if (create_rf_connector) {
		conn = kzalloc(sizeof(*conn), GFP_KERNEL);
		if (!conn)
			return -ENOMEM;
		adap->conn = conn;

671
		adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL);
672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687
		if (!adap->conn_pads)
			return -ENOMEM;

		conn->flags = MEDIA_ENT_FL_CONNECTOR;
		conn->function = MEDIA_ENT_F_CONN_RF;
		conn->name = connector_name;
		adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE;

		ret = media_entity_pads_init(conn, 1, adap->conn_pads);
		if (ret)
			return ret;

		ret = media_device_register_entity(mdev, conn);
		if (ret)
			return ret;

688
		if (!ntuner) {
689 690 691 692 693 694 695
			ret = media_create_pad_links(mdev,
						     MEDIA_ENT_F_CONN_RF,
						     conn, 0,
						     MEDIA_ENT_F_DTV_DEMOD,
						     demod, 0,
						     MEDIA_LNK_FL_ENABLED,
						     false);
696 697 698 699 700
		} else {
			pad_sink = media_get_pad_index(tuner, true,
						       PAD_SIGNAL_ANALOG);
			if (pad_sink < 0)
				return -EINVAL;
701 702 703 704
			ret = media_create_pad_links(mdev,
						     MEDIA_ENT_F_CONN_RF,
						     conn, 0,
						     MEDIA_ENT_F_TUNER,
705
						     tuner, pad_sink,
706 707
						     MEDIA_LNK_FL_ENABLED,
						     false);
708
		}
709 710 711 712
		if (ret)
			return ret;
	}

713
	if (ntuner && ndemod) {
714 715
		/* NOTE: first found tuner source pad presumed correct */
		pad_source = media_get_pad_index(tuner, false,
716
						 PAD_SIGNAL_ANALOG);
717
		if (pad_source < 0)
718
			return -EINVAL;
719 720
		ret = media_create_pad_links(mdev,
					     MEDIA_ENT_F_TUNER,
721
					     tuner, pad_source,
722 723 724
					     MEDIA_ENT_F_DTV_DEMOD,
					     demod, 0, MEDIA_LNK_FL_ENABLED,
					     false);
725 726 727
		if (ret)
			return ret;
	}
728

729 730 731 732 733 734 735
	if (ndemod && demux) {
		ret = media_create_pad_links(mdev,
					     MEDIA_ENT_F_DTV_DEMOD,
					     demod, 1,
					     MEDIA_ENT_F_TS_DEMUX,
					     demux, 0, MEDIA_LNK_FL_ENABLED,
					     false);
736
		if (ret)
737
			return ret;
738 739 740 741
	}
	if (demux && ca) {
		ret = media_create_pad_link(demux, 1, ca,
					    0, MEDIA_LNK_FL_ENABLED);
742
		if (ret)
743
			return ret;
744
	}
745

746 747 748
	/* Create demux links for each ringbuffer/pad */
	if (demux) {
		media_device_for_each_entity(entity, mdev) {
749
			if (entity->function == MEDIA_ENT_F_IO_DTV) {
750
				if (!strncmp(entity->name, DVR_TSOUT,
751 752 753 754 755 756 757
				    strlen(DVR_TSOUT))) {
					ret = media_create_pad_link(demux,
								++dvr_pad,
							    entity, 0, 0);
					if (ret)
						return ret;
				}
758
				if (!strncmp(entity->name, DEMUX_TSOUT,
759 760
				    strlen(DEMUX_TSOUT))) {
					ret = media_create_pad_link(demux,
761
							      ++demux_pad,
762 763 764 765
							    entity, 0, 0);
					if (ret)
						return ret;
				}
766 767 768 769
			}
		}
	}

770
	/* Create interface links for FE->tuner, DVR->demux and CA->ca */
771
	media_device_for_each_intf(intf, mdev) {
772 773
		if (intf->type == MEDIA_INTF_T_DVB_CA && ca) {
			link = media_create_intf_link(ca, intf,
774 775
						      MEDIA_LNK_FL_ENABLED |
						      MEDIA_LNK_FL_IMMUTABLE);
776 777 778
			if (!link)
				return -ENOMEM;
		}
779

780 781
		if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) {
			link = media_create_intf_link(tuner, intf,
782 783
						      MEDIA_LNK_FL_ENABLED |
						      MEDIA_LNK_FL_IMMUTABLE);
784 785 786
			if (!link)
				return -ENOMEM;
		}
787 788 789 790 791 792
#if 0
		/*
		 * Indirect link - let's not create yet, as we don't know how
		 *		   to handle indirect links, nor if this will
		 *		   actually be needed.
		 */
793 794
		if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) {
			link = media_create_intf_link(demux, intf,
795 796
						      MEDIA_LNK_FL_ENABLED |
						      MEDIA_LNK_FL_IMMUTABLE);
797 798 799
			if (!link)
				return -ENOMEM;
		}
800
#endif
801 802 803 804 805 806 807 808 809
		if (intf->type == MEDIA_INTF_T_DVB_DVR) {
			ret = dvb_create_io_intf_links(adap, intf, DVR_TSOUT);
			if (ret)
				return ret;
		}
		if (intf->type == MEDIA_INTF_T_DVB_DEMUX) {
			ret = dvb_create_io_intf_links(adap, intf, DEMUX_TSOUT);
			if (ret)
				return ret;
810
		}
811
	}
812
	return 0;
813 814
}
EXPORT_SYMBOL_GPL(dvb_create_media_graph);
815
#endif
816

817 818 819 820 821 822 823 824 825 826 827
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;
}
L
Linus Torvalds 已提交
828 829 830 831 832 833

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

	while (num < DVB_MAX_ADAPTERS) {
834 835
		if (dvbdev_check_free_adapter_num(num))
			return num;
L
Linus Torvalds 已提交
836 837 838 839 840 841 842
		num++;
	}

	return -ENFILE;
}


843 844 845
int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
			 struct module *module, struct device *device,
			 short *adapter_nums)
L
Linus Torvalds 已提交
846
{
847
	int i, num;
L
Linus Torvalds 已提交
848

849
	mutex_lock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
850

851 852 853 854 855 856 857 858 859 860 861 862 863 864
	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) {
865
		mutex_unlock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
866 867 868 869 870 871
		return -ENFILE;
	}

	memset (adap, 0, sizeof(struct dvb_adapter));
	INIT_LIST_HEAD (&adap->device_list);

872
	pr_info("DVB: registering new adapter (%s)\n", name);
L
Linus Torvalds 已提交
873 874 875 876

	adap->num = num;
	adap->name = name;
	adap->module = module;
877
	adap->device = device;
878 879 880
	adap->mfe_shared = 0;
	adap->mfe_dvbdev = NULL;
	mutex_init (&adap->mfe_lock);
L
Linus Torvalds 已提交
881

882 883 884 885
#ifdef CONFIG_MEDIA_CONTROLLER_DVB
	mutex_init(&adap->mdev_lock);
#endif

L
Linus Torvalds 已提交
886 887
	list_add_tail (&adap->list_head, &dvb_adapter_list);

888
	mutex_unlock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
889 890 891 892 893 894 895 896

	return num;
}
EXPORT_SYMBOL(dvb_register_adapter);


int dvb_unregister_adapter(struct dvb_adapter *adap)
{
897
	mutex_lock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
898
	list_del (&adap->list_head);
899
	mutex_unlock(&dvbdev_register_lock);
L
Linus Torvalds 已提交
900 901 902 903 904 905
	return 0;
}
EXPORT_SYMBOL(dvb_unregister_adapter);

/* if the miracle happens and "generic_usercopy()" is included into
   the kernel, then this can vanish. please don't make the mistake and
906
   define this as video_usercopy(). this will introduce a dependency
L
Linus Torvalds 已提交
907 908
   to the v4l "videodev.o" module, which is unnecessary for some
   cards (ie. the budget dvb-cards don't need the v4l module...) */
909
int dvb_usercopy(struct file *file,
910
		     unsigned int cmd, unsigned long arg,
911
		     int (*func)(struct file *file,
L
Linus Torvalds 已提交
912 913
		     unsigned int cmd, void *arg))
{
914 915 916 917 918 919 920 921
	char    sbuf[128];
	void    *mbuf = NULL;
	void    *parg = NULL;
	int     err  = -EINVAL;

	/*  Copy arguments into temp kernel buffer  */
	switch (_IOC_DIR(cmd)) {
	case _IOC_NONE:
L
Linus Torvalds 已提交
922 923 924 925 926 927
		/*
		 * For this command, the pointer is actually an integer
		 * argument.
		 */
		parg = (void *) arg;
		break;
928 929 930 931
	case _IOC_READ: /* some v4l ioctls are marked wrong ... */
	case _IOC_WRITE:
	case (_IOC_WRITE | _IOC_READ):
		if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
932
			parg = sbuf;
933
		} else {
934
			/* too big to allocate from stack */
935
			mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
936 937 938
			if (NULL == mbuf)
				return -ENOMEM;
			parg = mbuf;
939 940 941 942
		}

		err = -EFAULT;
		if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
943
			goto out;
944 945 946 947
		break;
	}

	/* call driver */
948
	if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
949
		err = -ENOTTY;
950 951 952 953 954 955 956 957 958 959

	if (err < 0)
		goto out;

	/*  Copy results into user buffer  */
	switch (_IOC_DIR(cmd))
	{
	case _IOC_READ:
	case (_IOC_WRITE | _IOC_READ):
		if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
960
			err = -EFAULT;
961 962
		break;
	}
L
Linus Torvalds 已提交
963 964

out:
965 966
	kfree(mbuf);
	return err;
L
Linus Torvalds 已提交
967 968
}

969
#if IS_ENABLED(CONFIG_I2C)
970 971 972 973 974 975 976 977 978 979
struct i2c_client *dvb_module_probe(const char *module_name,
				    const char *name,
				    struct i2c_adapter *adap,
				    unsigned char addr,
				    void *platform_data)
{
	struct i2c_client *client;
	struct i2c_board_info *board_info;

	board_info = kzalloc(sizeof(*board_info), GFP_KERNEL);
980 981
	if (!board_info)
		return NULL;
982 983

	if (name)
984
		strscpy(board_info->type, name, I2C_NAME_SIZE);
985
	else
986
		strscpy(board_info->type, module_name, I2C_NAME_SIZE);
987 988 989 990

	board_info->addr = addr;
	board_info->platform_data = platform_data;
	request_module(module_name);
991 992
	client = i2c_new_client_device(adap, board_info);
	if (!i2c_client_has_driver(client)) {
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
		kfree(board_info);
		return NULL;
	}

	if (!try_module_get(client->dev.driver->owner)) {
		i2c_unregister_device(client);
		client = NULL;
	}

	kfree(board_info);
	return client;
}
EXPORT_SYMBOL_GPL(dvb_module_probe);

void dvb_module_release(struct i2c_client *client)
{
	if (!client)
		return;

	module_put(client->dev.driver->owner);
	i2c_unregister_device(client);
}
EXPORT_SYMBOL_GPL(dvb_module_release);
#endif

1018 1019 1020 1021 1022
static int dvb_uevent(struct device *dev, struct kobj_uevent_env *env)
{
	struct dvb_device *dvbdev = dev_get_drvdata(dev);

	add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num);
1023 1024
	add_uevent_var(env, "DVB_DEVICE_TYPE=%s", dnames[dvbdev->type]);
	add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id);
1025 1026 1027
	return 0;
}

1028
static char *dvb_devnode(struct device *dev, umode_t *mode)
1029 1030 1031 1032 1033 1034 1035 1036
{
	struct dvb_device *dvbdev = dev_get_drvdata(dev);

	return kasprintf(GFP_KERNEL, "dvb/adapter%d/%s%d",
		dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id);
}


L
Linus Torvalds 已提交
1037 1038 1039 1040 1041 1042
static int __init init_dvbdev(void)
{
	int retval;
	dev_t dev = MKDEV(DVB_MAJOR, 0);

	if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
1043
		pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
L
Linus Torvalds 已提交
1044 1045 1046 1047 1048
		return retval;
	}

	cdev_init(&dvb_device_cdev, &dvb_device_fops);
	if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
1049
		pr_err("dvb-core: unable register character device\n");
L
Linus Torvalds 已提交
1050 1051 1052
		goto error;
	}

1053
	dvb_class = class_create(THIS_MODULE, "dvb");
L
Linus Torvalds 已提交
1054 1055 1056 1057
	if (IS_ERR(dvb_class)) {
		retval = PTR_ERR(dvb_class);
		goto error;
	}
1058
	dvb_class->dev_uevent = dvb_uevent;
1059
	dvb_class->devnode = dvb_devnode;
L
Linus Torvalds 已提交
1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
	return 0;

error:
	cdev_del(&dvb_device_cdev);
	unregister_chrdev_region(dev, MAX_DVB_MINORS);
	return retval;
}


static void __exit exit_dvbdev(void)
{
1071
	class_destroy(dvb_class);
L
Linus Torvalds 已提交
1072
	cdev_del(&dvb_device_cdev);
1073
	unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
L
Linus Torvalds 已提交
1074 1075
}

1076
subsys_initcall(init_dvbdev);
L
Linus Torvalds 已提交
1077 1078 1079 1080 1081
module_exit(exit_dvbdev);

MODULE_DESCRIPTION("DVB Core Driver");
MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler");
MODULE_LICENSE("GPL");