V4L/DVB (8113): ivtv/cx18: remove s/g_ctrl, now all controls are handled through...
authorHans Verkuil <hverkuil@xs4all.nl>
Wed, 25 Jun 2008 09:32:44 +0000 (06:32 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 20 Jul 2008 10:12:23 +0000 (07:12 -0300)
videodev converts old-style controls to an extended control so the ivtv and
cx18 drivers no longer have to handle both.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/cx18/cx18-controls.c
drivers/media/video/cx18/cx18-controls.h
drivers/media/video/cx18/cx18-ioctl.c
drivers/media/video/ivtv/ivtv-controls.c
drivers/media/video/ivtv/ivtv-controls.h
drivers/media/video/ivtv/ivtv-ioctl.c

index 8553133..f46c7e5 100644 (file)
@@ -101,16 +101,24 @@ int cx18_querymenu(struct file *file, void *fh, struct v4l2_querymenu *qmenu)
                        cx2341x_ctrl_get_menu(&cx->params, qmenu->id));
 }
 
-int cx18_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
+static int cx18_try_ctrl(struct file *file, void *fh,
+                                       struct v4l2_ext_control *vctrl)
 {
-       struct cx18_open_id *id = fh;
-       struct cx18 *cx = id->cx;
-       int ret;
+       struct v4l2_queryctrl qctrl;
+       const char **menu_items = NULL;
+       int err;
 
-       ret = v4l2_prio_check(&cx->prio, &id->prio);
-       if (ret)
-               return ret;
+       qctrl.id = vctrl->id;
+       err = cx18_queryctrl(file, fh, &qctrl);
+       if (err)
+               return err;
+       if (qctrl.type == V4L2_CTRL_TYPE_MENU)
+               menu_items = v4l2_ctrl_get_menu(qctrl.id);
+       return v4l2_ctrl_check(vctrl, &qctrl, menu_items);
+}
 
