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;
        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,
 }
 
 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,
 };
 
 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,
        .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,