Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: LGPL-2.1-or-later
   2/*
   3 * dvbdev.c
   4 *
   5 * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
   6 *                  & Marcus Metzler <marcus@convergence.de>
   7 *                    for convergence integrated media GmbH
   8 */
   9
  10#define pr_fmt(fmt) "dvbdev: " fmt
  11
  12#include <linux/types.h>
  13#include <linux/errno.h>
  14#include <linux/string.h>
  15#include <linux/module.h>
  16#include <linux/kernel.h>
  17#include <linux/i2c.h>
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/device.h>
  21#include <linux/fs.h>
  22#include <linux/cdev.h>
  23#include <linux/mutex.h>
  24#include <media/dvbdev.h>
  25
  26/* Due to enum tuner_pad_index */
  27#include <media/tuner.h>
  28
  29static DEFINE_MUTEX(dvbdev_mutex);
  30static LIST_HEAD(dvbdevfops_list);
  31static int dvbdev_debug;
  32
  33module_param(dvbdev_debug, int, 0644);
  34MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
  35
  36#define dprintk(fmt, arg...) do {					\
  37	if (dvbdev_debug)						\
  38		printk(KERN_DEBUG pr_fmt("%s: " fmt),			\
  39		       __func__, ##arg);				\
  40} while (0)
  41
  42static LIST_HEAD(dvb_adapter_list);
  43static DEFINE_MUTEX(dvbdev_register_lock);
  44
  45static const char * const dnames[] = {
  46	[DVB_DEVICE_VIDEO] =		"video",
  47	[DVB_DEVICE_AUDIO] =		"audio",
  48	[DVB_DEVICE_SEC] =		"sec",
  49	[DVB_DEVICE_FRONTEND] =		"frontend",
  50	[DVB_DEVICE_DEMUX] =		"demux",
  51	[DVB_DEVICE_DVR] =		"dvr",
  52	[DVB_DEVICE_CA] =		"ca",
  53	[DVB_DEVICE_NET] =		"net",
  54	[DVB_DEVICE_OSD] =		"osd"
  55};
  56
  57#ifdef CONFIG_DVB_DYNAMIC_MINORS
  58#define MAX_DVB_MINORS		256
  59#define DVB_MAX_IDS		MAX_DVB_MINORS
  60#else
  61#define DVB_MAX_IDS		4
  62
  63static const u8 minor_type[] = {
  64	[DVB_DEVICE_VIDEO]      = 0,
  65	[DVB_DEVICE_AUDIO]      = 1,
  66	[DVB_DEVICE_SEC]        = 2,
  67	[DVB_DEVICE_FRONTEND]   = 3,
  68	[DVB_DEVICE_DEMUX]      = 4,
  69	[DVB_DEVICE_DVR]        = 5,
  70	[DVB_DEVICE_CA]         = 6,
  71	[DVB_DEVICE_NET]        = 7,
  72	[DVB_DEVICE_OSD]        = 8,
  73};
  74
  75#define nums2minor(num, type, id) \
  76	(((num) << 6) | ((id) << 4) | minor_type[type])
  77
  78#define MAX_DVB_MINORS		(DVB_MAX_ADAPTERS * 64)
  79#endif
  80
  81static struct class *dvb_class;
  82
  83static struct dvb_device *dvb_minors[MAX_DVB_MINORS];
  84static DECLARE_RWSEM(minor_rwsem);
  85
  86static int dvb_device_open(struct inode *inode, struct file *file)
  87{
  88	struct dvb_device *dvbdev;
  89	unsigned int minor = iminor(inode);
  90
  91	if (minor >= MAX_DVB_MINORS)
  92		return -ENODEV;
  93
  94	mutex_lock(&dvbdev_mutex);
  95	down_read(&minor_rwsem);
  96
  97	dvbdev = dvb_minors[minor];
  98
  99	if (dvbdev && dvbdev->fops) {
 100		int err = 0;
 101		const struct file_operations *new_fops;
 102
 103		new_fops = fops_get(dvbdev->fops);
 104		if (!new_fops)
 105			goto fail;
 106		file->private_data = dvb_device_get(dvbdev);
 107		replace_fops(file, new_fops);
 108		if (file->f_op->open)
 109			err = file->f_op->open(inode, file);
 110		up_read(&minor_rwsem);
 111		mutex_unlock(&dvbdev_mutex);
 112		if (err)
 113			dvb_device_put(dvbdev);
 114		return err;
 115	}
 116fail:
 117	up_read(&minor_rwsem);
 118	mutex_unlock(&dvbdev_mutex);
 119	return -ENODEV;
 120}
 121
 122static const struct file_operations dvb_device_fops = {
 
 
 123	.owner =	THIS_MODULE,
 124	.open =		dvb_device_open,
 125	.llseek =	noop_llseek,
 126};
 127
 128static struct cdev dvb_device_cdev;
 129
 130int dvb_generic_open(struct inode *inode, struct file *file)
 131{
 132	struct dvb_device *dvbdev = file->private_data;
 133
 134	if (!dvbdev)
 135		return -ENODEV;
 136
 137	if (!dvbdev->users)
 138		return -EBUSY;
 139
 140	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
 141		if (!dvbdev->readers)
 142			return -EBUSY;
 143		dvbdev->readers--;
 144	} else {
 145		if (!dvbdev->writers)
 146			return -EBUSY;
 147		dvbdev->writers--;
 148	}
 149
 150	dvbdev->users--;
 151	return 0;
 152}
 153EXPORT_SYMBOL(dvb_generic_open);
 154
 
 155int dvb_generic_release(struct inode *inode, struct file *file)
 156{
 157	struct dvb_device *dvbdev = file->private_data;
 158
 159	if (!dvbdev)
 160		return -ENODEV;
 161
 162	if ((file->f_flags & O_ACCMODE) == O_RDONLY)
 163		dvbdev->readers++;
 164	else
 165		dvbdev->writers++;
 
 166
 167	dvbdev->users++;
 168
 169	dvb_device_put(dvbdev);
 170
 171	return 0;
 172}
 173EXPORT_SYMBOL(dvb_generic_release);
 174
 
 175long dvb_generic_ioctl(struct file *file,
 176		       unsigned int cmd, unsigned long arg)
 177{
 178	struct dvb_device *dvbdev = file->private_data;
 179
 180	if (!dvbdev)
 181		return -ENODEV;
 182
 183	if (!dvbdev->kernel_ioctl)
 184		return -EINVAL;
 185
 186	return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
 187}
 188EXPORT_SYMBOL(dvb_generic_ioctl);
 189
 190static int dvbdev_get_free_id(struct dvb_adapter *adap, int type)
 
 191{
 192	u32 id = 0;
 193
 194	while (id < DVB_MAX_IDS) {
 195		struct dvb_device *dev;
 196
 197		list_for_each_entry(dev, &adap->device_list, list_head)
 198			if (dev->type == type && dev->id == id)
 199				goto skip;
 200		return id;
 201skip:
 202		id++;
 203	}
 204	return -ENFILE;
 205}
 206
 207static void dvb_media_device_free(struct dvb_device *dvbdev)
 208{
 209#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 210	if (dvbdev->entity) {
 211		media_device_unregister_entity(dvbdev->entity);
 212		kfree(dvbdev->entity);
 213		kfree(dvbdev->pads);
 214		dvbdev->entity = NULL;
 215		dvbdev->pads = NULL;
 216	}
 217
 218	if (dvbdev->tsout_entity) {
 219		int i;
 220
 221		for (i = 0; i < dvbdev->tsout_num_entities; i++) {
 222			media_device_unregister_entity(&dvbdev->tsout_entity[i]);
 223			kfree(dvbdev->tsout_entity[i].name);
 224		}
 225		kfree(dvbdev->tsout_entity);
 226		kfree(dvbdev->tsout_pads);
 227		dvbdev->tsout_entity = NULL;
 228		dvbdev->tsout_pads = NULL;
 229
 230		dvbdev->tsout_num_entities = 0;
 231	}
 232
 233	if (dvbdev->intf_devnode) {
 234		media_devnode_remove(dvbdev->intf_devnode);
 235		dvbdev->intf_devnode = NULL;
 236	}
 237
 238	if (dvbdev->adapter->conn) {
 239		media_device_unregister_entity(dvbdev->adapter->conn);
 240		kfree(dvbdev->adapter->conn);
 241		dvbdev->adapter->conn = NULL;
 242		kfree(dvbdev->adapter->conn_pads);
 243		dvbdev->adapter->conn_pads = NULL;
 244	}
 245#endif
 246}
 247
 248#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 249static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
 250				   const char *name, int npads)
 251{
 252	int i;
 253
 254	dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads),
 255				     GFP_KERNEL);
 256	if (!dvbdev->tsout_pads)
 257		return -ENOMEM;
 258
 259	dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity),
 260				       GFP_KERNEL);
 261	if (!dvbdev->tsout_entity)
 262		return -ENOMEM;
 263
 264	dvbdev->tsout_num_entities = npads;
 265
 266	for (i = 0; i < npads; i++) {
 267		struct media_pad *pads = &dvbdev->tsout_pads[i];
 268		struct media_entity *entity = &dvbdev->tsout_entity[i];
 269		int ret;
 270
 271		entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i);
 272		if (!entity->name)
 273			return -ENOMEM;
 274
 275		entity->function = MEDIA_ENT_F_IO_DTV;
 276		pads->flags = MEDIA_PAD_FL_SINK;
 277
 278		ret = media_entity_pads_init(entity, 1, pads);
 279		if (ret < 0)
 280			return ret;
 281
 282		ret = media_device_register_entity(dvbdev->adapter->mdev,
 283						   entity);
 284		if (ret < 0)
 285			return ret;
 286	}
 287	return 0;
 288}
 289
 290#define DEMUX_TSOUT	"demux-tsout"
 291#define DVR_TSOUT	"dvr-tsout"
 292
 293static int dvb_create_media_entity(struct dvb_device *dvbdev,
 294				   int type, int demux_sink_pads)
 295{
 296	int i, ret, npads;
 297
 298	switch (type) {
 299	case DVB_DEVICE_FRONTEND:
 300		npads = 2;
 301		break;
 302	case DVB_DEVICE_DVR:
 303		ret = dvb_create_tsout_entity(dvbdev, DVR_TSOUT,
 304					      demux_sink_pads);
 305		return ret;
 306	case DVB_DEVICE_DEMUX:
 307		npads = 1 + demux_sink_pads;
 308		ret = dvb_create_tsout_entity(dvbdev, DEMUX_TSOUT,
 309					      demux_sink_pads);
 310		if (ret < 0)
 311			return ret;
 312		break;
 313	case DVB_DEVICE_CA:
 314		npads = 2;
 315		break;
 316	case DVB_DEVICE_NET:
 317		/*
 318		 * We should be creating entities for the MPE/ULE
 319		 * decapsulation hardware (or software implementation).
 320		 *
 321		 * However, the number of for the MPE/ULE decaps may not be
 322		 * fixed. As we don't have yet dynamic support for PADs at
 323		 * the Media Controller, let's not create the decap
 324		 * entities yet.
 325		 */
 326		return 0;
 327	default:
 328		return 0;
 329	}
 330
 331	dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
 332	if (!dvbdev->entity)
 333		return -ENOMEM;
 334
 335	dvbdev->entity->name = dvbdev->name;
 336
 337	if (npads) {
 338		dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
 339				       GFP_KERNEL);
 340		if (!dvbdev->pads) {
 341			kfree(dvbdev->entity);
 342			dvbdev->entity = NULL;
 343			return -ENOMEM;
 344		}
 345	}
 346
 347	switch (type) {
 348	case DVB_DEVICE_FRONTEND:
 349		dvbdev->entity->function = MEDIA_ENT_F_DTV_DEMOD;
 350		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 351		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
 352		break;
 353	case DVB_DEVICE_DEMUX:
 354		dvbdev->entity->function = MEDIA_ENT_F_TS_DEMUX;
 355		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 356		for (i = 1; i < npads; i++)
 357			dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE;
 358		break;
 359	case DVB_DEVICE_CA:
 360		dvbdev->entity->function = MEDIA_ENT_F_DTV_CA;
 361		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 362		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
 363		break;
 364	default:
 365		/* Should never happen, as the first switch prevents it */
 366		kfree(dvbdev->entity);
 367		kfree(dvbdev->pads);
 368		dvbdev->entity = NULL;
 369		dvbdev->pads = NULL;
 370		return 0;
 371	}
 372
 373	if (npads) {
 374		ret = media_entity_pads_init(dvbdev->entity, npads, dvbdev->pads);
 375		if (ret)
 376			return ret;
 377	}
 378	ret = media_device_register_entity(dvbdev->adapter->mdev,
 379					   dvbdev->entity);
 380	if (ret)
 381		return ret;
 382
 383	pr_info("%s: media entity '%s' registered.\n",
 384		__func__, dvbdev->entity->name);
 385
 386	return 0;
 387}
 388#endif
 389
 390static int dvb_register_media_device(struct dvb_device *dvbdev,
 391				     int type, int minor,
 392				     unsigned int demux_sink_pads)
 393{
 394#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 395	struct media_link *link;
 396	u32 intf_type;
 397	int ret;
 398
 399	if (!dvbdev->adapter->mdev)
 400		return 0;
 401
 402	ret = dvb_create_media_entity(dvbdev, type, demux_sink_pads);
 403	if (ret)
 404		return ret;
 405
 406	switch (type) {
 407	case DVB_DEVICE_FRONTEND:
 408		intf_type = MEDIA_INTF_T_DVB_FE;
 409		break;
 410	case DVB_DEVICE_DEMUX:
 411		intf_type = MEDIA_INTF_T_DVB_DEMUX;
 412		break;
 413	case DVB_DEVICE_DVR:
 414		intf_type = MEDIA_INTF_T_DVB_DVR;
 415		break;
 416	case DVB_DEVICE_CA:
 417		intf_type = MEDIA_INTF_T_DVB_CA;
 418		break;
 419	case DVB_DEVICE_NET:
 420		intf_type = MEDIA_INTF_T_DVB_NET;
 421		break;
 422	default:
 423		return 0;
 424	}
 425
 426	dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev,
 427						    intf_type, 0,
 428						    DVB_MAJOR, minor);
 429
 430	if (!dvbdev->intf_devnode)
 431		return -ENOMEM;
 432
 433	/*
 434	 * Create the "obvious" link, e. g. the ones that represent
 435	 * a direct association between an interface and an entity.
 436	 * Other links should be created elsewhere, like:
 437	 *		DVB FE intf    -> tuner
 438	 *		DVB demux intf -> dvr
 439	 */
 440
 441	if (!dvbdev->entity)
 442		return 0;
 443
 444	link = media_create_intf_link(dvbdev->entity,
 445				      &dvbdev->intf_devnode->intf,
 446				      MEDIA_LNK_FL_ENABLED |
 447				      MEDIA_LNK_FL_IMMUTABLE);
 448	if (!link)
 449		return -ENOMEM;
 450#endif
 451	return 0;
 452}
 453
 454int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 455			const struct dvb_device *template, void *priv,
 456			enum dvb_device_type type, int demux_sink_pads)
 457{
 458	struct dvb_device *dvbdev;
 459	struct file_operations *dvbdevfops = NULL;
 460	struct dvbdevfops_node *node = NULL, *new_node = NULL;
 461	struct device *clsdev;
 462	int minor;
 463	int id, ret;
 464
 465	mutex_lock(&dvbdev_register_lock);
 466
 467	id = dvbdev_get_free_id(adap, type);
 468	if (id < 0) {
 469		mutex_unlock(&dvbdev_register_lock);
 470		*pdvbdev = NULL;
 471		pr_err("%s: couldn't find free device id\n", __func__);
 472		return -ENFILE;
 473	}
 474
 475	*pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
 476	if (!dvbdev) {
 
 477		mutex_unlock(&dvbdev_register_lock);
 478		return -ENOMEM;
 479	}
 480
 481	/*
 482	 * When a device of the same type is probe()d more than once,
 483	 * the first allocated fops are used. This prevents memory leaks
 484	 * that can occur when the same device is probe()d repeatedly.
 485	 */
 486	list_for_each_entry(node, &dvbdevfops_list, list_head) {
 487		if (node->fops->owner == adap->module &&
 488		    node->type == type && node->template == template) {
 489			dvbdevfops = node->fops;
 490			break;
 491		}
 492	}
 493
 494	if (!dvbdevfops) {
 495		dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
 496		if (!dvbdevfops) {
 497			kfree(dvbdev);
 498			*pdvbdev = NULL;
 499			mutex_unlock(&dvbdev_register_lock);
 500			return -ENOMEM;
 501		}
 502
 503		new_node = kzalloc(sizeof(*new_node), GFP_KERNEL);
 504		if (!new_node) {
 505			kfree(dvbdevfops);
 506			kfree(dvbdev);
 507			*pdvbdev = NULL;
 508			mutex_unlock(&dvbdev_register_lock);
 509			return -ENOMEM;
 510		}
 511
 512		new_node->fops = dvbdevfops;
 513		new_node->type = type;
 514		new_node->template = template;
 515		list_add_tail(&new_node->list_head, &dvbdevfops_list);
 516	}
 517
 518	memcpy(dvbdev, template, sizeof(struct dvb_device));
 519	kref_init(&dvbdev->ref);
 520	dvbdev->type = type;
 521	dvbdev->id = id;
 522	dvbdev->adapter = adap;
 523	dvbdev->priv = priv;
 524	dvbdev->fops = dvbdevfops;
 525	init_waitqueue_head(&dvbdev->wait_queue);
 
 526	dvbdevfops->owner = adap->module;
 527	list_add_tail(&dvbdev->list_head, &adap->device_list);
 
 
 528	down_write(&minor_rwsem);
 529#ifdef CONFIG_DVB_DYNAMIC_MINORS
 530	for (minor = 0; minor < MAX_DVB_MINORS; minor++)
 531		if (!dvb_minors[minor])
 532			break;
 533#else
 534	minor = nums2minor(adap->num, type, id);
 535#endif
 536	if (minor >= MAX_DVB_MINORS) {
 537		if (new_node) {
 538			list_del(&new_node->list_head);
 539			kfree(dvbdevfops);
 540			kfree(new_node);
 541		}
 542		list_del(&dvbdev->list_head);
 543		kfree(dvbdev);
 544		*pdvbdev = NULL;
 545		up_write(&minor_rwsem);
 546		mutex_unlock(&dvbdev_register_lock);
 547		return -EINVAL;
 548	}
 
 
 
 549
 550	dvbdev->minor = minor;
 551	dvb_minors[minor] = dvb_device_get(dvbdev);
 552	up_write(&minor_rwsem);
 
 553	ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
 554	if (ret) {
 555		pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
 556		       __func__);
 557		if (new_node) {
 558			list_del(&new_node->list_head);
 559			kfree(dvbdevfops);
 560			kfree(new_node);
 561		}
 562		dvb_media_device_free(dvbdev);
 563		list_del(&dvbdev->list_head);
 
 564		kfree(dvbdev);
 565		*pdvbdev = NULL;
 566		mutex_unlock(&dvbdev_register_lock);
 567		return ret;
 568	}
 569
 
 
 570	clsdev = device_create(dvb_class, adap->device,
 571			       MKDEV(DVB_MAJOR, minor),
 572			       dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
 573	if (IS_ERR(clsdev)) {
 574		pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
 575		       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
 576		if (new_node) {
 577			list_del(&new_node->list_head);
 578			kfree(dvbdevfops);
 579			kfree(new_node);
 580		}
 581		dvb_media_device_free(dvbdev);
 582		list_del(&dvbdev->list_head);
 
 583		kfree(dvbdev);
 584		*pdvbdev = NULL;
 585		mutex_unlock(&dvbdev_register_lock);
 586		return PTR_ERR(clsdev);
 587	}
 588
 589	dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
 590		adap->num, dnames[type], id, minor, minor);
 591
 592	mutex_unlock(&dvbdev_register_lock);
 593	return 0;
 594}
 595EXPORT_SYMBOL(dvb_register_device);
 596
 
 597void dvb_remove_device(struct dvb_device *dvbdev)
 598{
 599	if (!dvbdev)
 600		return;
 601
 602	down_write(&minor_rwsem);
 603	dvb_minors[dvbdev->minor] = NULL;
 604	dvb_device_put(dvbdev);
 605	up_write(&minor_rwsem);
 606
 607	dvb_media_device_free(dvbdev);
 608
 609	device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
 610
 611	list_del(&dvbdev->list_head);
 612}
 613EXPORT_SYMBOL(dvb_remove_device);
 614
 
 615static void dvb_free_device(struct kref *ref)
 616{
 617	struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
 618
 619	kfree(dvbdev);
 
 620}
 621
 
 622struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
 623{
 624	kref_get(&dvbdev->ref);
 625	return dvbdev;
 626}
 627EXPORT_SYMBOL(dvb_device_get);
 628
 
 629void dvb_device_put(struct dvb_device *dvbdev)
 630{
 631	if (dvbdev)
 632		kref_put(&dvbdev->ref, dvb_free_device);
 633}
 634
 
 635void dvb_unregister_device(struct dvb_device *dvbdev)
 636{
 637	dvb_remove_device(dvbdev);
 638	dvb_device_put(dvbdev);
 639}
 640EXPORT_SYMBOL(dvb_unregister_device);
 641
 
 642#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 643
 644static int dvb_create_io_intf_links(struct dvb_adapter *adap,
 645				    struct media_interface *intf,
 646				    char *name)
 647{
 648	struct media_device *mdev = adap->mdev;
 649	struct media_entity *entity;
 650	struct media_link *link;
 651
 652	media_device_for_each_entity(entity, mdev) {
 653		if (entity->function == MEDIA_ENT_F_IO_DTV) {
 654			if (strncmp(entity->name, name, strlen(name)))
 655				continue;
 656			link = media_create_intf_link(entity, intf,
 657						      MEDIA_LNK_FL_ENABLED |
 658						      MEDIA_LNK_FL_IMMUTABLE);
 659			if (!link)
 660				return -ENOMEM;
 661		}
 662	}
 663	return 0;
 664}
 665
 666int dvb_create_media_graph(struct dvb_adapter *adap,
 667			   bool create_rf_connector)
 668{
 669	struct media_device *mdev = adap->mdev;
 670	struct media_entity *entity, *tuner = NULL, *demod = NULL, *conn;
 671	struct media_entity *demux = NULL, *ca = NULL;
 672	struct media_link *link;
 673	struct media_interface *intf;
 674	unsigned int demux_pad = 0;
 675	unsigned int dvr_pad = 0;
 676	unsigned int ntuner = 0, ndemod = 0;
 677	int ret, pad_source, pad_sink;
 678	static const char *connector_name = "Television";
 679
 680	if (!mdev)
 681		return 0;
 682
 683	media_device_for_each_entity(entity, mdev) {
 684		switch (entity->function) {
 685		case MEDIA_ENT_F_TUNER:
 686			tuner = entity;
 687			ntuner++;
 688			break;
 689		case MEDIA_ENT_F_DTV_DEMOD:
 690			demod = entity;
 691			ndemod++;
 692			break;
 693		case MEDIA_ENT_F_TS_DEMUX:
 694			demux = entity;
 695			break;
 696		case MEDIA_ENT_F_DTV_CA:
 697			ca = entity;
 698			break;
 699		}
 700	}
 701
 702	/*
 703	 * Prepare to signalize to media_create_pad_links() that multiple
 704	 * entities of the same type exists and a 1:n or n:1 links need to be
 705	 * created.
 706	 * NOTE: if both tuner and demod have multiple instances, it is up
 707	 * to the caller driver to create such links.
 708	 */
 709	if (ntuner > 1)
 710		tuner = NULL;
 711	if (ndemod > 1)
 712		demod = NULL;
 713
 714	if (create_rf_connector) {
 715		conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 716		if (!conn)
 717			return -ENOMEM;
 718		adap->conn = conn;
 719
 720		adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL);
 721		if (!adap->conn_pads)
 722			return -ENOMEM;
 723
 724		conn->flags = MEDIA_ENT_FL_CONNECTOR;
 725		conn->function = MEDIA_ENT_F_CONN_RF;
 726		conn->name = connector_name;
 727		adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE;
 728
 729		ret = media_entity_pads_init(conn, 1, adap->conn_pads);
 730		if (ret)
 731			return ret;
 732
 733		ret = media_device_register_entity(mdev, conn);
 734		if (ret)
 735			return ret;
 736
 737		if (!ntuner) {
 738			ret = media_create_pad_links(mdev,
 739						     MEDIA_ENT_F_CONN_RF,
 740						     conn, 0,
 741						     MEDIA_ENT_F_DTV_DEMOD,
 742						     demod, 0,
 743						     MEDIA_LNK_FL_ENABLED,
 744						     false);
 745		} else {
 746			pad_sink = media_get_pad_index(tuner, MEDIA_PAD_FL_SINK,
 747						       PAD_SIGNAL_ANALOG);
 748			if (pad_sink < 0)
 749				return -EINVAL;
 750			ret = media_create_pad_links(mdev,
 751						     MEDIA_ENT_F_CONN_RF,
 752						     conn, 0,
 753						     MEDIA_ENT_F_TUNER,
 754						     tuner, pad_sink,
 755						     MEDIA_LNK_FL_ENABLED,
 756						     false);
 757		}
 758		if (ret)
 759			return ret;
 760	}
 761
 762	if (ntuner && ndemod) {
 763		/* NOTE: first found tuner source pad presumed correct */
 764		pad_source = media_get_pad_index(tuner, MEDIA_PAD_FL_SOURCE,
 765						 PAD_SIGNAL_ANALOG);
 766		if (pad_source < 0)
 767			return -EINVAL;
 768		ret = media_create_pad_links(mdev,
 769					     MEDIA_ENT_F_TUNER,
 770					     tuner, pad_source,
 771					     MEDIA_ENT_F_DTV_DEMOD,
 772					     demod, 0, MEDIA_LNK_FL_ENABLED,
 773					     false);
 774		if (ret)
 775			return ret;
 776	}
 777
 778	if (ndemod && demux) {
 779		ret = media_create_pad_links(mdev,
 780					     MEDIA_ENT_F_DTV_DEMOD,
 781					     demod, 1,
 782					     MEDIA_ENT_F_TS_DEMUX,
 783					     demux, 0, MEDIA_LNK_FL_ENABLED,
 784					     false);
 785		if (ret)
 786			return ret;
 787	}
 788	if (demux && ca) {
 789		ret = media_create_pad_link(demux, 1, ca,
 790					    0, MEDIA_LNK_FL_ENABLED);
 791		if (ret)
 792			return ret;
 793	}
 794
 795	/* Create demux links for each ringbuffer/pad */
 796	if (demux) {
 797		media_device_for_each_entity(entity, mdev) {
 798			if (entity->function == MEDIA_ENT_F_IO_DTV) {
 799				if (!strncmp(entity->name, DVR_TSOUT,
 800					     strlen(DVR_TSOUT))) {
 801					ret = media_create_pad_link(demux,
 802								    ++dvr_pad,
 803								    entity, 0, 0);
 804					if (ret)
 805						return ret;
 806				}
 807				if (!strncmp(entity->name, DEMUX_TSOUT,
 808					     strlen(DEMUX_TSOUT))) {
 809					ret = media_create_pad_link(demux,
 810								    ++demux_pad,
 811								    entity, 0, 0);
 812					if (ret)
 813						return ret;
 814				}
 815			}
 816		}
 817	}
 818
 819	/* Create interface links for FE->tuner, DVR->demux and CA->ca */
 820	media_device_for_each_intf(intf, mdev) {
 821		if (intf->type == MEDIA_INTF_T_DVB_CA && ca) {
 822			link = media_create_intf_link(ca, intf,
 823						      MEDIA_LNK_FL_ENABLED |
 824						      MEDIA_LNK_FL_IMMUTABLE);
 825			if (!link)
 826				return -ENOMEM;
 827		}
 828
 829		if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) {
 830			link = media_create_intf_link(tuner, intf,
 831						      MEDIA_LNK_FL_ENABLED |
 832						      MEDIA_LNK_FL_IMMUTABLE);
 833			if (!link)
 834				return -ENOMEM;
 835		}
 836#if 0
 837		/*
 838		 * Indirect link - let's not create yet, as we don't know how
 839		 *		   to handle indirect links, nor if this will
 840		 *		   actually be needed.
 841		 */
 842		if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) {
 843			link = media_create_intf_link(demux, intf,
 844						      MEDIA_LNK_FL_ENABLED |
 845						      MEDIA_LNK_FL_IMMUTABLE);
 846			if (!link)
 847				return -ENOMEM;
 848		}
 849#endif
 850		if (intf->type == MEDIA_INTF_T_DVB_DVR) {
 851			ret = dvb_create_io_intf_links(adap, intf, DVR_TSOUT);
 852			if (ret)
 853				return ret;
 854		}
 855		if (intf->type == MEDIA_INTF_T_DVB_DEMUX) {
 856			ret = dvb_create_io_intf_links(adap, intf, DEMUX_TSOUT);
 857			if (ret)
 858				return ret;
 859		}
 860	}
 861	return 0;
 862}
 863EXPORT_SYMBOL_GPL(dvb_create_media_graph);
 864#endif
 865
 866static int dvbdev_check_free_adapter_num(int num)
 867{
 868	struct list_head *entry;
 869
 870	list_for_each(entry, &dvb_adapter_list) {
 871		struct dvb_adapter *adap;
 872
 873		adap = list_entry(entry, struct dvb_adapter, list_head);
 874		if (adap->num == num)
 875			return 0;
 876	}
 877	return 1;
 878}
 879
 880static int dvbdev_get_free_adapter_num(void)
 881{
 882	int num = 0;
 883
 884	while (num < DVB_MAX_ADAPTERS) {
 885		if (dvbdev_check_free_adapter_num(num))
 886			return num;
 887		num++;
 888	}
 889
 890	return -ENFILE;
 891}
 892
 
 893int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
 894			 struct module *module, struct device *device,
 895			 short *adapter_nums)
 896{
 897	int i, num;
 898
 899	mutex_lock(&dvbdev_register_lock);
 900
 901	for (i = 0; i < DVB_MAX_ADAPTERS; ++i) {
 902		num = adapter_nums[i];
 903		if (num >= 0  &&  num < DVB_MAX_ADAPTERS) {
 904		/* use the one the driver asked for */
 905			if (dvbdev_check_free_adapter_num(num))
 906				break;
 907		} else {
 908			num = dvbdev_get_free_adapter_num();
 909			break;
 910		}
 911		num = -1;
 912	}
 913
 914	if (num < 0) {
 915		mutex_unlock(&dvbdev_register_lock);
 916		return -ENFILE;
 917	}
 918
 919	memset(adap, 0, sizeof(struct dvb_adapter));
 920	INIT_LIST_HEAD(&adap->device_list);
 921
 922	pr_info("DVB: registering new adapter (%s)\n", name);
 923
 924	adap->num = num;
 925	adap->name = name;
 926	adap->module = module;
 927	adap->device = device;
 928	adap->mfe_shared = 0;
 929	adap->mfe_dvbdev = NULL;
 930	mutex_init(&adap->mfe_lock);
 931
 932#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 933	mutex_init(&adap->mdev_lock);
 934#endif
 935
 936	list_add_tail(&adap->list_head, &dvb_adapter_list);
 937
 938	mutex_unlock(&dvbdev_register_lock);
 939
 940	return num;
 941}
 942EXPORT_SYMBOL(dvb_register_adapter);
 943
 
 944int dvb_unregister_adapter(struct dvb_adapter *adap)
 945{
 946	mutex_lock(&dvbdev_register_lock);
 947	list_del(&adap->list_head);
 948	mutex_unlock(&dvbdev_register_lock);
 949	return 0;
 950}
 951EXPORT_SYMBOL(dvb_unregister_adapter);
 952
 953/*
 954 * if the miracle happens and "generic_usercopy()" is included into
 955 * the kernel, then this can vanish. please don't make the mistake and
 956 * define this as video_usercopy(). this will introduce a dependency
 957 * to the v4l "videodev.o" module, which is unnecessary for some
 958 * cards (ie. the budget dvb-cards don't need the v4l module...)
 959 */
 960int dvb_usercopy(struct file *file,
 961		 unsigned int cmd, unsigned long arg,
 962		 int (*func)(struct file *file,
 963			     unsigned int cmd, void *arg))
 964{
 965	char    sbuf[128] = {};
 966	void    *mbuf = NULL;
 967	void    *parg = NULL;
 968	int     err  = -EINVAL;
 969
 970	/*  Copy arguments into temp kernel buffer  */
 971	switch (_IOC_DIR(cmd)) {
 972	case _IOC_NONE:
 973		/*
 974		 * For this command, the pointer is actually an integer
 975		 * argument.
 976		 */
 977		parg = (void *)arg;
 978		break;
 979	case _IOC_READ: /* some v4l ioctls are marked wrong ... */
 980	case _IOC_WRITE:
 981	case (_IOC_WRITE | _IOC_READ):
 982		if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
 983			parg = sbuf;
 984		} else {
 985			/* too big to allocate from stack */
 986			mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
 987			if (!mbuf)
 988				return -ENOMEM;
 989			parg = mbuf;
 990		}
 991
 992		err = -EFAULT;
 993		if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
 994			goto out;
 995		break;
 996	}
 997
 998	/* call driver */
 999	err = func(file, cmd, parg);
