media: v4l2-compat-ioctl32.c: add capabilities field to, v4l2_input32
[pandora-kernel.git] / drivers / media / video / v4l2-ioctl.c
index 24fd433..639abee 100644 (file)
@@ -273,6 +273,8 @@ static const char *v4l2_ioctls[] = {
        [_IOC_NR(VIDIOC_DQEVENT)]          = "VIDIOC_DQEVENT",
        [_IOC_NR(VIDIOC_SUBSCRIBE_EVENT)]  = "VIDIOC_SUBSCRIBE_EVENT",
        [_IOC_NR(VIDIOC_UNSUBSCRIBE_EVENT)] = "VIDIOC_UNSUBSCRIBE_EVENT",
+       [_IOC_NR(VIDIOC_CREATE_BUFS)]      = "VIDIOC_CREATE_BUFS",
+       [_IOC_NR(VIDIOC_PREPARE_BUF)]      = "VIDIOC_PREPARE_BUF",
 };
 #define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
 
@@ -2104,6 +2106,40 @@ static long __video_do_ioctl(struct file *file,
                dbgarg(cmd, "type=0x%8.8x", sub->type);
                break;
        }
+       case VIDIOC_CREATE_BUFS:
+       {
+               struct v4l2_create_buffers *create = arg;
+
+               if (!ops->vidioc_create_bufs)
+                       break;
+               if (ret_prio) {
+                       ret = ret_prio;
+                       break;
+               }
+               ret = check_fmt(ops, create->format.type);
+               if (ret)
+                       break;
+
+               ret = ops->vidioc_create_bufs(file, fh, create);
+
+               dbgarg(cmd, "count=%d @ %d\n", create->count, create->index);
+               break;
+       }
+       case VIDIOC_PREPARE_BUF:
+       {
+               struct v4l2_buffer *b = arg;
+
+               if (!ops->vidioc_prepare_buf)
+                       break;
+               ret = check_fmt(ops, b->type);
+               if (ret)
+                       break;
+
+               ret = ops->vidioc_prepare_buf(file, fh, b);
+
+               dbgarg(cmd, "index=%d", b->index);
+               break;
+       }
        default:
                if (!ops->vidioc_default)
                        break;
@@ -2190,6 +2226,10 @@ static int check_array_args(unsigned int cmd, void *parg, size_t *array_size,
                struct v4l2_ext_controls *ctrls = parg;
 
                if (ctrls->count != 0) {
+                       if (ctrls->count > V4L2_CID_MAX_CTRLS) {
+                               ret = -EINVAL;
+                               break;
+                       }
                        *user_ptr = (void __user *)ctrls->controls;
                        *kernel_ptr = (void *)&ctrls->controls;
                        *array_size = sizeof(struct v4l2_ext_control)