Re: [PATCH v8 25/55] [media] dvbdev: add support for interfaces

2015-08-31 Thread Hans Verkuil
On 08/30/2015 05:06 AM, 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
> 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 

Acked-by: Hans Verkuil 

> 
> diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
> index 65f59f2124b4..6bf61d42c017 100644
> --- a/drivers/media/dvb-core/dvbdev.c
> +++ b/drivers/media/dvb-core/dvbdev.c
> @@ -180,14 +180,36 @@ 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, the number of for the MPE/ULE decaps may not be
> +  * fixed. As we don't have yet dynamic support for PADs at
> +  * the Media Controller, let's not create the decap
> +  * entities yet.
> +  */
>   return;
> + default:
> + return;
> + }
>  
>   dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL);
>   if (!dvbdev->entity)
> @@ -197,19 +219,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 +239,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 +265,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 = 

[PATCH v8 25/55] [media] dvbdev: add support for interfaces

2015-08-29 Thread Mauro Carvalho Chehab
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
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 mche...@osg.samsung.com

diff --git a/drivers/media/dvb-core/dvbdev.c b/drivers/media/dvb-core/dvbdev.c
index 65f59f2124b4..6bf61d42c017 100644
--- a/drivers/media/dvb-core/dvbdev.c
+++ b/drivers/media/dvb-core/dvbdev.c
@@ -180,14 +180,36 @@ 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, the number of for the MPE/ULE decaps may not be
+* fixed. As we don't have yet dynamic support for PADs at
+* the Media Controller, let's not create the decap
+* entities yet.
+*/
return;
+   default:
+   return;
+   }
 
dvbdev-entity = kzalloc(sizeof(*dvbdev-entity), GFP_KERNEL);
if (!dvbdev-entity)
@@ -197,19 +219,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 +239,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 +265,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