提交 172e9d3c 编写于 作者: M Mauro Carvalho Chehab

[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: NMauro Carvalho Chehab <mchehab@osg.samsung.com>
上级 e3d65c33
...@@ -184,7 +184,7 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, ...@@ -184,7 +184,7 @@ static void dvb_register_media_device(struct dvb_device *dvbdev,
int type, int minor) int type, int minor)
{ {
#if defined(CONFIG_MEDIA_CONTROLLER_DVB) #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
int ret; int ret = 0, npads;
if (!dvbdev->adapter->mdev) if (!dvbdev->adapter->mdev)
return; return;
...@@ -196,18 +196,46 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, ...@@ -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.major = DVB_MAJOR;
dvbdev->entity->info.dev.minor = minor; dvbdev->entity->info.dev.minor = minor;
dvbdev->entity->name = dvbdev->name; 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) { switch (type) {
case DVB_DEVICE_FRONTEND: case DVB_DEVICE_FRONTEND:
dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_FE; dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_FE;
dvbdev->pads[0].flags = MEDIA_PAD_FL_SOURCE;
break; break;
case DVB_DEVICE_DEMUX: case DVB_DEVICE_DEMUX:
dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_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; break;
case DVB_DEVICE_DVR: case DVB_DEVICE_DVR:
dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DVR; dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_DVR;
dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK;
break; break;
case DVB_DEVICE_CA: case DVB_DEVICE_CA:
dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_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; break;
case DVB_DEVICE_NET: case DVB_DEVICE_NET:
dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_NET; dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_NET;
...@@ -218,12 +246,16 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, ...@@ -218,12 +246,16 @@ static void dvb_register_media_device(struct dvb_device *dvbdev,
return; return;
} }
ret = media_device_register_entity(dvbdev->adapter->mdev, if (npads)
dvbdev->entity); 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) { if (ret < 0) {
printk(KERN_ERR printk(KERN_ERR
"%s: media_device_register_entity failed for %s\n", "%s: media_device_register_entity failed for %s\n",
__func__, dvbdev->entity->name); __func__, dvbdev->entity->name);
kfree(dvbdev->pads);
kfree(dvbdev->entity); kfree(dvbdev->entity);
dvbdev->entity = NULL; dvbdev->entity = NULL;
return; return;
...@@ -336,6 +368,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev) ...@@ -336,6 +368,7 @@ void dvb_unregister_device(struct dvb_device *dvbdev)
if (dvbdev->entity) { if (dvbdev->entity) {
media_device_unregister_entity(dvbdev->entity); media_device_unregister_entity(dvbdev->entity);
kfree(dvbdev->entity); kfree(dvbdev->entity);
kfree(dvbdev->pads);
} }
#endif #endif
......
...@@ -101,8 +101,9 @@ struct dvb_device { ...@@ -101,8 +101,9 @@ struct dvb_device {
#if defined(CONFIG_MEDIA_CONTROLLER_DVB) #if defined(CONFIG_MEDIA_CONTROLLER_DVB)
const char *name; const char *name;
/* Filled inside dvbdev.c */ /* Allocated and filled inside dvbdev.c */
struct media_entity *entity; struct media_entity *entity;
struct media_pad *pads;
#endif #endif
void *priv; void *priv;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册