Hi Guennadi,

On Wednesday 09 May 2012 23:56:49 Guennadi Liakhovetski wrote:
> From: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> 
> In image mode, the CEU allows configurable line strides up to 8188
> pixels.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> [g.liakhovet...@gmx.de: unify sh_mobile_ceu_set_rect() in data-fetch mode]
> Signed-off-by: Guennadi Liakhovetski <g.liakhovet...@gmx.de>
> ---
> 
> 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to