]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
[media] cx23885: Control cleanup on the MPEG Encoder
authorSteven Toth <stoth@kernellabs.com>
Thu, 5 Jan 2012 00:11:55 +0000 (21:11 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 5 Jan 2012 08:53:46 +0000 (06:53 -0200)
Added three new control calls (g_std, querystd and g_ctrl) to
the -417 driver. Also routed other controls through the main
cx23885 driver meaning that the controls for the 417 and the
raw video device all enter the driver code and are handled
in a single place.

Signed-off-by: Steven Toth <stoth@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx23885/cx23885-417.c

index b5afa330dd28a520c838f1e2b73d4e1361617984..3bc07a53d105d6d010aaf933c18f5fdf7b5c8213 100644 (file)
@@ -1212,6 +1212,16 @@ static int cx23885_querymenu(struct cx23885_dev *dev,
                cx2341x_ctrl_get_menu(&dev->mpeg_params, qmenu->id));
 }
 
+static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
+{
+       struct cx23885_fh  *fh  = file->private_data;
+       struct cx23885_dev *dev = fh->dev;
+
+       call_all(dev, core, g_std, id);
+
+       return 0;
+}
+
 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
 {
        struct cx23885_fh  *fh  = file->private_data;
@@ -1224,55 +1234,31 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
        if (i == ARRAY_SIZE(cx23885_tvnorms))
                return -EINVAL;
        dev->encodernorm = cx23885_tvnorms[i];
+
+       /* Have the drier core notify the subdevices */
+       mutex_lock(&dev->lock);
+       cx23885_set_tvnorm(dev, *id);
+       mutex_unlock(&dev->lock);
+
        return 0;
 }
 
 static int vidioc_enum_input(struct file *file, void *priv,
-                               struct v4l2_input *i)
+       struct v4l2_input *i)
 {
-       struct cx23885_fh  *fh  = file->private_data;
-       struct cx23885_dev *dev = fh->dev;
-       struct cx23885_input *input;
-       int n;
-
-       if (i->index >= 4)
-               return -EINVAL;
-
-       input = &cx23885_boards[dev->board].input[i->index];
-
-       if (input->type == 0)
-               return -EINVAL;
-
-       /* FIXME
-        * strcpy(i->name, input->name); */
-       strcpy(i->name, "unset");
-
-       if (input->type == CX23885_VMUX_TELEVISION ||
-           input->type == CX23885_VMUX_CABLE)
-               i->type = V4L2_INPUT_TYPE_TUNER;
-       else
-               i->type  = V4L2_INPUT_TYPE_CAMERA;
-
-       for (n = 0; n < ARRAY_SIZE(cx23885_tvnorms); n++)
-               i->std |= cx23885_tvnorms[n].id;
-       return 0;
+       struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
+       dprintk(1, "%s()\n", __func__);
+       return cx23885_enum_input(dev, i);
 }
 
 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
 {
-       struct cx23885_fh  *fh  = file->private_data;
-       struct cx23885_dev *dev = fh->dev;
-
-       *i = dev->input;
-       return 0;
+       return cx23885_get_input(file, priv, i);
 }
 
 static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
 {
-       if (i >= 4)
-               return -EINVAL;
-
-       return 0;
+       return cx23885_set_input(file, priv, i);
 }
 
 static int vidioc_g_tuner(struct file *file, void *priv,
@@ -1325,43 +1311,25 @@ static int vidioc_g_frequency(struct file *file, void *priv,
 }
 
 static int vidioc_s_frequency(struct file *file, void *priv,
-                               struct v4l2_frequency *f)
+       struct v4l2_frequency *f)
 {
-       struct cx23885_fh  *fh  = file->private_data;
-       struct cx23885_dev *dev = fh->dev;
-
-       cx23885_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0,
-               CX23885_END_NOW, CX23885_MPEG_CAPTURE,
-               CX23885_RAW_BITS_NONE);
-
-       dprintk(1, "VIDIOC_S_FREQUENCY: dev type %d, f\n",
-               dev->tuner_type);
-       dprintk(1, "VIDIOC_S_FREQUENCY: f tuner %d, f type %d\n",
-               f->tuner, f->type);
-       if (UNSET == dev->tuner_type)
-               return -EINVAL;
-       if (f->tuner != 0)
-               return -EINVAL;
-       if (f->type != V4L2_TUNER_ANALOG_TV)
-               return -EINVAL;
-       dev->freq = f->frequency;
-
-       call_all(dev, tuner, s_frequency, f);
+       return cx23885_set_frequency(file, priv, f);
+}
 
-       cx23885_initialize_codec(dev, 0);
+static int vidioc_g_ctrl(struct file *file, void *priv,
+       struct v4l2_control *ctl)
+{
+       struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
 
-       return 0;
+       return cx23885_get_control(dev, ctl);
 }
 
 static int vidioc_s_ctrl(struct file *file, void *priv,
-                               struct v4l2_control *ctl)
+       struct v4l2_control *ctl)
 {
-       struct cx23885_fh  *fh  = file->private_data;
-       struct cx23885_dev *dev = fh->dev;
+       struct cx23885_dev *dev = ((struct cx23885_fh *)priv)->dev;
 
-       /* Update the A/V core */
-       call_all(dev, core, s_ctrl, ctl);
-       return 0;
+       return cx23885_set_control(dev, ctl);
 }
 
 static int vidioc_querycap(struct file *file, void  *priv,
@@ -1693,6 +1661,8 @@ static struct v4l2_file_operations mpeg_fops = {
 };
 
 static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
+       .vidioc_querystd         = vidioc_g_std,
+       .vidioc_g_std            = vidioc_g_std,
        .vidioc_s_std            = vidioc_s_std,
        .vidioc_enum_input       = vidioc_enum_input,
        .vidioc_g_input          = vidioc_g_input,
@@ -1702,6 +1672,7 @@ static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
        .vidioc_g_frequency      = vidioc_g_frequency,
        .vidioc_s_frequency      = vidioc_s_frequency,
        .vidioc_s_ctrl           = vidioc_s_ctrl,
+       .vidioc_g_ctrl           = vidioc_g_ctrl,
        .vidioc_querycap         = vidioc_querycap,
        .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
        .vidioc_g_fmt_vid_cap    = vidioc_g_fmt_vid_cap,