[media] bttv: fix field handling inside TRY_FMT
authorHans Verkuil <hans.verkuil@cisco.com>
Wed, 6 Feb 2013 15:03:30 +0000 (12:03 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 5 Mar 2013 17:07:05 +0000 (14:07 -0300)
- don't return -EINVAL for invalid field types, handle those as if it
  was FIELD_ANY.
- the handling of FIELD_SEQ_BT/TB was wrong as well: if such field formats
  aren't supported, then fall back to FIELD_ANY instead of returning an error.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/pci/bt8xx/bttv-driver.c

index cffa8b6..73404b7 100644 (file)
@@ -2530,6 +2530,7 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
        struct bttv *btv = fh->btv;
        enum v4l2_field field;
        __s32 width, height;
+       __s32 height2;
        int rc;
 
        fmt = format_by_fourcc(f->fmt.pix.pixelformat);
@@ -2538,30 +2539,25 @@ static int bttv_try_fmt_vid_cap(struct file *file, void *priv,
 
        field = f->fmt.pix.field;
 
-       if (V4L2_FIELD_ANY == field) {
-               __s32 height2;
-
-               height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
-               field = (f->fmt.pix.height > height2)
-                       ? V4L2_FIELD_INTERLACED
-                       : V4L2_FIELD_BOTTOM;
-       }
-
-       if (V4L2_FIELD_SEQ_BT == field)
-               field = V4L2_FIELD_SEQ_TB;
-
        switch (field) {
        case V4L2_FIELD_TOP:
        case V4L2_FIELD_BOTTOM:
        case V4L2_FIELD_ALTERNATE:
        case V4L2_FIELD_INTERLACED:
                break;
+       case V4L2_FIELD_SEQ_BT:
        case V4L2_FIELD_SEQ_TB:
-               if (fmt->flags & FORMAT_FLAGS_PLANAR)
-                       return -EINVAL;
+               if (!(fmt->flags & FORMAT_FLAGS_PLANAR)) {
+                       field = V4L2_FIELD_SEQ_TB;
+                       break;
+               }
+               /* fall through */
+       default: /* FIELD_ANY case */
+               height2 = btv->crop[!!fh->do_crop].rect.height >> 1;
+               field = (f->fmt.pix.height > height2)
+                       ? V4L2_FIELD_INTERLACED
+                       : V4L2_FIELD_BOTTOM;
                break;
-       default:
-               return -EINVAL;
        }
 
        width = f->fmt.pix.width;