Re: [PATCH v3 10/9] sh_mobile_ceu_camera: Support user-configurable line stride

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

 



Hi Guennadi,

On Wednesday 09 May 2012 23:56:49 Guennadi Liakhovetski wrote:
> From: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> 
> In image mode, the CEU allows configurable line strides up to 8188
> pixels.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> [g.liakhovetski@xxxxxx: unify sh_mobile_ceu_set_rect() in data-fetch mode]
> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@xxxxxx>
> ---
> 
> Laurent, are you ok with this version?

It looks good to me, thank you.

>  drivers/media/video/sh_mobile_ceu_camera.c |   33 +++++++++++++------------
>  1 files changed, 18 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/media/video/sh_mobile_ceu_camera.c
> b/drivers/media/video/sh_mobile_ceu_camera.c index 79bec15..2ffeb21 100644
> --- a/drivers/media/video/sh_mobile_ceu_camera.c
> +++ b/drivers/media/video/sh_mobile_ceu_camera.c
> @@ -342,19 +342,15 @@ static int sh_mobile_ceu_capture(struct
> sh_mobile_ceu_dev *pcdev)
> 
>  	ceu_write(pcdev, top1, phys_addr_top);
>  	if (V4L2_FIELD_NONE != pcdev->field) {
> -		if (planar)
> -			phys_addr_bottom = phys_addr_top + icd->user_width;
> -		else
> -			phys_addr_bottom = phys_addr_top + icd->bytesperline;
> +		phys_addr_bottom = phys_addr_top + icd->bytesperline;
>  		ceu_write(pcdev, bottom1, phys_addr_bottom);
>  	}
> 
>  	if (planar) {
> -		phys_addr_top += icd->user_width *
> -			icd->user_height;
> +		phys_addr_top += icd->bytesperline * icd->user_height;
>  		ceu_write(pcdev, top2, phys_addr_top);
>  		if (V4L2_FIELD_NONE != pcdev->field) {
> -			phys_addr_bottom = phys_addr_top + icd->user_width;
> +			phys_addr_bottom = phys_addr_top + icd->bytesperline;
>  			ceu_write(pcdev, bottom2, phys_addr_bottom);
>  		}
>  	}
> @@ -681,10 +677,7 @@ static void sh_mobile_ceu_set_rect(struct
> soc_camera_device *icd) in_width *= 2;
>  			left_offset *= 2;
>  		}
> -		cdwdr_width = width;
>  	} else {
> -		int bytes_per_line = soc_mbus_bytes_per_line(width,
> -						icd->current_fmt->host_fmt);
>  		unsigned int w_factor;
> 
>  		switch (icd->current_fmt->host_fmt->packing) {
> @@ -697,13 +690,10 @@ static void sh_mobile_ceu_set_rect(struct
> soc_camera_device *icd)
> 
>  		in_width = cam->width * w_factor;
>  		left_offset *= w_factor;
> -
> -		if (bytes_per_line < 0)
> -			cdwdr_width = width;
> -		else
> -			cdwdr_width = bytes_per_line;
>  	}
> 
> +	cdwdr_width = icd->bytesperline;
> +
>  	height = icd->user_height;
>  	in_height = cam->height;
>  	if (V4L2_FIELD_NONE != pcdev->field) {
> @@ -1848,6 +1838,8 @@ static int sh_mobile_ceu_set_fmt(struct
> soc_camera_device *icd, return 0;
>  }
> 
> +#define CEU_CHDW_MAX	8188U	/* Maximum line stride */
> +
>  static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
>  				 struct v4l2_format *f)
>  {
> @@ -1926,10 +1918,20 @@ static int sh_mobile_ceu_try_fmt(struct
> soc_camera_device *icd, pix->width = width;
>  		if (mf.height > height)
>  			pix->height = height;
> +
> +		pix->bytesperline = max(pix->bytesperline, pix->width);
> +		pix->bytesperline = min(pix->bytesperline, CEU_CHDW_MAX);
> +		pix->bytesperline &= ~3;
> +		break;
> +
> +	default:
> +		/* Configurable stride isn't supported in pass-through mode. */
> +		pix->bytesperline  = 0;
>  	}
> 
>  	pix->width	&= ~3;
>  	pix->height	&= ~3;
> +	pix->sizeimage	= 0;
> 
>  	dev_geo(icd->parent, "%s(): return %d, fmt 0x%x, %ux%u\n",
>  		__func__, ret, pix->pixelformat, pix->width, pix->height);
> @@ -2148,6 +2150,7 @@ static int __devinit sh_mobile_ceu_probe(struct
> platform_device *pdev) pcdev->ici.nr = pdev->id;
>  	pcdev->ici.drv_name = dev_name(&pdev->dev);
>  	pcdev->ici.ops = &sh_mobile_ceu_host_ops;
> +	pcdev->ici.capabilities = SOCAM_HOST_CAP_STRIDE;
> 
>  	pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
>  	if (IS_ERR(pcdev->alloc_ctx)) {
-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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