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

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

 



On 05/07/2018 11:55 AM, Hans Verkuil wrote:
> 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.

I'm marking this patch as Obsoleted since there has been no activity for a long
time.

Regards,

	Hans

> 
> 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