]> git.karo-electronics.de Git - linux-beck.git/commitdiff
[media] dvbdev: add pad for the DVB devnodes
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>
Sat, 3 Jan 2015 04:59:53 +0000 (01:59 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Fri, 13 Feb 2015 23:10:14 +0000 (21:10 -0200)
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>
drivers/media/dvb-core/dvbdev.c
drivers/media/dvb-core/dvbdev.h

index f98fd3b29afefbdadede9e0d6ff104fb28135e12..79c96edf71efe9c591845b50b100f012f31c9039 100644 (file)
@@ -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
 
index 485d8e660aeabb5835f8f098f91446d2c01aee84..464067c43a350c6d230f39f09c43fc85b8b02e50 100644 (file)
@@ -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;