[media] v4l: soc-camera: Store negotiated buffer settings
authorSergio Aguirre <saaguirre@ti.com>
Tue, 8 Mar 2011 00:49:48 +0000 (21:49 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 22 Mar 2011 22:41:55 +0000 (19:41 -0300)
This fixes the problem in which a host driver
sets a personalized sizeimage or bytesperline field,
and gets ignored when doing G_FMT.

Signed-off-by: Sergio Aguirre <saaguirre@ti.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/soc_camera.c
include/media/soc_camera.h

index fa80a4a..07525e7 100644 (file)
@@ -389,6 +389,8 @@ static int soc_camera_set_fmt(struct soc_camera_device *icd,
 
        icd->user_width         = pix->width;
        icd->user_height        = pix->height;
+       icd->bytesperline       = pix->bytesperline;
+       icd->sizeimage          = pix->sizeimage;
        icd->colorspace         = pix->colorspace;
        icd->field              = pix->field;
        if (ici->ops->init_videobuf)
@@ -661,14 +663,11 @@ static int soc_camera_g_fmt_vid_cap(struct file *file, void *priv,
 
        pix->width              = icd->user_width;
        pix->height             = icd->user_height;
+       pix->bytesperline       = icd->bytesperline;
+       pix->sizeimage          = icd->sizeimage;
        pix->field              = icd->field;
        pix->pixelformat        = icd->current_fmt->host_fmt->fourcc;
-       pix->bytesperline       = soc_mbus_bytes_per_line(pix->width,
-                                               icd->current_fmt->host_fmt);
        pix->colorspace         = icd->colorspace;
-       if (pix->bytesperline < 0)
-               return pix->bytesperline;
-       pix->sizeimage          = pix->height * pix->bytesperline;
        dev_dbg(&icd->dev, "current_fmt->fourcc: 0x%08x\n",
                icd->current_fmt->host_fmt->fourcc);
        return 0;
index 6e96b26..f80b537 100644 (file)
@@ -30,6 +30,8 @@ struct soc_camera_device {
        struct device *pdev;            /* Platform device */
        s32 user_width;
        s32 user_height;
+       u32 bytesperline;               /* for padding, zero if unused */
+       u32 sizeimage;
        enum v4l2_colorspace colorspace;
        unsigned char iface;            /* Host number */
        unsigned char devnum;           /* Device number per host */