[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: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
parent
e3d65c33e3
commit
172e9d3c88
|
@ -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;
|
||||
}
|
||||
|
||||
ret = media_device_register_entity(dvbdev->adapter->mdev,
|
||||
dvbdev->entity);
|
||||
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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue