Commit 172e9d3c authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

[media] dvbdev: add pad for the DVB devnodes



We want to represent the links between the several DVB devnodes,
so let's create PADs for them.

The DVB net devnode is a different matter, as it is not related
to the media stream, but with network. So, at least for now, let's
not add any pad for it.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent e3d65c33
Loading
Loading
Loading
Loading
+36 −3
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ static void dvb_register_media_device(struct dvb_device *dvbdev,
				      int type, int minor)
{
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
	int ret;
	int ret = 0, npads;

	if (!dvbdev->adapter->mdev)
		return;
@@ -196,18 +196,46 @@ static void dvb_register_media_device(struct dvb_device *dvbdev,
	dvbdev->entity->info.dev.major = DVB_MAJOR;
	dvbdev->entity->info.dev.minor = minor;
	dvbdev->entity->name = dvbdev->name;

	switch (type) {
	case DVB_DEVICE_CA:
	case DVB_DEVICE_DEMUX:
		npads = 2;
		break;
	case DVB_DEVICE_NET:
		npads = 0;
		break;
	default:
		npads = 1;
	}

	if (npads) {
		dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads),
				       GFP_KERNEL);
		if (!dvbdev->pads) {
			kfree(dvbdev->entity);
			return;
		}
	}

	switch (type) {
	case DVB_DEVICE_FRONTEND:
		dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_FE;
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SOURCE;
		break;
	case DVB_DEVICE_DEMUX:
		dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DEMUX;
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SOURCE;
		dvbdev->pads[1].flags = MEDIA_PAD_FL_SINK;
		break;
	case DVB_DEVICE_DVR:
		dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DVR;
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
		break;
	case DVB_DEVICE_CA:
		dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_CA;
		dvbdev->pads[0].flags = MEDIA_PAD_FL_SOURCE;
		dvbdev->pads[1].flags = MEDIA_PAD_FL_SINK;
		break;
	case DVB_DEVICE_NET:
		dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_NET;
@@ -218,12 +246,16 @@ static void dvb_register_media_device(struct dvb_device *dvbdev,
		return;
	}

	if (npads)
		ret = media_entity_init(dvbdev->entity, npads, dvbdev->pads, 0);
	if (!ret)
		ret = media_device_register_entity(dvbdev->adapter->mdev,
						   dvbdev->entity);
	if (ret < 0) {
		printk(KERN_ERR
			"%s: media_device_register_entity failed for %s\n",
			__func__, dvbdev->entity->name);
		kfree(dvbdev->pads);
		kfree(dvbdev->entity);
		dvbdev->entity = NULL;
		return;
@@ -336,6 +368,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
	if (dvbdev->entity) {
		media_device_unregister_entity(dvbdev->entity);
		kfree(dvbdev->entity);
		kfree(dvbdev->pads);
	}
#endif

+2 −1
Original line number Diff line number Diff line
@@ -101,8 +101,9 @@ struct dvb_device {
#if defined(CONFIG_MEDIA_CONTROLLER_DVB)
	const char *name;

	/* Filled inside dvbdev.c */
	/* Allocated and filled inside dvbdev.c */
	struct media_entity *entity;
	struct media_pad *pads;
#endif

	void *priv;