]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/media/video/fsl-viu.c
Merge branch 'master' into tk71
[mv-sheeva.git] / drivers / media / video / fsl-viu.c
index 43d208f1f586bd1592beacce7d9c96fa999b9596..e4bba88254c7940708047d596195cb0c935e1ce4 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/of_platform.h>
+#include <linux/slab.h>
 #include <linux/version.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-device.h>
@@ -193,6 +194,8 @@ struct viu_dev {
 
        /* decoder */
        struct v4l2_subdev      *decoder;
+
+       v4l2_std_id             std;
 };
 
 struct viu_fh {
@@ -425,7 +428,7 @@ static void free_buffer(struct videobuf_queue *vq, struct viu_buf *buf)
 
        BUG_ON(in_interrupt());
 
-       videobuf_waiton(&buf->vb, 0, 0);
+       videobuf_waiton(vq, &buf->vb, 0, 0);
 
        if (vq->int_ops && vq->int_ops->vaddr)
                vaddr = vq->int_ops->vaddr(vb);
@@ -914,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);
 }
 
@@ -926,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)
@@ -1287,7 +1311,7 @@ static int viu_open(struct file *file)
        videobuf_queue_dma_contig_init(&fh->vb_vidq, &viu_video_qops,
                                       dev->dev, &fh->vbq_lock,
                                       fh->type, V4L2_FIELD_INTERLACED,
-                                      sizeof(struct viu_buf), fh);
+                                      sizeof(struct viu_buf), fh, NULL);
        return 0;
 }
 
@@ -1330,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);
 
@@ -1396,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,
@@ -1485,7 +1512,7 @@ static int __devinit viu_of_probe(struct platform_device *op,
 
        ad = i2c_get_adapter(0);
        viu_dev->decoder = v4l2_i2c_new_subdev(&viu_dev->v4l2_dev, ad,
-                       "saa7115", "saa7113", VIU_VIDEO_DECODER_ADDR, NULL);
+                       "saa7113", VIU_VIDEO_DECODER_ADDR, NULL);
 
        viu_dev->vidq.timeout.function = viu_vid_timeout;
        viu_dev->vidq.timeout.data     = (unsigned long)viu_dev;