On 08/23/2015 10:17 PM, Mauro Carvalho Chehab wrote: > Now that the infrastruct for that is set, add support for > interfaces. > > Please notice that we're missing two links: > DVB FE intf -> tuner > DVB demux intf -> dvr > > Those should be added latter, after having the entire graph s/latter/later/ > set. With the current infrastructure, those should be added > at dvb_create_media_graph(), but it would also require some > extra core changes, to allow the function to enumerate the > interfaces. > > 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 65f59f2124b4..747372ba4fe1 100644 > --- a/drivers/media/dvb-core/dvbdev.c > +++ b/drivers/media/dvb-core/dvbdev.c > @@ -180,14 +180,35 @@ skip: > return -ENFILE; > } > > -static void dvb_register_media_device(struct dvb_device *dvbdev, > - int type, int minor) > +static void dvb_create_media_entity(struct dvb_device *dvbdev, > + int type, int minor) > { > #if defined(CONFIG_MEDIA_CONTROLLER_DVB) > int ret = 0, npads; > > - if (!dvbdev->adapter->mdev) > + switch (type) { > + case DVB_DEVICE_FRONTEND: > + npads = 2; > + break; > + case DVB_DEVICE_DEMUX: > + npads = 2; > + break; > + case DVB_DEVICE_CA: > + npads = 2; > + break; > + case DVB_DEVICE_NET: > + /* > + * We should be creating entities for the MPE/ULE > + * decapsulation hardware (or software implementation). > + * > + * However, as the number of for the MPE/ULE may not be fixed, > + * and we don't have yet dynamic support for PADs at the > + * Media Controller. However what? You probably want to add something like: However, ... at the Media Controller, we don't make this entity yet. Regards, Hans > + */ > return; > + default: > + return; > + } > > dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL); > if (!dvbdev->entity) > @@ -197,19 +218,6 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, > dvbdev->entity->info.dev.minor = minor; > dvbdev->entity->name = dvbdev->name; > > - switch (type) { > - case DVB_DEVICE_CA: > - case DVB_DEVICE_DEMUX: > - case DVB_DEVICE_FRONTEND: > - npads = 2; > - break; > - case DVB_DEVICE_NET: > - npads = 0; > - break; > - default: > - npads = 1; > - } > - > if (npads) { > dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads), > GFP_KERNEL); > @@ -230,18 +238,11 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, > dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK; > dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE; > 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_SINK; > dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE; > break; > - case DVB_DEVICE_NET: > - dvbdev->entity->type = MEDIA_ENT_T_DEVNODE_DVB_NET; > - break; > default: > kfree(dvbdev->entity); > dvbdev->entity = NULL; > @@ -263,11 +264,63 @@ static void dvb_register_media_device(struct dvb_device *dvbdev, > return; > } > > - printk(KERN_DEBUG "%s: media device '%s' registered.\n", > + printk(KERN_DEBUG "%s: media entity '%s' registered.\n", > __func__, dvbdev->entity->name); > #endif > } > > +static void dvb_register_media_device(struct dvb_device *dvbdev, > + int type, int minor) > +{ > +#if defined(CONFIG_MEDIA_CONTROLLER_DVB) > + u32 intf_type; > + > + if (!dvbdev->adapter->mdev) > + return; > + > + dvb_create_media_entity(dvbdev, type, minor); > + > + switch (type) { > + case DVB_DEVICE_FRONTEND: > + intf_type = MEDIA_INTF_T_DVB_FE; > + break; > + case DVB_DEVICE_DEMUX: > + intf_type = MEDIA_INTF_T_DVB_DEMUX; > + break; > + case DVB_DEVICE_DVR: > + intf_type = MEDIA_INTF_T_DVB_DVR; > + break; > + case DVB_DEVICE_CA: > + intf_type = MEDIA_INTF_T_DVB_CA; > + break; > + case DVB_DEVICE_NET: > + intf_type = MEDIA_INTF_T_DVB_NET; > + break; > + default: > + return; > + } > + > + dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev, > + intf_type, 0, > + DVB_MAJOR, minor, > + GFP_KERNEL); > + > + /* > + * Create the "obvious" link, e. g. the ones that represent > + * a direct association between an interface and an entity. > + * Other links should be created elsewhere, like: > + * DVB FE intf -> tuner > + * DVB demux intf -> dvr > + */ > + > + if (!dvbdev->entity || !dvbdev->intf_devnode) > + return; > + > + media_create_intf_link(dvbdev->entity, &dvbdev->intf_devnode->intf, 0); > + > +#endif > +} > + > int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, > const struct dvb_device *template, void *priv, int type) > { > diff --git a/drivers/media/dvb-core/dvbdev.h b/drivers/media/dvb-core/dvbdev.h > index 12629b8ecb0c..6670adee7afb 100644 > --- a/drivers/media/dvb-core/dvbdev.h > +++ b/drivers/media/dvb-core/dvbdev.h > @@ -103,6 +103,7 @@ struct dvb_device { > > /* Allocated and filled inside dvbdev.c */ > struct media_entity *entity; > + struct media_intf_devnode *intf_devnode; > struct media_pad *pads; > #endif > > -- 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