Re: [PATCH] rcar-csi2: Allow configuring of video standard

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

 



Hi Laurent,

On 2019-03-07 02:26:45 +0200, Laurent Pinchart wrote:
> Hi Niklas,
> 
> On Thu, Mar 07, 2019 at 01:22:36AM +0100, Niklas Söderlund wrote:
> > On 2019-03-07 02:13:18 +0200, Laurent Pinchart wrote:
> > > On Sat, Feb 16, 2019 at 11:57:58PM +0100, Niklas Söderlund wrote:
> > >> Allow the hardware to to do proper field detection for interlaced field
> > >> formats by implementing s_std() and g_std(). Depending on which video
> > >> standard is selected the driver needs to setup the hardware to correctly
> > >> identify fields.
> > > 
> > > I don't think this belongs to the CSI-2 receiver. Standards are really
> > > an analog concept, and should be handled by the analog front-end. At the
> > > CSI-2 level there's no concept of analog standard anymore.
> > 
> > I agree it should be handled by the analog front-end. This is patch just 
> > lets the user propagate the information in the pipeline. The driver 
> > could instead find its source subdevice in the media graph and ask which 
> > standard it's supplying.
> > 
> > I wrestled a bit with this and went with this approach as it then works 
> > the same as with other format information, such as dimensions and pixel 
> > format. If the driver acquires the standard by itself why should it no 
> > the same for the format? I'm willing to change this but I would like to 
> > understand where the divider for format propagating in kernel and 
> > user-space is :-)
> > 
> > Also what if there are subdevices between rcar-csi2 and the analog 
> > front-end which do not support the g_std operation?
> 
> My point is that the analog standard shouldn't be propagated at all,
> neither inside the kernel nor in userspace, as it is not applicable to
> CSI-2.

This is not related to CSI-2 if I understand it. It is related to the 
outputed field signal on the parallel output from CSI-2 facing the VINs.  
See chapter "25.4.5 FLD Signal" in the datasheet.

> 
> > >> Later versions of the datasheet have also been updated to make it clear
> > >> that FLD register should be set to 0 when dealing with none interlaced
> > >> field formats.
> > >> 
> > >> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
> > >> ---
> > >>  drivers/media/platform/rcar-vin/rcar-csi2.c | 33 +++++++++++++++++++--
> > >>  1 file changed, 30 insertions(+), 3 deletions(-)
> > >> 
> > >> diff --git a/drivers/media/platform/rcar-vin/rcar-csi2.c b/drivers/media/platform/rcar-vin/rcar-csi2.c
> > >> index f3099f3e536d808a..664d3784be2b9db9 100644
> > >> --- a/drivers/media/platform/rcar-vin/rcar-csi2.c
> > >> +++ b/drivers/media/platform/rcar-vin/rcar-csi2.c
> > >> @@ -361,6 +361,7 @@ struct rcar_csi2 {
> > >>  	struct v4l2_subdev *remote;
> > >>  
> > >>  	struct v4l2_mbus_framefmt mf;
> > >> +	v4l2_std_id std;
> > >>  
> > >>  	struct mutex lock;
> > >>  	int stream_count;
> > >> @@ -389,6 +390,22 @@ static void rcsi2_write(struct rcar_csi2 *priv, unsigned int reg, u32 data)
> > >>  	iowrite32(data, priv->base + reg);
> > >>  }
> > >>  
> > >> +static int rcsi2_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
> > >> +{
> > >> +	struct rcar_csi2 *priv = sd_to_csi2(sd);
> > >> +
> > >> +	priv->std = std;
> > >> +	return 0;
> > >> +}
> > >> +
> > >> +static int rcsi2_g_std(struct v4l2_subdev *sd, v4l2_std_id *std)
> > >> +{
> > >> +	struct rcar_csi2 *priv = sd_to_csi2(sd);
> > >> +
> > >> +	*std = priv->std;
> > >> +	return 0;
> > >> +}
> > >> +
> > >>  static void rcsi2_standby_mode(struct rcar_csi2 *priv, int on)
> > >>  {
> > >>  	if (!on) {
> > >> @@ -475,7 +492,7 @@ static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp)
> > >>  static int rcsi2_start_receiver(struct rcar_csi2 *priv)
> > >>  {
> > >>  	const struct rcar_csi2_format *format;
> > >> -	u32 phycnt, vcdt = 0, vcdt2 = 0;
> > >> +	u32 phycnt, vcdt = 0, vcdt2 = 0, fld = 0;
> > >>  	unsigned int i;
> > >>  	int mbps, ret;
> > >>  
> > >> @@ -507,6 +524,15 @@ static int rcsi2_start_receiver(struct rcar_csi2 *priv)
> > >>  			vcdt2 |= vcdt_part << ((i % 2) * 16);
> > >>  	}
> > >>  
> > >> +	if (priv->mf.field != V4L2_FIELD_NONE) {
> > >> +		fld =  FLD_FLD_EN4 | FLD_FLD_EN3 | FLD_FLD_EN2 | FLD_FLD_EN;
> > >> +
> > >> +		if (priv->std & V4L2_STD_525_60)
> > >> +			fld |= FLD_FLD_NUM(2);
> > >> +		else
> > >> +			fld |= FLD_FLD_NUM(1);
> > >> +	}
> > >> +
> > >>  	phycnt = PHYCNT_ENABLECLK;
> > >>  	phycnt |= (1 << priv->lanes) - 1;
> > >>  
> > >> @@ -519,8 +545,7 @@ static int rcsi2_start_receiver(struct rcar_csi2 *priv)
> > >>  	rcsi2_write(priv, PHTC_REG, 0);
> > >>  
> > >>  	/* Configure */
> > >> -	rcsi2_write(priv, FLD_REG, FLD_FLD_NUM(2) | FLD_FLD_EN4 |
> > >> -		    FLD_FLD_EN3 | FLD_FLD_EN2 | FLD_FLD_EN);
> > >> +	rcsi2_write(priv, FLD_REG, fld);
> > >>  	rcsi2_write(priv, VCDT_REG, vcdt);
> > >>  	if (vcdt2)
> > >>  		rcsi2_write(priv, VCDT2_REG, vcdt2);
> > >> @@ -662,6 +687,8 @@ static int rcsi2_get_pad_format(struct v4l2_subdev *sd,
> > >>  }
> > >>  
> > >>  static const struct v4l2_subdev_video_ops rcar_csi2_video_ops = {
> > >> +	.s_std = rcsi2_s_std,
> > >> +	.g_std = rcsi2_g_std,
> > >>  	.s_stream = rcsi2_s_stream,
> > >>  };
> > >>  
> 
> -- 
> Regards,
> 
> Laurent Pinchart

-- 
Regards,
Niklas Söderlund



[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