1000	if (err == -ENOIOCTLCMD)
1001		err = -ENOTTY;
1002
1003	if (err < 0)
1004		goto out;
1005
1006	/*  Copy results into user buffer  */
1007	switch (_IOC_DIR(cmd)) {
 
1008	case _IOC_READ:
1009	case (_IOC_WRITE | _IOC_READ):
1010		if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
1011			err = -EFAULT;
1012		break;
1013	}
1014
1015out:
1016	kfree(mbuf);
1017	return err;
1018}
1019
1020#if IS_ENABLED(CONFIG_I2C)
1021struct i2c_client *dvb_module_probe(const char *module_name,
1022				    const char *name,
1023				    struct i2c_adapter *adap,
1024				    unsigned char addr,
1025				    void *platform_data)
1026{
1027	struct i2c_client *client;
1028	struct i2c_board_info *board_info;
1029
1030	board_info = kzalloc(sizeof(*board_info), GFP_KERNEL);
1031	if (!board_info)
1032		return NULL;
1033
1034	if (name)
1035		strscpy(board_info->type, name, I2C_NAME_SIZE);
1036	else
1037		strscpy(board_info->type, module_name, I2C_NAME_SIZE);
1038
1039	board_info->addr = addr;
1040	board_info->platform_data = platform_data;
1041	request_module(module_name);
1042	client = i2c_new_client_device(adap, board_info);
1043	if (!i2c_client_has_driver(client)) {
1044		kfree(board_info);
1045		return NULL;
1046	}
1047
1048	if (!try_module_get(client->dev.driver->owner)) {
1049		i2c_unregister_device(client);
1050		client = NULL;
1051	}
1052
1053	kfree(board_info);
1054	return client;
1055}
1056EXPORT_SYMBOL_GPL(dvb_module_probe);
1057
1058void dvb_module_release(struct i2c_client *client)
1059{
1060	if (!client)
1061		return;
1062
1063	module_put(client->dev.driver->owner);
1064	i2c_unregister_device(client);
1065}
1066EXPORT_SYMBOL_GPL(dvb_module_release);
1067#endif
1068
1069static int dvb_uevent(const struct device *dev, struct kobj_uevent_env *env)
1070{
1071	const struct dvb_device *dvbdev = dev_get_drvdata(dev);
1072
1073	add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num);
1074	add_uevent_var(env, "DVB_DEVICE_TYPE=%s", dnames[dvbdev->type]);
1075	add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id);
1076	return 0;
1077}
1078
1079static char *dvb_devnode(const struct device *dev, umode_t *mode)
1080{
1081	const struct dvb_device *dvbdev = dev_get_drvdata(dev);
1082
1083	return kasprintf(GFP_KERNEL, "dvb/adapter%d/%s%d",
1084		dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id);
1085}
1086
 
