Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-block.git] / drivers / media / video / fsl-viu.c
index b8faff2dd711c7d2c014813996da862106f48d2c..e4bba88254c7940708047d596195cb0c935e1ce4 100644 (file)
@@ -194,6 +194,8 @@ struct viu_dev {
 
        /* decoder */
        struct v4l2_subdev      *decoder;
+
+       v4l2_std_id             std;
 };
 
 struct viu_fh {
@@ -915,6 +917,8 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i)
        if (fh->type != i)
                return -EINVAL;
 
+       viu_start_dma(fh->dev);
+
        return videobuf_streamon(&fh->vb_vidq);
 }
 
@@ -927,20 +931,39 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i)
        if (fh->type != i)
                return -EINVAL;
 
+       viu_stop_dma(fh->dev);
+
        return videobuf_streamoff(&fh->vb_vidq);
 }
 
 #define decoder_call(viu, o, f, args...) \
        v4l2_subdev_call(viu->decoder, o, f, ##args)
 
+static int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *std_id)
+{
+       struct viu_fh *fh = priv;
+
+       decoder_call(fh->dev, video, querystd, std_id);
+       return 0;
+}
+
 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *id)
 {
        struct viu_fh *fh = priv;
 
+       fh->dev->std = *id;
        decoder_call(fh->dev, core, s_std, *id);
        return 0;
 }
 
+static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *std_id)
+{
+       struct viu_fh *fh = priv;
+
+       *std_id = fh->dev->std;
+       return 0;
+}
+
 /* only one input in this driver */
 static int vidioc_enum_input(struct file *file, void *priv,
                                        struct v4l2_input *inp)
@@ -1331,6 +1354,7 @@ static int viu_release(struct file *file)
 
        viu_stop_dma(dev);
        videobuf_stop(&fh->vb_vidq);
+       videobuf_mmap_free(&fh->vb_vidq);
 
        kfree(fh);
 
@@ -1397,7 +1421,9 @@ static const struct v4l2_ioctl_ops viu_ioctl_ops = {
        .vidioc_querybuf      = vidioc_querybuf,
        .vidioc_qbuf          = vidioc_qbuf,
        .vidioc_dqbuf         = vidioc_dqbuf,
+       .vidioc_g_std         = vidioc_g_std,
        .vidioc_s_std         = vidioc_s_std,
+       .vidioc_querystd      = vidioc_querystd,
        .vidioc_enum_input    = vidioc_enum_input,
        .vidioc_g_input       = vidioc_g_input,
        .vidioc_s_input       = vidioc_s_input,