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 <mche...@osg.samsung.com>

diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index d975cbb29705..1071d31b7f1d 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -184,7 +184,7 @@ static void dvb_register_media_device(struct dvb_device 
*dvbdev,
                                      int type, int minor)
 {
 #if defined(CONFIG_MEDIA_CONTROLLER)
-       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.dvb.major = DVB_MAJOR;
        dvbdev->entity->info.dvb.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,11 +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;
@@ -335,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
 
diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h
index ace8575975d8..c037c2ff9f5a 100644
--- a/drivers/media/dvb-core/dvbdev.h
+++ b/drivers/media/dvb-core/dvbdev.h
@@ -101,8 +101,9 @@ struct dvb_device {
 #if defined(CONFIG_MEDIA_CONTROLLER)
        const char *name;
 
-       /* Filled inside dvbdev.c */
+       /* Allocated and filled inside dvbdev.c */
        struct media_entity *entity;
+       struct media_pad *pads;
 #endif
 
        void *priv;
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to