+static int cx18_s_ctrl(struct cx18 *cx, struct v4l2_control *vctrl)
+{
        switch (vctrl->id) {
                /* Standard V4L2 controls */
        case V4L2_CID_BRIGHTNESS:
@@ -134,10 +142,8 @@ int cx18_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
        return 0;
 }
 
-int cx18_g_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
+static int cx18_g_ctrl(struct cx18 *cx, struct v4l2_control *vctrl)
 {
-       struct cx18 *cx = ((struct cx18_open_id *)fh)->cx;
-
        switch (vctrl->id) {
                /* Standard V4L2 controls */
        case V4L2_CID_BRIGHTNESS:
@@ -211,7 +217,7 @@ int cx18_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
                for (i = 0; i < c->count; i++) {
                        ctrl.id = c->controls[i].id;
                        ctrl.value = c->controls[i].value;
-                       err = cx18_g_ctrl(file, fh, &ctrl);
+                       err = cx18_g_ctrl(cx, &ctrl);
                        c->controls[i].value = ctrl.value;
                        if (err) {
                                c->error_idx = i;
@@ -243,7 +249,7 @@ int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
                for (i = 0; i < c->count; i++) {
                        ctrl.id = c->controls[i].id;
                        ctrl.value = c->controls[i].value;
-                       err = cx18_s_ctrl(file, fh, &ctrl);
+                       err = cx18_s_ctrl(cx, &ctrl);
                        c->controls[i].value = ctrl.value;
                        if (err) {
                                c->error_idx = i;
@@ -287,6 +293,19 @@ int cx18_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
 {
        struct cx18 *cx = ((struct cx18_open_id *)fh)->cx;
 
+       if (c->ctrl_class == V4L2_CTRL_CLASS_USER) {
+               int i;
+               int err = 0;
+
+               for (i = 0; i < c->count; i++) {
+                       err = cx18_try_ctrl(file, fh, &c->controls[i]);
+                       if (err) {
+                               c->error_idx = i;
+                               break;
+                       }
+               }
+               return err;
+       }
        if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG)
                return cx2341x_ext_ctrls(&cx->params,
                                                atomic_read(&cx->ana_capturing),
index 81b8996..e463237 100644 (file)
@@ -22,8 +22,6 @@
  */
 
 int cx18_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *a);
-int cx18_g_ctrl(struct file *file, void *fh, struct v4l2_control *a);
-int cx18_s_ctrl(struct file *file, void *fh, struct v4l2_control *a);
 int cx18_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a);
 int cx18_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a);
 int cx18_try_ext_ctrls(struct file *file, void *fh,
index 017b13e..6eaf77b 100644 (file)
@@ -819,8 +819,6 @@ void cx18_set_funcs(struct video_device *vdev)
        vdev->vidioc_default                 = cx18_default;
        vdev->vidioc_queryctrl               = cx18_queryctrl;
        vdev->vidioc_querymenu               = cx18_querymenu;
-       vdev->vidioc_g_ctrl                  = cx18_g_ctrl;
-       vdev->vidioc_s_ctrl                  = cx18_s_ctrl;
        vdev->vidioc_g_ext_ctrls             = cx18_g_ext_ctrls;
        vdev->vidioc_s_ext_ctrls             = cx18_s_ext_ctrls;
        vdev->vidioc_try_ext_ctrls           = cx18_try_ext_ctrls;
index 6a5b709..48e103b 100644 (file)
@@ -98,10 +98,24 @@ int ivtv_querymenu(struct file *file, void *fh, struct v4l2_querymenu *qmenu)
                        cx2341x_ctrl_get_menu(&itv->params, qmenu->id));
 }
 
-int ivtv_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
+static int ivtv_try_ctrl(struct file *file, void *fh,
+                                       struct v4l2_ext_control *vctrl)
 {
-       struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
+       struct v4l2_queryctrl qctrl;
+       const char **menu_items = NULL;
+       int err;
+
+       qctrl.id = vctrl->id;
+       err = ivtv_queryctrl(file, fh, &qctrl);
+       if (err)
+               return err;
+       if (qctrl.type == V4L2_CTRL_TYPE_MENU)
+               menu_items = v4l2_ctrl_get_menu(qctrl.id);
+       return v4l2_ctrl_check(vctrl, &qctrl, menu_items);
+}
 
+static int ivtv_s_ctrl(struct ivtv *itv, struct v4l2_control *vctrl)
+{
        switch (vctrl->id) {
                /* Standard V4L2 controls */
        case V4L2_CID_BRIGHTNESS:
@@ -125,10 +139,8 @@ int ivtv_s_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
        return 0;
 }
 
-int ivtv_g_ctrl(struct file *file, void *fh, struct v4l2_control *vctrl)
+static int ivtv_g_ctrl(struct ivtv *itv, struct v4l2_control *vctrl)
 {
-       struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
-
        switch (vctrl->id) {
                /* Standard V4L2 controls */
        case V4L2_CID_BRIGHTNESS:
@@ -203,7 +215,7 @@ int ivtv_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
                for (i = 0; i < c->count; i++) {
                        ctrl.id = c->controls[i].id;
                        ctrl.value = c->controls[i].value;
-                       err = ivtv_g_ctrl(file, fh, &ctrl);
+                       err = ivtv_g_ctrl(itv, &ctrl);
                        c->controls[i].value = ctrl.value;
                        if (err) {
                                c->error_idx = i;
@@ -229,7 +241,7 @@ int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
                for (i = 0; i < c->count; i++) {
                        ctrl.id = c->controls[i].id;
                        ctrl.value = c->controls[i].value;
-                       err = ivtv_s_ctrl(file, fh, &ctrl);
+                       err = ivtv_s_ctrl(itv, &ctrl);
                        c->controls[i].value = ctrl.value;
                        if (err) {
                                c->error_idx = i;
@@ -277,6 +289,19 @@ int ivtv_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *c)
 {
        struct ivtv *itv = ((struct ivtv_open_id *)fh)->itv;
 
+       if (c->ctrl_class == V4L2_CTRL_CLASS_USER) {
+               int i;
+               int err = 0;
+
+               for (i = 0; i < c->count; i++) {
+                       err = ivtv_try_ctrl(file, fh, &c->controls[i]);
+                       if (err) {
+                               c->error_idx = i;
+                               break;
+                       }
+               }
+               return err;
+       }
        if (c->ctrl_class == V4L2_CTRL_CLASS_MPEG)
                return cx2341x_ext_ctrls(&itv->params, atomic_read(&itv->capturing), c, VIDIOC_TRY_EXT_CTRLS);
        return -EINVAL;
index 304204b..1c7721e 100644 (file)
@@ -22,8 +22,6 @@
 #define IVTV_CONTROLS_H
 
 int ivtv_queryctrl(struct file *file, void *fh, struct v4l2_queryctrl *a);
-int ivtv_g_ctrl(struct file *file, void *fh, struct v4l2_control *a);
-int ivtv_s_ctrl(struct file *file, void *fh, struct v4l2_control *a);
 int ivtv_g_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a);
 int ivtv_s_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a);
 int ivtv_try_ext_ctrls(struct file *file, void *fh, struct v4l2_ext_controls *a);
index 42443b4..52e00a7 100644 (file)
@@ -692,7 +692,7 @@ static int ivtv_itvc(struct ivtv *itv, unsigned int cmd, void *arg)
 {
        struct v4l2_register *regs = arg;
        unsigned long flags;
-       u8 __iomem *reg_start;
+       volatile u8 __iomem *reg_start;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
@@ -1904,8 +1904,6 @@ void ivtv_set_funcs(struct video_device *vdev)
        vdev->vidioc_default                = ivtv_default;
        vdev->vidioc_queryctrl              = ivtv_queryctrl;
        vdev->vidioc_querymenu              = ivtv_querymenu;
-       vdev->vidioc_g_ctrl                 = ivtv_g_ctrl;
-       vdev->vidioc_s_ctrl                 = ivtv_s_ctrl;
        vdev->vidioc_g_ext_ctrls            = ivtv_g_ext_ctrls;
        vdev->vidioc_s_ext_ctrls            = ivtv_s_ext_ctrls;
        vdev->vidioc_try_ext_ctrls          = ivtv_try_ext_ctrls;