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@xxxxxxxxxxxxxxx> diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c index 28e9d53d0979..202c15582fa3 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->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->mdev, dvbdev->entity); + if (npads) + ret = media_entity_init(dvbdev->entity, npads, dvbdev->pads, 0); + if (!ret) + ret = media_device_register_entity(dvbdev->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 f58dfef46984..513ca92028dd 100644 --- a/drivers/media/dvb-core/dvbdev.h +++ b/drivers/media/dvb-core/dvbdev.h @@ -98,8 +98,9 @@ struct dvb_device { struct media_device *mdev; 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html