Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux.git] / drivers / media / platform / ti-vpe / vpe.c
index 93d1a85c9f45778232eac3fcfc69f008cc5bdb02..5c421886d97c86d6518fa142f73c1c2ddb6b83b5 100644 (file)
@@ -1280,18 +1280,17 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
        s_buf = &s_vb->v4l2_buf;
        d_buf = &d_vb->v4l2_buf;
 
+       d_buf->flags = s_buf->flags;
+
        d_buf->timestamp = s_buf->timestamp;
-       d_buf->flags &= ~V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
-       d_buf->flags |= s_buf->flags & V4L2_BUF_FLAG_TSTAMP_SRC_MASK;
-       if (s_buf->flags & V4L2_BUF_FLAG_TIMECODE) {
-               d_buf->flags |= V4L2_BUF_FLAG_TIMECODE;
+       if (s_buf->flags & V4L2_BUF_FLAG_TIMECODE)
                d_buf->timecode = s_buf->timecode;
-       }
+
        d_buf->sequence = ctx->sequence;
-       d_buf->field = ctx->field;
 
        d_q_data = &ctx->q_data[Q_DATA_DST];
        if (d_q_data->flags & Q_DATA_INTERLACED) {
+               d_buf->field = ctx->field;
                if (ctx->field == V4L2_FIELD_BOTTOM) {
                        ctx->sequence++;
                        ctx->field = V4L2_FIELD_TOP;
@@ -1300,6 +1299,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
                        ctx->field = V4L2_FIELD_BOTTOM;
                }
        } else {
+               d_buf->field = V4L2_FIELD_NONE;
                ctx->sequence++;
        }
 
@@ -1338,8 +1338,9 @@ static int vpe_querycap(struct file *file, void *priv,
 {
        strncpy(cap->driver, VPE_MODULE_NAME, sizeof(cap->driver) - 1);
        strncpy(cap->card, VPE_MODULE_NAME, sizeof(cap->card) - 1);
-       strlcpy(cap->bus_info, VPE_MODULE_NAME, sizeof(cap->bus_info));
-       cap->device_caps  = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
+       snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
+               VPE_MODULE_NAME);
+       cap->device_caps  = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING;
        cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
        return 0;
 }
@@ -1479,6 +1480,7 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f,
                }
        }
 
+       memset(pix->reserved, 0, sizeof(pix->reserved));
        for (i = 0; i < pix->num_planes; i++) {
                plane_fmt = &pix->plane_fmt[i];
                depth = fmt->vpdma_fmt[i]->depth;
@@ -1490,6 +1492,8 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f,
 
                plane_fmt->sizeimage =
                                (pix->height * pix->width * depth) >> 3;
+
+               memset(plane_fmt->reserved, 0, sizeof(plane_fmt->reserved));
        }
 
        return 0;
@@ -1720,6 +1724,16 @@ static int vpe_buf_prepare(struct vb2_buffer *vb)
        q_data = get_q_data(ctx, vb->vb2_queue->type);
        num_planes = q_data->fmt->coplanar ? 2 : 1;
 
+       if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+               if (!(q_data->flags & Q_DATA_INTERLACED)) {
+                       vb->v4l2_buf.field = V4L2_FIELD_NONE;
+               } else {
+                       if (vb->v4l2_buf.field != V4L2_FIELD_TOP &&
+                                       vb->v4l2_buf.field != V4L2_FIELD_BOTTOM)
+                               return -EINVAL;
+               }
+       }
+
        for (i = 0; i < num_planes; i++) {
                if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
                        vpe_err(ctx->dev,
@@ -1869,9 +1883,11 @@ static int vpe_open(struct file *file)
        s_q_data->fmt = &vpe_formats[2];
        s_q_data->width = 1920;
        s_q_data->height = 1080;
-       s_q_data->sizeimage[VPE_LUMA] = (s_q_data->width * s_q_data->height *
+       s_q_data->bytesperline[VPE_LUMA] = (s_q_data->width *
                        s_q_data->fmt->vpdma_fmt[VPE_LUMA]->depth) >> 3;
-       s_q_data->colorspace = V4L2_COLORSPACE_SMPTE170M;
+       s_q_data->sizeimage[VPE_LUMA] = (s_q_data->bytesperline[VPE_LUMA] *
+                       s_q_data->height);
+       s_q_data->colorspace = V4L2_COLORSPACE_REC709;
        s_q_data->field = V4L2_FIELD_NONE;
        s_q_data->c_rect.left = 0;
        s_q_data->c_rect.top = 0;