Hi Jacopo,

Thanks for your patch.

On 2018-05-18 16:40:42 +0200, Jacopo Mondi wrote:
> When running with media-controller link the parallel input
> media entities with the VIN entities at 'complete' callback time.
> 
> To create media links the v4l2_device should be registered first.
> Check if the device is already registered, to avoid double registrations.
> 
> Signed-off-by: Jacopo Mondi <[email protected]>

Acked-by: Niklas Söderlund <[email protected]>

> ---
>  drivers/media/platform/rcar-vin/rcar-core.c | 26 ++++++++++++++++++++++++--
>  1 file changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/platform/rcar-vin/rcar-core.c 
> b/drivers/media/platform/rcar-vin/rcar-core.c
> index 745e8ee..d13bbcf 100644
> --- a/drivers/media/platform/rcar-vin/rcar-core.c
> +++ b/drivers/media/platform/rcar-vin/rcar-core.c
> @@ -478,6 +478,8 @@ static void rvin_parallel_subdevice_detach(struct 
> rvin_dev *vin)
>  static int rvin_parallel_notify_complete(struct v4l2_async_notifier 
> *notifier)
>  {
>       struct rvin_dev *vin = notifier_to_vin(notifier);
> +     struct media_entity *source;
> +     struct media_entity *sink;
>       int ret;
>  
>       ret = v4l2_device_register_subdev_nodes(&vin->v4l2_dev);
> @@ -486,7 +488,26 @@ static int rvin_parallel_notify_complete(struct 
> v4l2_async_notifier *notifier)
>               return ret;
>       }
>  
> -     return rvin_v4l2_register(vin);
> +     if (!video_is_registered(&vin->vdev)) {
> +             ret = rvin_v4l2_register(vin);
> +             if (ret < 0)
> +                     return ret;
> +     }
> +
> +     if (!vin->info->use_mc)
> +             return 0;
> +
> +     /* If we're running with media-controller, link the subdevs. */
> +     source = &vin->parallel->subdev->entity;
> +     sink = &vin->vdev.entity;
> +
> +     ret = media_create_pad_link(source, vin->parallel->source_pad,
> +                                 sink, vin->parallel->sink_pad, 0);
> +     if (ret)
> +             vin_err(vin, "Error adding link from %s to %s: %d\n",
> +                     source->name, sink->name, ret);
> +
> +     return ret;
>  }
>  
>  static void rvin_parallel_notify_unbind(struct v4l2_async_notifier *notifier,
> @@ -611,7 +632,8 @@ static int rvin_group_notify_complete(struct 
> v4l2_async_notifier *notifier)
>  
>       /* Register all video nodes for the group. */
>       for (i = 0; i < RCAR_VIN_NUM; i++) {
> -             if (vin->group->vin[i]) {
> +             if (vin->group->vin[i] &&
> +                 !video_is_registered(&vin->group->vin[i]->vdev)) {
>                       ret = rvin_v4l2_register(vin->group->vin[i]);
>                       if (ret)
>                               return ret;
> -- 
> 2.7.4
> 

-- 
Regards,
Niklas Söderlund

Reply via email to