V4L/DVB: mt9v011: add enum/try/s_mbus_fmt support
authorHans Verkuil <hverkuil@xs4all.nl>
Sun, 9 May 2010 13:19:25 +0000 (10:19 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 1 Jun 2010 04:21:35 +0000 (01:21 -0300)
Note that this driver is only used by em28xx and that em28xx does not
actually call the enum/try/s_fmt ops of mt9v011. So these functions
have never been tested.

And in fact the driver really implements cropping instead of scaling. So it
seems to be doing the wrong thing :-(

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/mt9v011.c

index 72e55be..f5e778d 100644 (file)
@@ -392,27 +392,25 @@ static int mt9v011_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
        return 0;
 }
 
-static int mt9v011_enum_fmt(struct v4l2_subdev *sd, struct v4l2_fmtdesc *fmt)
+static int mt9v011_enum_mbus_fmt(struct v4l2_subdev *sd, unsigned index,
+                                       enum v4l2_mbus_pixelcode *code)
 {
-       if (fmt->index > 0)
+       if (index > 0)
                return -EINVAL;
 
-       fmt->flags = 0;
-       strcpy(fmt->description, "8 bpp Bayer GRGR..BGBG");
-       fmt->pixelformat = V4L2_PIX_FMT_SGRBG8;
-
+       *code = V4L2_MBUS_FMT_SGRBG8_1X8;
        return 0;
 }
 
-static int mt9v011_try_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
+static int mt9v011_try_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
 {
-       struct v4l2_pix_format *pix = &fmt->fmt.pix;
-
-       if (pix->pixelformat != V4L2_PIX_FMT_SGRBG8)
+       if (fmt->code != V4L2_MBUS_FMT_SGRBG8_1X8)
                return -EINVAL;
 
-       v4l_bound_align_image(&pix->width, 48, 639, 1,
-                             &pix->height, 32, 480, 1, 0);
+       v4l_bound_align_image(&fmt->width, 48, 639, 1,
+                             &fmt->height, 32, 480, 1, 0);
+       fmt->field = V4L2_FIELD_NONE;
+       fmt->colorspace = V4L2_COLORSPACE_SRGB;
 
        return 0;
 }
@@ -455,18 +453,17 @@ static int mt9v011_s_parm(struct v4l2_subdev *sd, struct v4l2_streamparm *parms)
        return 0;
 }
 
-static int mt9v011_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
+static int mt9v011_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *fmt)
 {
-       struct v4l2_pix_format *pix = &fmt->fmt.pix;
        struct mt9v011 *core = to_mt9v011(sd);
        int rc;
 
-       rc = mt9v011_try_fmt(sd, fmt);
+       rc = mt9v011_try_mbus_fmt(sd, fmt);
        if (rc < 0)
                return -EINVAL;
 
-       core->width = pix->width;
-       core->height = pix->height;
+       core->width = fmt->width;
+       core->height = fmt->height;
 
        set_res(sd);
 
@@ -549,9 +546,9 @@ static const struct v4l2_subdev_core_ops mt9v011_core_ops = {
 };
 
 static const struct v4l2_subdev_video_ops mt9v011_video_ops = {
-       .enum_fmt = mt9v011_enum_fmt,
-       .try_fmt = mt9v011_try_fmt,
-       .s_fmt = mt9v011_s_fmt,
+       .enum_mbus_fmt = mt9v011_enum_mbus_fmt,
+       .try_mbus_fmt = mt9v011_try_mbus_fmt,
+       .s_mbus_fmt = mt9v011_s_mbus_fmt,
        .g_parm = mt9v011_g_parm,
        .s_parm = mt9v011_s_parm,
 };