1087static int __init init_dvbdev(void)
1088{
1089	int retval;
1090	dev_t dev = MKDEV(DVB_MAJOR, 0);
1091
1092	retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB");
1093	if (retval != 0) {
1094		pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
1095		return retval;
1096	}
1097
1098	cdev_init(&dvb_device_cdev, &dvb_device_fops);
1099	retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS);
1100	if (retval != 0) {
1101		pr_err("dvb-core: unable register character device\n");
1102		goto error;
1103	}
1104
1105	dvb_class = class_create("dvb");
1106	if (IS_ERR(dvb_class)) {
1107		retval = PTR_ERR(dvb_class);
1108		goto error;
1109	}
1110	dvb_class->dev_uevent = dvb_uevent;
1111	dvb_class->devnode = dvb_devnode;
1112	return 0;
1113
1114error:
1115	cdev_del(&dvb_device_cdev);
1116	unregister_chrdev_region(dev, MAX_DVB_MINORS);
1117	return retval;
1118}
1119
 
1120static void __exit exit_dvbdev(void)
1121{
1122	struct dvbdevfops_node *node, *next;
1123
1124	class_destroy(dvb_class);
1125	cdev_del(&dvb_device_cdev);
1126	unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
1127
1128	list_for_each_entry_safe(node, next, &dvbdevfops_list, list_head) {
1129		list_del(&node->list_head);
1130		kfree(node->fops);
1131		kfree(node);
1132	}
1133}
1134
1135subsys_initcall(init_dvbdev);
1136module_exit(exit_dvbdev);
1137
1138MODULE_DESCRIPTION("DVB Core Driver");
1139MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler");
1140MODULE_LICENSE("GPL");
v6.2
   1// SPDX-License-Identifier: LGPL-2.1-or-later
   2/*
   3 * dvbdev.c
   4 *
   5 * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
   6 *                  & Marcus Metzler <marcus@convergence.de>
   7 *                    for convergence integrated media GmbH
   8 */
   9
  10#define pr_fmt(fmt) "dvbdev: " fmt
  11
  12#include <linux/types.h>
  13#include <linux/errno.h>
  14#include <linux/string.h>
  15#include <linux/module.h>
  16#include <linux/kernel.h>
  17#include <linux/i2c.h>
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/device.h>
  21#include <linux/fs.h>
  22#include <linux/cdev.h>
  23#include <linux/mutex.h>
  24#include <media/dvbdev.h>
  25
  26/* Due to enum tuner_pad_index */
  27#include <media/tuner.h>
  28
  29static DEFINE_MUTEX(dvbdev_mutex);
 
  30static int dvbdev_debug;
  31
  32module_param(dvbdev_debug, int, 0644);
  33MODULE_PARM_DESC(dvbdev_debug, "Turn on/off device debugging (default:off).");
  34
  35#define dprintk(fmt, arg...) do {					\
  36	if (dvbdev_debug)						\
  37		printk(KERN_DEBUG pr_fmt("%s: " fmt),			\
  38		       __func__, ##arg);				\
  39} while (0)
  40
  41static LIST_HEAD(dvb_adapter_list);
  42static DEFINE_MUTEX(dvbdev_register_lock);
  43
  44static const char * const dnames[] = {
  45	[DVB_DEVICE_VIDEO] =		"video",
  46	[DVB_DEVICE_AUDIO] =		"audio",
  47	[DVB_DEVICE_SEC] =		"sec",
  48	[DVB_DEVICE_FRONTEND] =		"frontend",
  49	[DVB_DEVICE_DEMUX] =		"demux",
  50	[DVB_DEVICE_DVR] =		"dvr",
  51	[DVB_DEVICE_CA] =		"ca",
  52	[DVB_DEVICE_NET] =		"net",
  53	[DVB_DEVICE_OSD] =		"osd"
  54};
  55
  56#ifdef CONFIG_DVB_DYNAMIC_MINORS
  57#define MAX_DVB_MINORS		256
  58#define DVB_MAX_IDS		MAX_DVB_MINORS
  59#else
  60#define DVB_MAX_IDS		4
  61
  62static const u8 minor_type[] = {
  63       [DVB_DEVICE_VIDEO]      = 0,
  64       [DVB_DEVICE_AUDIO]      = 1,
  65       [DVB_DEVICE_SEC]        = 2,
  66       [DVB_DEVICE_FRONTEND]   = 3,
  67       [DVB_DEVICE_DEMUX]      = 4,
  68       [DVB_DEVICE_DVR]        = 5,
  69       [DVB_DEVICE_CA]         = 6,
  70       [DVB_DEVICE_NET]        = 7,
  71       [DVB_DEVICE_OSD]        = 8,
  72};
  73
  74#define nums2minor(num, type, id) \
  75       (((num) << 6) | ((id) << 4) | minor_type[type])
  76
  77#define MAX_DVB_MINORS		(DVB_MAX_ADAPTERS*64)
  78#endif
  79
  80static struct class *dvb_class;
  81
  82static struct dvb_device *dvb_minors[MAX_DVB_MINORS];
  83static DECLARE_RWSEM(minor_rwsem);
  84
  85static int dvb_device_open(struct inode *inode, struct file *file)
  86{
  87	struct dvb_device *dvbdev;
 
 
 
 
  88
  89	mutex_lock(&dvbdev_mutex);
  90	down_read(&minor_rwsem);
  91	dvbdev = dvb_minors[iminor(inode)];
 
  92
  93	if (dvbdev && dvbdev->fops) {
  94		int err = 0;
  95		const struct file_operations *new_fops;
  96
  97		new_fops = fops_get(dvbdev->fops);
  98		if (!new_fops)
  99			goto fail;
 100		file->private_data = dvb_device_get(dvbdev);
 101		replace_fops(file, new_fops);
 102		if (file->f_op->open)
 103			err = file->f_op->open(inode, file);
 104		up_read(&minor_rwsem);
 105		mutex_unlock(&dvbdev_mutex);
 
 
 106		return err;
 107	}
 108fail:
 109	up_read(&minor_rwsem);
 110	mutex_unlock(&dvbdev_mutex);
 111	return -ENODEV;
 112}
 113
 114
 115static const struct file_operations dvb_device_fops =
 116{
 117	.owner =	THIS_MODULE,
 118	.open =		dvb_device_open,
 119	.llseek =	noop_llseek,
 120};
 121
 122static struct cdev dvb_device_cdev;
 123
 124int dvb_generic_open(struct inode *inode, struct file *file)
 125{
 126	struct dvb_device *dvbdev = file->private_data;
 127
 128	if (!dvbdev)
 129		return -ENODEV;
 130
 131	if (!dvbdev->users)
 132		return -EBUSY;
 133
 134	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
 135		if (!dvbdev->readers)
 136			return -EBUSY;
 137		dvbdev->readers--;
 138	} else {
 139		if (!dvbdev->writers)
 140			return -EBUSY;
 141		dvbdev->writers--;
 142	}
 143
 144	dvbdev->users--;
 145	return 0;
 146}
 147EXPORT_SYMBOL(dvb_generic_open);
 148
 149
 150int dvb_generic_release(struct inode *inode, struct file *file)
 151{
 152	struct dvb_device *dvbdev = file->private_data;
 153
 154	if (!dvbdev)
 155		return -ENODEV;
 156
 157	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {
 158		dvbdev->readers++;
 159	} else {
 160		dvbdev->writers++;
 161	}
 162
 163	dvbdev->users++;
 164
 165	dvb_device_put(dvbdev);
 166
 167	return 0;
 168}
 169EXPORT_SYMBOL(dvb_generic_release);
 170
 171
 172long dvb_generic_ioctl(struct file *file,
 173		       unsigned int cmd, unsigned long arg)
 174{
 175	struct dvb_device *dvbdev = file->private_data;
 176
 177	if (!dvbdev)
 178		return -ENODEV;
 179
 180	if (!dvbdev->kernel_ioctl)
 181		return -EINVAL;
 182
 183	return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl);
 184}
 185EXPORT_SYMBOL(dvb_generic_ioctl);
 186
 187
 188static int dvbdev_get_free_id (struct dvb_adapter *adap, int type)
 189{
 190	u32 id = 0;
 191
 192	while (id < DVB_MAX_IDS) {
 193		struct dvb_device *dev;
 
 194		list_for_each_entry(dev, &adap->device_list, list_head)
 195			if (dev->type == type && dev->id == id)
 196				goto skip;
 197		return id;
 198skip:
 199		id++;
 200	}
 201	return -ENFILE;
 202}
 203
 204static void dvb_media_device_free(struct dvb_device *dvbdev)
 205{
 206#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 207	if (dvbdev->entity) {
 208		media_device_unregister_entity(dvbdev->entity);
 209		kfree(dvbdev->entity);
 210		kfree(dvbdev->pads);
 211		dvbdev->entity = NULL;
 212		dvbdev->pads = NULL;
 213	}
 214
 215	if (dvbdev->tsout_entity) {
 216		int i;
 217
 218		for (i = 0; i < dvbdev->tsout_num_entities; i++) {
 219			media_device_unregister_entity(&dvbdev->tsout_entity[i]);
 220			kfree(dvbdev->tsout_entity[i].name);
 221		}
 222		kfree(dvbdev->tsout_entity);
 223		kfree(dvbdev->tsout_pads);
 224		dvbdev->tsout_entity = NULL;
 225		dvbdev->tsout_pads = NULL;
 226
 227		dvbdev->tsout_num_entities = 0;
 228	}
 229
 230	if (dvbdev->intf_devnode) {
 231		media_devnode_remove(dvbdev->intf_devnode);
 232		dvbdev->intf_devnode = NULL;
 233	}
 234
 235	if (dvbdev->adapter->conn) {
 236		media_device_unregister_entity(dvbdev->adapter->conn);
 237		kfree(dvbdev->adapter->conn);
 238		dvbdev->adapter->conn = NULL;
 239		kfree(dvbdev->adapter->conn_pads);
 240		dvbdev->adapter->conn_pads = NULL;
 241	}
 242#endif
 243}
 244
 245#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 246static int dvb_create_tsout_entity(struct dvb_device *dvbdev,
 247				    const char *name, int npads)
 248{
 249	int i;
 250
 251	dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads),
 252				     GFP_KERNEL);
 253	if (!dvbdev->tsout_pads)
 254		return -ENOMEM;
 255
 256	dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity),
 257				       GFP_KERNEL);
 258	if (!dvbdev->tsout_entity)
 259		return -ENOMEM;
 260
 261	dvbdev->tsout_num_entities = npads;
 262
 263	for (i = 0; i < npads; i++) {
 264		struct media_pad *pads = &dvbdev->tsout_pads[i];
 265		struct media_entity *entity = &dvbdev->tsout_entity[i];
 266		int ret;
 267
 268		entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i);
 269		if (!entity->name)
 270			return -ENOMEM;
 271
 272		entity->function = MEDIA_ENT_F_IO_DTV;
 273		pads->flags = MEDIA_PAD_FL_SINK;
 274
 275		ret = media_entity_pads_init(entity, 1, pads);
 276		if (ret < 0)
 277			return ret;
 278
 279		ret = media_device_register_entity(dvbdev->adapter->mdev,
 280						   entity);
 281		if (ret < 0)
 282			return ret;
 283	}
 284	return 0;
 285}
 286
 287#define DEMUX_TSOUT	"demux-tsout"
 288#define DVR_TSOUT	"dvr-tsout"
 289
 290static int dvb_create_media_entity(struct dvb_device *dvbdev,
 291				   int type, int demux_sink_pads)
 292{
 293	int i, ret, npads;
 294
 295	switch (type) {
 296	case DVB_DEVICE_FRONTEND:
 297		npads = 2;
 298		break;
 299	case DVB_DEVICE_DVR:
 300		ret = dvb_create_tsout_entity(dvbdev, DVR_TSOUT,
 301					      demux_sink_pads);
 302		return ret;
 303	case DVB_DEVICE_DEMUX:
 304		npads = 1 + demux_sink_pads;
 305		ret = dvb_create_tsout_entity(dvbdev, DEMUX_TSOUT,
 306					      demux_sink_pads);
 307		if (ret < 0)
 308			return ret;
 309		break;
 310	case DVB_DEVICE_CA:
 311		npads = 2;
 312		break;
 313	case DVB_DEVICE_NET:
 314		/*
 315		 * We should be creating entities for the MPE/ULE
 316		 * decapsulation hardware (or software implementation).
 317		 *
 318		 * However, the number of for the MPE/ULE decaps may not be
 319		 * fixed. As we don't have yet dynamic support for PADs at
 320		 * the Media Controller, let's not create the decap
 321		 * entities yet.
 322		 */
 323		return 0;
 324	default:
 325		return 0;
 326	}
 327
 328	dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
 329	if (!dvbdev->entity)
 330		return -ENOMEM;
 331
 332	dvbdev->entity->name = dvbdev->name;
 333
 334	if (npads) {
 335		dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
 336				       GFP_KERNEL);
 337		if (!dvbdev->pads) {
 338			kfree(dvbdev->entity);
 339			dvbdev->entity = NULL;
 340			return -ENOMEM;
 341		}
 342	}
 343
 344	switch (type) {
 345	case DVB_DEVICE_FRONTEND:
 346		dvbdev->entity->function = MEDIA_ENT_F_DTV_DEMOD;
 347		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 348		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
 349		break;
 350	case DVB_DEVICE_DEMUX:
 351		dvbdev->entity->function = MEDIA_ENT_F_TS_DEMUX;
 352		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 353		for (i = 1; i < npads; i++)
 354			dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE;
 355		break;
 356	case DVB_DEVICE_CA:
 357		dvbdev->entity->function = MEDIA_ENT_F_DTV_CA;
 358		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
 359		dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE;
 360		break;
 361	default:
 362		/* Should never happen, as the first switch prevents it */
 363		kfree(dvbdev->entity);
 364		kfree(dvbdev->pads);
 365		dvbdev->entity = NULL;
 366		dvbdev->pads = NULL;
 367		return 0;
 368	}
 369
 370	if (npads) {
 371		ret = media_entity_pads_init(dvbdev->entity, npads, dvbdev->pads);
 372		if (ret)
 373			return ret;
 374	}
 375	ret = media_device_register_entity(dvbdev->adapter->mdev,
 376					   dvbdev->entity);
 377	if (ret)
 378		return ret;
 379
 380	pr_info("%s: media entity '%s' registered.\n",
 381		__func__, dvbdev->entity->name);
 382
 383	return 0;
 384}
 385#endif
 386
 387static int dvb_register_media_device(struct dvb_device *dvbdev,
 388				     int type, int minor,
 389				     unsigned demux_sink_pads)
 390{
 391#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
 392	struct media_link *link;
 393	u32 intf_type;
 394	int ret;
 395
 396	if (!dvbdev->adapter->mdev)
 397		return 0;
 398
 399	ret = dvb_create_media_entity(dvbdev, type, demux_sink_pads);
 400	if (ret)
 401		return ret;
 402
 403	switch (type) {
 404	case DVB_DEVICE_FRONTEND:
 405		intf_type = MEDIA_INTF_T_DVB_FE;
 406		break;
 407	case DVB_DEVICE_DEMUX:
 408		intf_type = MEDIA_INTF_T_DVB_DEMUX;
 409		break;
 410	case DVB_DEVICE_DVR:
 411		intf_type = MEDIA_INTF_T_DVB_DVR;
 412		break;
 413	case DVB_DEVICE_CA:
 414		intf_type = MEDIA_INTF_T_DVB_CA;
 415		break;
 416	case DVB_DEVICE_NET:
 417		intf_type = MEDIA_INTF_T_DVB_NET;
 418		break;
 419	default:
 420		return 0;
 421	}
 422
 423	dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev,
 424						    intf_type, 0,
 425						    DVB_MAJOR, minor);
 426
 427	if (!dvbdev->intf_devnode)
 428		return -ENOMEM;
 429
 430	/*
 431	 * Create the "obvious" link, e. g. the ones that represent
 432	 * a direct association between an interface and an entity.
 433	 * Other links should be created elsewhere, like:
 434	 *		DVB FE intf    -> tuner
 435	 *		DVB demux intf -> dvr
 436	 */
 437
 438	if (!dvbdev->entity)
 439		return 0;
 440
 441	link = media_create_intf_link(dvbdev->entity,
 442				      &dvbdev->intf_devnode->intf,
 443				      MEDIA_LNK_FL_ENABLED |
 444				      MEDIA_LNK_FL_IMMUTABLE);
 445	if (!link)
 446		return -ENOMEM;
 447#endif
 448	return 0;
 449}
 450
 451int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 452			const struct dvb_device *template, void *priv,
 453			enum dvb_device_type type, int demux_sink_pads)
 454{
 455	struct dvb_device *dvbdev;
 456	struct file_operations *dvbdevfops;
 
 457	struct device *clsdev;
 458	int minor;
 459	int id, ret;
 460
 461	mutex_lock(&dvbdev_register_lock);
 462
 463	if ((id = dvbdev_get_free_id (adap, type)) < 0){
 
 464		mutex_unlock(&dvbdev_register_lock);
 465		*pdvbdev = NULL;
 466		pr_err("%s: couldn't find free device id\n", __func__);
 467		return -ENFILE;
 468	}
 469
 470	*pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
 471
 472	if (!dvbdev){
 473		mutex_unlock(&dvbdev_register_lock);
 474		return -ENOMEM;
 475	}
 476
 477	dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 478
 479	if (!dvbdevfops){
 480		kfree (dvbdev);
 481		mutex_unlock(&dvbdev_register_lock);
 482		return -ENOMEM;
 483	}
 484
 485	memcpy(dvbdev, template, sizeof(struct dvb_device));
 486	kref_init(&dvbdev->ref);
 487	dvbdev->type = type;
 488	dvbdev->id = id;
 489	dvbdev->adapter = adap;
 490	dvbdev->priv = priv;
 491	dvbdev->fops = dvbdevfops;
 492	init_waitqueue_head (&dvbdev->wait_queue);
 493
 494	dvbdevfops->owner = adap->module;
 495
 496	list_add_tail (&dvbdev->list_head, &adap->device_list);
 497
 498	down_write(&minor_rwsem);
 499#ifdef CONFIG_DVB_DYNAMIC_MINORS
 500	for (minor = 0; minor < MAX_DVB_MINORS; minor++)
 501		if (dvb_minors[minor] == NULL)
 502			break;
 503
 504	if (minor == MAX_DVB_MINORS) {
 505		list_del (&dvbdev->list_head);
 506		kfree(dvbdevfops);
 
 
 
 
 
 
 507		kfree(dvbdev);
 
 508		up_write(&minor_rwsem);
 509		mutex_unlock(&dvbdev_register_lock);
 510		return -EINVAL;
 511	}
 512#else
 513	minor = nums2minor(adap->num, type, id);
 514#endif
 515
 516	dvbdev->minor = minor;
 517	dvb_minors[minor] = dvb_device_get(dvbdev);
 518	up_write(&minor_rwsem);
 519
 520	ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
 521	if (ret) {
 522		pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
 523		      __func__);
 524
 
 
 
 
 525		dvb_media_device_free(dvbdev);
 526		list_del (&dvbdev->list_head);
 527		kfree(dvbdevfops);
 528		kfree(dvbdev);
 
 529		mutex_unlock(&dvbdev_register_lock);
 530		return ret;
 531	}
 532
 533	mutex_unlock(&dvbdev_register_lock);
 534
 535	clsdev = device_create(dvb_class, adap->device,
 536			       MKDEV(DVB_MAJOR, minor),
 537			       dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
 538	if (IS_ERR(clsdev)) {
 539		pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
 540		       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
 
 
 
 
 
 541		dvb_media_device_free(dvbdev);
 542		list_del (&dvbdev->list_head);
 543		kfree(dvbdevfops);
 544		kfree(dvbdev);
 
 
 545		return PTR_ERR(clsdev);
 546	}
 
 547	dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
 548		adap->num, dnames[type], id, minor, minor);
 549
 
 550	return 0;
 551}
 552EXPORT_SYMBOL(dvb_register_device);
 553
 554
 555void dvb_remove_device(struct dvb_device *dvbdev)
 556{
 557	if (!dvbdev)
 558		return;
 559
 560	down_write(&minor_rwsem);
 561	dvb_minors[dvbdev->minor] = NULL;
 562	dvb_device_put(dvbdev);
 563	up_write(&minor_rwsem);
 564
 565	dvb_media_device_free(dvbdev);
 566
 567	device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor));
 568
 569	list_del (&dvbdev->list_head);
 570}
 571EXPORT_SYMBOL(dvb_remove_device);
 572
 573
 574static void dvb_free_device(struct kref *ref)
 575{
 576	struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
 577
 578	kfree (dvbdev->fops);
 579	kfree (dvbdev);
 580}
 581
 582
 583struct dvb_device *dvb_device_get(struct dvb_device *dvbdev)
 584{
 585	kref_get(&dvbdev->ref);
 586	return dvbdev;
 587}
 588EXPORT_SYMBOL(dvb_device_get);
 589
 590
 591void dvb_device_put(struct dvb_device *dvbdev)
 592{
 593	if (dvbdev)
 594		kref_put(&dvbdev->ref, dvb_free_device);
 595}
 596
 597
 598void dvb_unregister_device(struct dvb_device *dvbdev)
 599{
 600	dvb_remove_device(dvbdev);
 601	dvb_device_put(dvbdev);
 602}
 603EXPORT_SYMBOL(dvb_unregister_device);
 604
 605
 606#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 607
 608static int dvb_create_io_intf_links(struct dvb_adapter *adap,
 609				    struct media_interface *intf,
 610				    char *name)
 611{
 612	struct media_device *mdev = adap->mdev;
 613	struct media_entity *entity;
 614	struct media_link *link;
 615
 616	media_device_for_each_entity(entity, mdev) {
 617		if (entity->function == MEDIA_ENT_F_IO_DTV) {
 618			if (strncmp(entity->name, name, strlen(name)))
 619				continue;
 620			link = media_create_intf_link(entity, intf,
 621						      MEDIA_LNK_FL_ENABLED |
 622						      MEDIA_LNK_FL_IMMUTABLE);
 623			if (!link)
 624				return -ENOMEM;
 625		}
 626	}
 627	return 0;
 628}
 629
 630int dvb_create_media_graph(struct dvb_adapter *adap,
 631			   bool create_rf_connector)
 632{
 633	struct media_device *mdev = adap->mdev;
 634	struct media_entity *entity, *tuner = NULL, *demod = NULL, *conn;
 635	struct media_entity *demux = NULL, *ca = NULL;
 636	struct media_link *link;
 637	struct media_interface *intf;
 638	unsigned demux_pad = 0;
 639	unsigned dvr_pad = 0;
 640	unsigned ntuner = 0, ndemod = 0;
 641	int ret, pad_source, pad_sink;
 642	static const char *connector_name = "Television";
 643
 644	if (!mdev)
 645		return 0;
 646
 647	media_device_for_each_entity(entity, mdev) {
 648		switch (entity->function) {
 649		case MEDIA_ENT_F_TUNER:
 650			tuner = entity;
 651			ntuner++;
 652			break;
 653		case MEDIA_ENT_F_DTV_DEMOD:
 654			demod = entity;
 655			ndemod++;
 656			break;
 657		case MEDIA_ENT_F_TS_DEMUX:
 658			demux = entity;
 659			break;
 660		case MEDIA_ENT_F_DTV_CA:
 661			ca = entity;
 662			break;
 663		}
 664	}
 665
 666	/*
 667	 * Prepare to signalize to media_create_pad_links() that multiple
 668	 * entities of the same type exists and a 1:n or n:1 links need to be
 669	 * created.
 670	 * NOTE: if both tuner and demod have multiple instances, it is up
 671	 * to the caller driver to create such links.
 672	 */
 673	if (ntuner > 1)
 674		tuner = NULL;
 675	if (ndemod > 1)
 676		demod = NULL;
 677
 678	if (create_rf_connector) {
 679		conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 680		if (!conn)
 681			return -ENOMEM;
 682		adap->conn = conn;
 683
 684		adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL);
 685		if (!adap->conn_pads)
 686			return -ENOMEM;
 687
 688		conn->flags = MEDIA_ENT_FL_CONNECTOR;
 689		conn->function = MEDIA_ENT_F_CONN_RF;
 690		conn->name = connector_name;
 691		adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE;
 692
 693		ret = media_entity_pads_init(conn, 1, adap->conn_pads);
 694		if (ret)
 695			return ret;
 696
 697		ret = media_device_register_entity(mdev, conn);
 698		if (ret)
 699			return ret;
 700
 701		if (!ntuner) {
 702			ret = media_create_pad_links(mdev,
 703						     MEDIA_ENT_F_CONN_RF,
 704						     conn, 0,
 705						     MEDIA_ENT_F_DTV_DEMOD,
 706						     demod, 0,
 707						     MEDIA_LNK_FL_ENABLED,
 708						     false);
 709		} else {
 710			pad_sink = media_get_pad_index(tuner, true,
 711						       PAD_SIGNAL_ANALOG);
 712			if (pad_sink < 0)
 713				return -EINVAL;
 714			ret = media_create_pad_links(mdev,
 715						     MEDIA_ENT_F_CONN_RF,
 716						     conn, 0,
 717						     MEDIA_ENT_F_TUNER,
 718						     tuner, pad_sink,
 719						     MEDIA_LNK_FL_ENABLED,
 720						     false);
 721		}
 722		if (ret)
 723			return ret;
 724	}
 725
 726	if (ntuner && ndemod) {
 727		/* NOTE: first found tuner source pad presumed correct */
 728		pad_source = media_get_pad_index(tuner, false,
 729						 PAD_SIGNAL_ANALOG);
 730		if (pad_source < 0)
 731			return -EINVAL;
 732		ret = media_create_pad_links(mdev,
 733					     MEDIA_ENT_F_TUNER,
 734					     tuner, pad_source,
 735					     MEDIA_ENT_F_DTV_DEMOD,
 736					     demod, 0, MEDIA_LNK_FL_ENABLED,
 737					     false);
 738		if (ret)
 739			return ret;
 740	}
 741
 742	if (ndemod && demux) {
 743		ret = media_create_pad_links(mdev,
 744					     MEDIA_ENT_F_DTV_DEMOD,
 745					     demod, 1,
 746					     MEDIA_ENT_F_TS_DEMUX,
 747					     demux, 0, MEDIA_LNK_FL_ENABLED,
 748					     false);
 749		if (ret)
 750			return ret;
 751	}
 752	if (demux && ca) {
 753		ret = media_create_pad_link(demux, 1, ca,
 754					    0, MEDIA_LNK_FL_ENABLED);
 755		if (ret)
 756			return ret;
 757	}
 758
 759	/* Create demux links for each ringbuffer/pad */
 760	if (demux) {
 761		media_device_for_each_entity(entity, mdev) {
 762			if (entity->function == MEDIA_ENT_F_IO_DTV) {
 763				if (!strncmp(entity->name, DVR_TSOUT,
 764				    strlen(DVR_TSOUT))) {
 765					ret = media_create_pad_link(demux,
 766								++dvr_pad,
 767							    entity, 0, 0);
 768					if (ret)
 769						return ret;
 770				}
 771				if (!strncmp(entity->name, DEMUX_TSOUT,
 772				    strlen(DEMUX_TSOUT))) {
 773					ret = media_create_pad_link(demux,
 774							      ++demux_pad,
 775							    entity, 0, 0);
 776					if (ret)
 777						return ret;
 778				}
 779			}
 780		}
 781	}
 782
 783	/* Create interface links for FE->tuner, DVR->demux and CA->ca */
 784	media_device_for_each_intf(intf, mdev) {
 785		if (intf->type == MEDIA_INTF_T_DVB_CA && ca) {
 786			link = media_create_intf_link(ca, intf,
 787						      MEDIA_LNK_FL_ENABLED |
 788						      MEDIA_LNK_FL_IMMUTABLE);
 789			if (!link)
 790				return -ENOMEM;
 791		}
 792
 793		if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) {
 794			link = media_create_intf_link(tuner, intf,
 795						      MEDIA_LNK_FL_ENABLED |
 796						      MEDIA_LNK_FL_IMMUTABLE);
 797			if (!link)
 798				return -ENOMEM;
 799		}
 800#if 0
 801		/*
 802		 * Indirect link - let's not create yet, as we don't know how
 803		 *		   to handle indirect links, nor if this will
 804		 *		   actually be needed.
 805		 */
 806		if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) {
 807			link = media_create_intf_link(demux, intf,
 808						      MEDIA_LNK_FL_ENABLED |
 809						      MEDIA_LNK_FL_IMMUTABLE);
 810			if (!link)
 811				return -ENOMEM;
 812		}
 813#endif
 814		if (intf->type == MEDIA_INTF_T_DVB_DVR) {
 815			ret = dvb_create_io_intf_links(adap, intf, DVR_TSOUT);
 816			if (ret)
 817				return ret;
 818		}
 819		if (intf->type == MEDIA_INTF_T_DVB_DEMUX) {
 820			ret = dvb_create_io_intf_links(adap, intf, DEMUX_TSOUT);
 821			if (ret)
 822				return ret;
 823		}
 824	}
 825	return 0;
 826}
 827EXPORT_SYMBOL_GPL(dvb_create_media_graph);
 828#endif
 829
 830static int dvbdev_check_free_adapter_num(int num)
 831{
 832	struct list_head *entry;
 
 833	list_for_each(entry, &dvb_adapter_list) {
 834		struct dvb_adapter *adap;
 
 835		adap = list_entry(entry, struct dvb_adapter, list_head);
 836		if (adap->num == num)
 837			return 0;
 838	}
 839	return 1;
 840}
 841
 842static int dvbdev_get_free_adapter_num (void)
 843{
 844	int num = 0;
 845
 846	while (num < DVB_MAX_ADAPTERS) {
 847		if (dvbdev_check_free_adapter_num(num))
 848			return num;
 849		num++;
 850	}
 851
 852	return -ENFILE;
 853}
 854
 855
 856int dvb_register_adapter(struct dvb_adapter *adap, const char *name,
 857			 struct module *module, struct device *device,
 858			 short *adapter_nums)
 859{
 860	int i, num;
 861
 862	mutex_lock(&dvbdev_register_lock);
 863
 864	for (i = 0; i < DVB_MAX_ADAPTERS; ++i) {
 865		num = adapter_nums[i];
 866		if (num >= 0  &&  num < DVB_MAX_ADAPTERS) {
 867		/* use the one the driver asked for */
 868			if (dvbdev_check_free_adapter_num(num))
 869				break;
 870		} else {
 871			num = dvbdev_get_free_adapter_num();
 872			break;
 873		}
 874		num = -1;
 875	}
 876
 877	if (num < 0) {
 878		mutex_unlock(&dvbdev_register_lock);
 879		return -ENFILE;
 880	}
 881
 882	memset (adap, 0, sizeof(struct dvb_adapter));
 883	INIT_LIST_HEAD (&adap->device_list);
 884
 885	pr_info("DVB: registering new adapter (%s)\n", name);
 886
 887	adap->num = num;
 888	adap->name = name;
 889	adap->module = module;
 890	adap->device = device;
 891	adap->mfe_shared = 0;
 892	adap->mfe_dvbdev = NULL;
 893	mutex_init (&adap->mfe_lock);
 894
 895#ifdef CONFIG_MEDIA_CONTROLLER_DVB
 896	mutex_init(&adap->mdev_lock);
 897#endif
 898
 899	list_add_tail (&adap->list_head, &dvb_adapter_list);
 900
 901	mutex_unlock(&dvbdev_register_lock);
 902
 903	return num;
 904}
 905EXPORT_SYMBOL(dvb_register_adapter);
 906
 907
 908int dvb_unregister_adapter(struct dvb_adapter *adap)
 909{
 910	mutex_lock(&dvbdev_register_lock);
 911	list_del (&adap->list_head);
 912	mutex_unlock(&dvbdev_register_lock);
 913	return 0;
 914}
 915EXPORT_SYMBOL(dvb_unregister_adapter);
 916
 917/* if the miracle happens and "generic_usercopy()" is included into
 918   the kernel, then this can vanish. please don't make the mistake and
 919   define this as video_usercopy(). this will introduce a dependency
 920   to the v4l "videodev.o" module, which is unnecessary for some
 921   cards (ie. the budget dvb-cards don't need the v4l module...) */
 
 
 922int dvb_usercopy(struct file *file,
 923		     unsigned int cmd, unsigned long arg,
 924		     int (*func)(struct file *file,
 925		     unsigned int cmd, void *arg))
 926{
 927	char    sbuf[128];
 928	void    *mbuf = NULL;
 929	void    *parg = NULL;
 930	int     err  = -EINVAL;
 931
 932	/*  Copy arguments into temp kernel buffer  */
 933	switch (_IOC_DIR(cmd)) {
 934	case _IOC_NONE:
 935		/*
 936		 * For this command, the pointer is actually an integer
 937		 * argument.
 938		 */
 939		parg = (void *) arg;
 940		break;
 941	case _IOC_READ: /* some v4l ioctls are marked wrong ... */
 942	case _IOC_WRITE:
 943	case (_IOC_WRITE | _IOC_READ):
 944		if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
 945			parg = sbuf;
 946		} else {
 947			/* too big to allocate from stack */
 948			mbuf = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
 949			if (NULL == mbuf)
 950				return -ENOMEM;
 951			parg = mbuf;
 952		}
 953
 954		err = -EFAULT;
 955		if (copy_from_user(parg, (void __user *)arg, _IOC_SIZE(cmd)))
 956			goto out;
 957		break;
 958	}
 959
 960	/* call driver */
 961	if ((err = func(file, cmd, parg)) == -ENOIOCTLCMD)
 
 962		err = -ENOTTY;
 963
 964	if (err < 0)
 965		goto out;
 966
 967	/*  Copy results into user buffer  */
 968	switch (_IOC_DIR(cmd))
 969	{
 970	case _IOC_READ:
 971	case (_IOC_WRITE | _IOC_READ):
 972		if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
 973			err = -EFAULT;
 974		break;
 975	}
 976
 977out:
 978	kfree(mbuf);
 979	return err;
 980}
 981
 982#if IS_ENABLED(CONFIG_I2C)
 983struct i2c_client *dvb_module_probe(const char *module_name,
 984				    const char *name,
 985				    struct i2c_adapter *adap,
 986				    unsigned char addr,
 987				    void *platform_data)
 988{
 989	struct i2c_client *client;
 990	struct i2c_board_info *board_info;
 991
 992	board_info = kzalloc(sizeof(*board_info), GFP_KERNEL);
 993	if (!board_info)
 994		return NULL;
 995
 996	if (name)
 997		strscpy(board_info->type, name, I2C_NAME_SIZE);
 998	else
 999		strscpy(board_info->type, module_name, I2C_NAME_SIZE);
1000
1001	board_info->addr = addr;
1002	board_info->platform_data = platform_data;
1003	request_module(module_name);
1004	client = i2c_new_client_device(adap, board_info);
1005	if (!i2c_client_has_driver(client)) {
1006		kfree(board_info);
1007		return NULL;
1008	}
1009
1010	if (!try_module_get(client->dev.driver->owner)) {
1011		i2c_unregister_device(client);
1012		client = NULL;
1013	}
1014
1015	kfree(board_info);
1016	return client;
1017}
1018EXPORT_SYMBOL_GPL(dvb_module_probe);
1019
1020void dvb_module_release(struct i2c_client *client)
1021{
1022	if (!client)
1023		return;
1024
1025	module_put(client->dev.driver->owner);
1026	i2c_unregister_device(client);
1027}
1028EXPORT_SYMBOL_GPL(dvb_module_release);
1029#endif
1030
1031static int dvb_uevent(const struct device *dev, struct kobj_uevent_env *env)
1032{
1033	const struct dvb_device *dvbdev = dev_get_drvdata(dev);
1034
1035	add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num);
1036	add_uevent_var(env, "DVB_DEVICE_TYPE=%s", dnames[dvbdev->type]);
1037	add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id);
1038	return 0;
1039}
1040
1041static char *dvb_devnode(const struct device *dev, umode_t *mode)
1042{
1043	const struct dvb_device *dvbdev = dev_get_drvdata(dev);
1044
1045	return kasprintf(GFP_KERNEL, "dvb/adapter%d/%s%d",
1046		dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id);
1047}
1048
1049
1050static int __init init_dvbdev(void)
1051{
1052	int retval;
1053	dev_t dev = MKDEV(DVB_MAJOR, 0);
1054
1055	if ((retval = register_chrdev_region(dev, MAX_DVB_MINORS, "DVB")) != 0) {
 
1056		pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR);
1057		return retval;
1058	}
1059
1060	cdev_init(&dvb_device_cdev, &dvb_device_fops);
1061	if ((retval = cdev_add(&dvb_device_cdev, dev, MAX_DVB_MINORS)) != 0) {
 
1062		pr_err("dvb-core: unable register character device\n");
1063		goto error;
1064	}
1065
1066	dvb_class = class_create(THIS_MODULE, "dvb");
1067	if (IS_ERR(dvb_class)) {
1068		retval = PTR_ERR(dvb_class);
1069		goto error;
1070	}
1071	dvb_class->dev_uevent = dvb_uevent;
1072	dvb_class->devnode = dvb_devnode;
1073	return 0;
1074
1075error:
1076	cdev_del(&dvb_device_cdev);
1077	unregister_chrdev_region(dev, MAX_DVB_MINORS);
1078	return retval;
1079}
1080
1081
1082static void __exit exit_dvbdev(void)
1083{
 
 
1084	class_destroy(dvb_class);
1085	cdev_del(&dvb_device_cdev);
1086	unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
 
 
 
 
 
 
1087}
1088
1089subsys_initcall(init_dvbdev);
1090module_exit(exit_dvbdev);
1091
1092MODULE_DESCRIPTION("DVB Core Driver");
1093MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler");
1094MODULE_LICENSE("GPL");