Re: [PATCH] media: staging/imx: Handle CSI->VDIC->PRPVF pipeline

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

 



On 07/04/18 15:05, Marek Vasut wrote:
> In case the PRPVF is not connected directly to CSI, the PRPVF subdev
> driver won't find the CSI subdev and will not configure the CSI input
> mux. This is not noticable on the IPU1-CSI0 interface with parallel
> camera, since the mux is set "correctly" by default and the parallel
> camera will work just fine. This is however noticable on IPU2-CSI1,
> where the mux is not set to the correct position by default and the
> pipeline will fail.
> 
> Add similar code to what is in PRPVF to VDIC driver, so that the VDIC
> can locate the CSI subdev and configure the mux correctly if the CSI
> is connected to the VDIC. Make the PRPVF driver configure the CSI mux
> only in case it's connected directly to CSI and not in case it is
> connected to VDIC.
> 
> Signed-off-by: Marek Vasut <marex@xxxxxxx>
> Cc: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx>
> Cc: Steve Longerbeam <steve_longerbeam@xxxxxxxxxx>

Same here, I cannot merge with out Acks since I don't know the details
of the imx hardware.

Regards,

	Hans

> ---
>  drivers/staging/media/imx/imx-ic-prp.c     |  6 ++----
>  drivers/staging/media/imx/imx-media-vdic.c | 24 ++++++++++++++++++++++++
>  2 files changed, 26 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/staging/media/imx/imx-ic-prp.c b/drivers/staging/media/imx/imx-ic-prp.c
> index 98923fc844ce..84fa66dae21a 100644
> --- a/drivers/staging/media/imx/imx-ic-prp.c
> +++ b/drivers/staging/media/imx/imx-ic-prp.c
> @@ -72,14 +72,12 @@ static inline struct prp_priv *sd_to_priv(struct v4l2_subdev *sd)
>  static int prp_start(struct prp_priv *priv)
>  {
>  	struct imx_ic_priv *ic_priv = priv->ic_priv;
> -	bool src_is_vdic;
>  
>  	priv->ipu = priv->md->ipu[ic_priv->ipu_id];
>  
>  	/* set IC to receive from CSI or VDI depending on source */
> -	src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC);
> -
> -	ipu_set_ic_src_mux(priv->ipu, priv->csi_id, src_is_vdic);
> +	if (!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC))
> +		ipu_set_ic_src_mux(priv->ipu, priv->csi_id, false);
>  
>  	return 0;
>  }
> diff --git a/drivers/staging/media/imx/imx-media-vdic.c b/drivers/staging/media/imx/imx-media-vdic.c
> index b538bbebedc5..e660911e7024 100644
> --- a/drivers/staging/media/imx/imx-media-vdic.c
> +++ b/drivers/staging/media/imx/imx-media-vdic.c
> @@ -117,6 +117,9 @@ struct vdic_priv {
>  
>  	bool csi_direct;  /* using direct CSI->VDIC->IC pipeline */
>  
> +	/* the CSI id at link validate */
> +	int csi_id;
> +
>  	/* motion select control */
>  	struct v4l2_ctrl_handler ctrl_hdlr;
>  	enum ipu_motion_sel motion;
> @@ -388,6 +391,9 @@ static int vdic_start(struct vdic_priv *priv)
>  	if (ret)
>  		return ret;
>  
> +	/* set IC to receive from CSI or VDI depending on source */
> +	ipu_set_ic_src_mux(priv->ipu, priv->csi_id, true);
> +
>  	/*
>  	 * init the VDIC.
>  	 *
> @@ -778,6 +784,7 @@ static int vdic_link_validate(struct v4l2_subdev *sd,
>  			      struct v4l2_subdev_format *sink_fmt)
>  {
>  	struct vdic_priv *priv = v4l2_get_subdevdata(sd);
> +	struct imx_media_subdev *csi;
>  	int ret;
>  
>  	ret = v4l2_subdev_link_validate_default(sd, link,
> @@ -785,6 +792,23 @@ static int vdic_link_validate(struct v4l2_subdev *sd,
>  	if (ret)
>  		return ret;
>  
> +	csi = imx_media_find_upstream_subdev(priv->md, priv->src,
> +					     IMX_MEDIA_GRP_ID_CSI);
> +	if (!IS_ERR(csi)) {
> +		switch (csi->sd->grp_id) {
> +		case IMX_MEDIA_GRP_ID_CSI0:
> +			priv->csi_id = 0;
> +			break;
> +		case IMX_MEDIA_GRP_ID_CSI1:
> +			priv->csi_id = 1;
> +			break;
> +		default:
> +			ret = -EINVAL;
> +		}
> +	} else {
> +		priv->csi_id = 0;
> +	}
> +
>  	mutex_lock(&priv->lock);
>  
>  	if (priv->csi_direct && priv->motion != HIGH_MOTION) {
> 




[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