Re: [PATCH 2/2] media: imx7: csi: Fix pad link validation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Rui,

Thank you for the patch.

On Thu, Jan 07, 2021 at 10:47:26AM +0000, Rui Miguel Silva wrote:
> We can not make the assumption that the bound subdev is always a CSI
> mux, in i.MX6UL/i.MX6ULL that is not the case. So, just get the entity
> selected by source directly upstream from the CSI.
> 
> Fixes: 86e02d07871c ("media: imx5/6/7: csi: Mark a bound video mux as a CSI mux")
> Reported-by: Fabio Estevam <festevam@xxxxxxxxx>
> Signed-off-by: Rui Miguel Silva <rmfrfs@xxxxxxxxx>
> Tested-by: Fabio Estevam <festevam@xxxxxxxxx>
> Tested-by: Sébastien Szymanski <sebastien.szymanski@xxxxxxxxxxxx>
> ---
>  drivers/staging/media/imx/imx7-media-csi.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/staging/media/imx/imx7-media-csi.c b/drivers/staging/media/imx/imx7-media-csi.c
> index 31e36168f9d0..ac52b1daf991 100644
> --- a/drivers/staging/media/imx/imx7-media-csi.c
> +++ b/drivers/staging/media/imx/imx7-media-csi.c
> @@ -499,6 +499,7 @@ static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd,
>  				      struct v4l2_subdev_format *sink_fmt)
>  {
>  	struct imx7_csi *csi = v4l2_get_subdevdata(sd);
> +	struct media_entity *src;
>  	struct media_pad *pad;
>  	int ret;
>  
> @@ -509,11 +510,21 @@ static int imx7_csi_pad_link_validate(struct v4l2_subdev *sd,
>  	if (!csi->src_sd)
>  		return -EPIPE;
>  
> +	src = &csi->src_sd->entity;
> +
> +	/*
> +	 * if the source is neither a CSI MUX or CSI-2 get the one directly
> +	 * upstream from this CSI
> +	 */
> +	if (src->function != MEDIA_ENT_F_VID_IF_BRIDGE &&
> +	    src->function != MEDIA_ENT_F_VID_MUX)
> +		src = &csi->sd.entity;
> +
>  	/*
> -	 * find the entity that is selected by the CSI mux. This is needed
> +	 * find the entity that is selected by the source. This is needed
>  	 * to distinguish between a parallel or CSI-2 pipeline.
>  	 */
> -	pad = imx_media_pipeline_pad(&csi->src_sd->entity, 0, 0, true);
> +	pad = imx_media_pipeline_pad(src, 0, 0, true);
>  	if (!pad)
>  		return -ENODEV;

This is a bit over-complicated. If the source entity isn't a mux or
bridge, then the input is always parallel. I'll send a follow up patch
to simplify this, as this one has been merged already.

By the way, it would be entirely possible for an external entity,
connected through a parallel interface, to have a function set to
MEDIA_ENT_F_VID_IF_BRIDGE or MEDIA_ENT_F_VID_MUX. This code is thus not
very robust, and will need to be fixed.


-- 
Regards,

Laurent Pinchart



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux