These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / platform / vivid / vivid-vid-cap.c
index dab5990..ef54123 100644 (file)
@@ -40,7 +40,6 @@ static const struct v4l2_fract
 
 static const struct vivid_fmt formats_ovl[] = {
        {
-               .name     = "RGB565 (LE)",
                .fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
                .vdownsampling = { 1 },
                .bit_depth = { 16 },
@@ -48,7 +47,6 @@ static const struct vivid_fmt formats_ovl[] = {
                .buffers = 1,
        },
        {
-               .name     = "XRGB555 (LE)",
                .fourcc   = V4L2_PIX_FMT_XRGB555, /* gggbbbbb arrrrrgg */
                .vdownsampling = { 1 },
                .bit_depth = { 16 },
@@ -56,7 +54,6 @@ static const struct vivid_fmt formats_ovl[] = {
                .buffers = 1,
        },
        {
-               .name     = "ARGB555 (LE)",
                .fourcc   = V4L2_PIX_FMT_ARGB555, /* gggbbbbb arrrrrgg */
                .vdownsampling = { 1 },
                .bit_depth = { 16 },
@@ -66,7 +63,7 @@ static const struct vivid_fmt formats_ovl[] = {
 };
 
 /* The number of discrete webcam framesizes */
-#define VIVID_WEBCAM_SIZES 3
+#define VIVID_WEBCAM_SIZES 4
 /* The number of discrete webcam frameintervals */
 #define VIVID_WEBCAM_IVALS (VIVID_WEBCAM_SIZES * 2)
 
@@ -75,6 +72,7 @@ static const struct v4l2_frmsize_discrete webcam_sizes[VIVID_WEBCAM_SIZES] = {
        {  320, 180 },
        {  640, 360 },
        { 1280, 720 },
+       { 1920, 1080 },
 };
 
 /*
@@ -82,6 +80,8 @@ static const struct v4l2_frmsize_discrete webcam_sizes[VIVID_WEBCAM_SIZES] = {
  * elements in this array as there are in webcam_sizes.
  */
 static const struct v4l2_fract webcam_intervals[VIVID_WEBCAM_IVALS] = {
+       {  1, 2 },
+       {  1, 5 },
        {  1, 10 },
        {  1, 15 },
        {  1, 25 },
@@ -95,10 +95,11 @@ static const struct v4l2_discrete_probe webcam_probe = {
        VIVID_WEBCAM_SIZES
 };
 
-static int vid_cap_queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,
+static int vid_cap_queue_setup(struct vb2_queue *vq, const void *parg,
                       unsigned *nbuffers, unsigned *nplanes,
                       unsigned sizes[], void *alloc_ctxs[])
 {
+       const struct v4l2_format *fmt = parg;
        struct vivid_dev *dev = vb2_get_drv_priv(vq);
        unsigned buffers = tpg_g_buffers(&dev->tpg);
        unsigned h = dev->fmt_cap_rect.height;
@@ -198,7 +199,7 @@ static int vid_cap_buf_prepare(struct vb2_buffer *vb)
                }
 
                vb2_set_plane_payload(vb, p, size);
-               vb->v4l2_planes[p].data_offset = dev->fmt_cap->data_offset[p];
+               vb->planes[p].data_offset = dev->fmt_cap->data_offset[p];
        }
 
        return 0;
@@ -206,10 +207,11 @@ static int vid_cap_buf_prepare(struct vb2_buffer *vb)
 
 static void vid_cap_buf_finish(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
-       struct v4l2_timecode *tc = &vb->v4l2_buf.timecode;
+       struct v4l2_timecode *tc = &vbuf->timecode;
        unsigned fps = 25;
-       unsigned seq = vb->v4l2_buf.sequence;
+       unsigned seq = vbuf->sequence;
 
        if (!vivid_is_sdtv_cap(dev))
                return;
@@ -218,7 +220,7 @@ static void vid_cap_buf_finish(struct vb2_buffer *vb)
         * Set the timecode. Rarely used, so it is interesting to
         * test this.
         */
-       vb->v4l2_buf.flags |= V4L2_BUF_FLAG_TIMECODE;
+       vbuf->flags |= V4L2_BUF_FLAG_TIMECODE;
        if (dev->std_cap & V4L2_STD_525_60)
                fps = 30;
        tc->type = (fps == 30) ? V4L2_TC_TYPE_30FPS : V4L2_TC_TYPE_25FPS;
@@ -231,8 +233,9 @@ static void vid_cap_buf_finish(struct vb2_buffer *vb)
 
 static void vid_cap_buf_queue(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
-       struct vivid_buffer *buf = container_of(vb, struct vivid_buffer, vb);
+       struct vivid_buffer *buf = container_of(vbuf, struct vivid_buffer, vb);
 
        dprintk(dev, 1, "%s\n", __func__);
 
@@ -268,7 +271,8 @@ static int vid_cap_start_streaming(struct vb2_queue *vq, unsigned count)
 
                list_for_each_entry_safe(buf, tmp, &dev->vid_cap_active, list) {
                        list_del(&buf->list);
-                       vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED);
+                       vb2_buffer_done(&buf->vb.vb2_buf,
+                                       VB2_BUF_STATE_QUEUED);
                }
        }
        return err;
@@ -501,6 +505,13 @@ static unsigned vivid_colorspace_cap(struct vivid_dev *dev)
        return dev->colorspace_out;
 }
 
+static unsigned vivid_xfer_func_cap(struct vivid_dev *dev)
+{
+       if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
+               return tpg_g_xfer_func(&dev->tpg);
+       return dev->xfer_func_out;
+}
+
 static unsigned vivid_ycbcr_enc_cap(struct vivid_dev *dev)
 {
        if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
@@ -527,6 +538,7 @@ int vivid_g_fmt_vid_cap(struct file *file, void *priv,
        mp->field        = dev->field_cap;
        mp->pixelformat  = dev->fmt_cap->fourcc;
        mp->colorspace   = vivid_colorspace_cap(dev);
+       mp->xfer_func    = vivid_xfer_func_cap(dev);
        mp->ycbcr_enc    = vivid_ycbcr_enc_cap(dev);
        mp->quantization = vivid_quantization_cap(dev);
        mp->num_planes = dev->fmt_cap->buffers;
@@ -616,6 +628,7 @@ int vivid_try_fmt_vid_cap(struct file *file, void *priv,
        }
        mp->colorspace = vivid_colorspace_cap(dev);
        mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev);
+       mp->xfer_func = vivid_xfer_func_cap(dev);
        mp->quantization = vivid_quantization_cap(dev);
        memset(mp->reserved, 0, sizeof(mp->reserved));
        return 0;
@@ -720,8 +733,8 @@ int vivid_s_fmt_vid_cap(struct file *file, void *priv,
                                        webcam_sizes[i].height == mp->height)
                                break;
                dev->webcam_size_idx = i;
-               if (dev->webcam_ival_idx >= 2 * (3 - i))
-                       dev->webcam_ival_idx = 2 * (3 - i) - 1;
+               if (dev->webcam_ival_idx >= 2 * (VIVID_WEBCAM_SIZES - i))
+                       dev->webcam_ival_idx = 2 * (VIVID_WEBCAM_SIZES - i) - 1;
                vivid_update_format_cap(dev, false);
        } else {
                struct v4l2_rect r = { 0, 0, mp->width, mp->height };
@@ -1030,7 +1043,6 @@ int vidioc_enum_fmt_vid_overlay(struct file *file, void  *priv,
 
        fmt = &formats_ovl[f->index];
 
-       strlcpy(f->description, fmt->name, sizeof(f->description));
        f->pixelformat = fmt->fourcc;
        return 0;
 }
@@ -1619,8 +1631,8 @@ static bool valid_cvt_gtf_timings(struct v4l2_dv_timings *timings)
        h_freq = (u32)bt->pixelclock / total_h_pixel;
 
        if (bt->standards == 0 || (bt->standards & V4L2_DV_BT_STD_CVT)) {
-               if (v4l2_detect_cvt(total_v_lines, h_freq, bt->vsync,
-                                   bt->polarities, timings))
+               if (v4l2_detect_cvt(total_v_lines, h_freq, bt->vsync, bt->width,
+                                   bt->polarities, bt->interlaced, timings))
                        return true;
        }
 
@@ -1631,7 +1643,8 @@ static bool valid_cvt_gtf_timings(struct v4l2_dv_timings *timings)
                                  &aspect_ratio.numerator,
                                  &aspect_ratio.denominator);
                if (v4l2_detect_gtf(total_v_lines, h_freq, bt->vsync,
-                                   bt->polarities, aspect_ratio, timings))
+                                   bt->polarities, bt->interlaced,
+                                   aspect_ratio, timings))
                        return true;
        }
        return false;
@@ -1768,7 +1781,7 @@ int vidioc_enum_frameintervals(struct file *file, void *priv,
                        break;
        if (i == ARRAY_SIZE(webcam_sizes))
                return -EINVAL;
-       if (fival->index >= 2 * (3 - i))
+       if (fival->index >= 2 * (VIVID_WEBCAM_SIZES - i))
                return -EINVAL;
        fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
        fival->discrete = webcam_intervals[fival->index];
@@ -1798,7 +1811,7 @@ int vivid_vid_cap_s_parm(struct file *file, void *priv,
                          struct v4l2_streamparm *parm)
 {
        struct vivid_dev *dev = video_drvdata(file);
-       unsigned ival_sz = 2 * (3 - dev->webcam_size_idx);
+       unsigned ival_sz = 2 * (VIVID_WEBCAM_SIZES - dev->webcam_size_idx);
        struct v4l2_fract tpf;
        unsigned i;