V4L/DVB: cx25840: support new vbi ops to set/get VBI format
authorHans Verkuil <hverkuil@xs4all.nl>
Sun, 14 Mar 2010 13:16:46 +0000 (10:16 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 19 May 2010 15:58:47 +0000 (12:58 -0300)
Also removed the bogus zeroing of fmt.sliced when setting up raw VBI.

Switching between raw and sliced VBI changed in 2.6.28 and this memset
should have been removed at that time. It was never noticed because
the bridge driver will fill in the fmt.vbi values anyway.

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

index a0f6f82993bc9390efd885e44a1de13696520249..a20df8c184ed9d06d85947ff02b089e09b17a105 100644 (file)
@@ -1018,7 +1018,7 @@ static int cx25840_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
 {
        switch (fmt->type) {
        case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-               return cx25840_vbi_g_fmt(sd, fmt);
+               return cx25840_g_sliced_fmt(sd, &fmt->fmt.sliced);
        default:
                return -EINVAL;
        }
@@ -1080,10 +1080,10 @@ static int cx25840_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
                break;
 
        case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
-               return cx25840_vbi_s_fmt(sd, fmt);
+               return cx25840_s_sliced_fmt(sd, &fmt->fmt.sliced);
 
        case V4L2_BUF_TYPE_VBI_CAPTURE:
-               return cx25840_vbi_s_fmt(sd, fmt);
+               return cx25840_s_raw_fmt(sd, &fmt->fmt.vbi);
 
        default:
                return -EINVAL;
@@ -1640,6 +1640,9 @@ static const struct v4l2_subdev_video_ops cx25840_video_ops = {
 
 static const struct v4l2_subdev_vbi_ops cx25840_vbi_ops = {
        .decode_vbi_line = cx25840_decode_vbi_line,
+       .s_raw_fmt = cx25840_s_raw_fmt,
+       .s_sliced_fmt = cx25840_s_sliced_fmt,
+       .g_sliced_fmt = cx25840_g_sliced_fmt,
 };
 
 static const struct v4l2_subdev_ops cx25840_ops = {
index 55345444417f19cf5426779537dff104b36d0d7f..04393b9715671eb1ef31894ae7e7c243d053a0c5 100644 (file)
@@ -99,8 +99,9 @@ int cx25840_audio_s_ctrl(struct v4l2_subdev *sd, struct v4l2_control *ctrl);
 
 /* ----------------------------------------------------------------------- */
 /* cx25850-vbi.c                                                           */
-int cx25840_vbi_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt);
-int cx25840_vbi_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt);
+int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt);
+int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
+int cx25840_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *fmt);
 int cx25840_decode_vbi_line(struct v4l2_subdev *sd, struct v4l2_decode_vbi_line *vbi);
 
 #endif
index 35f6592f6c47944d5e699cd783c3ded725d3c1ce..64a4004f8a97c9f041296cd1da2799a5042129b2 100644 (file)
@@ -82,11 +82,10 @@ static int decode_vps(u8 * dst, u8 * p)
        return err & 0xf0;
 }
 
-int cx25840_vbi_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
+int cx25840_g_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *svbi)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct cx25840_state *state = to_state(sd);
-       struct v4l2_sliced_vbi_format *svbi;
        static const u16 lcr2vbi[] = {
                0, V4L2_SLICED_TELETEXT_B, 0,   /* 1 */
                0, V4L2_SLICED_WSS_625, 0,      /* 4 */
@@ -97,9 +96,6 @@ int cx25840_vbi_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
        int is_pal = !(state->std & V4L2_STD_525_60);
        int i;
 
-       if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)
-               return -EINVAL;
-       svbi = &fmt->fmt.sliced;
        memset(svbi, 0, sizeof(*svbi));
        /* we're done if raw VBI is active */
        if ((cx25840_read(client, 0x404) & 0x10) == 0)
@@ -127,32 +123,30 @@ int cx25840_vbi_g_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
        return 0;
 }
 
-int cx25840_vbi_s_fmt(struct v4l2_subdev *sd, struct v4l2_format *fmt)
+int cx25840_s_raw_fmt(struct v4l2_subdev *sd, struct v4l2_vbi_format *fmt)
 {
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct cx25840_state *state = to_state(sd);
-       struct v4l2_sliced_vbi_format *svbi;
        int is_pal = !(state->std & V4L2_STD_525_60);
        int vbi_offset = is_pal ? 1 : 0;
-       int i, x;
-       u8 lcr[24];
 
-       if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE &&
-                       fmt->type != V4L2_BUF_TYPE_VBI_CAPTURE)
-               return -EINVAL;
-       svbi = &fmt->fmt.sliced;
-       if (fmt->type == V4L2_BUF_TYPE_VBI_CAPTURE) {
-               /* raw VBI */
-               memset(svbi, 0, sizeof(*svbi));
+       /* Setup standard */
+       cx25840_std_setup(client);
 
-               /* Setup standard */
-               cx25840_std_setup(client);
+       /* VBI Offset */
+       cx25840_write(client, 0x47f, vbi_offset);
+       cx25840_write(client, 0x404, 0x2e);
+       return 0;
+}
 
-               /* VBI Offset */
-               cx25840_write(client, 0x47f, vbi_offset);
-               cx25840_write(client, 0x404, 0x2e);
-               return 0;
-       }
+int cx25840_s_sliced_fmt(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_format *svbi)
+{
+       struct i2c_client *client = v4l2_get_subdevdata(sd);
+       struct cx25840_state *state = to_state(sd);
+       int is_pal = !(state->std & V4L2_STD_525_60);
+       int vbi_offset = is_pal ? 1 : 0;
+       int i, x;
+       u8 lcr[24];
 
        for (x = 0; x <= 23; x++)
                lcr[x] = 0x00;