These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / platform / s3c-camif / camif-capture.c
index f6a61b9..537b858 100644 (file)
@@ -34,7 +34,7 @@
 #include <media/v4l2-ctrls.h>
 #include <media/v4l2-event.h>
 #include <media/v4l2-ioctl.h>
-#include <media/videobuf2-core.h>
+#include <media/videobuf2-v4l2.h>
 #include <media/videobuf2-dma-contig.h>
 
 #include "camif-core.h"
@@ -115,7 +115,7 @@ static int sensor_set_power(struct camif_dev *camif, int on)
        struct cam_sensor *sensor = &camif->sensor;
        int err = 0;
 
-       if (!on == camif->sensor.power_count)
+       if (camif->sensor.power_count == !on)
                err = v4l2_subdev_call(sensor->sd, core, s_power, on);
        if (!err)
                sensor->power_count += on ? 1 : -1;
@@ -131,7 +131,7 @@ static int sensor_set_streaming(struct camif_dev *camif, int on)
        struct cam_sensor *sensor = &camif->sensor;
        int err = 0;
 
-       if (!on == camif->sensor.stream_count)
+       if (camif->sensor.stream_count == !on)
                err = v4l2_subdev_call(sensor->sd, video, s_stream, on);
        if (!err)
                sensor->stream_count += on ? 1 : -1;
@@ -164,12 +164,12 @@ static int camif_reinitialize(struct camif_vp *vp)
        /* Release unused buffers */
        while (!list_empty(&vp->pending_buf_q)) {
                buf = camif_pending_queue_pop(vp);
-               vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
+               vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
        }
 
        while (!list_empty(&vp->active_buf_q)) {
                buf = camif_active_queue_pop(vp);
-               vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR);
+               vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
        }
 
        spin_unlock_irqrestore(&camif->slock, flags);
@@ -328,25 +328,19 @@ irqreturn_t s3c_camif_irq_handler(int irq, void *priv)
            !list_empty(&vp->active_buf_q)) {
                unsigned int index;
                struct camif_buffer *vbuf;
-               struct timeval *tv;
-               struct timespec ts;
                /*
                 * Get previous DMA write buffer index:
                 * 0 => DMA buffer 0, 2;
                 * 1 => DMA buffer 1, 3.
                 */
                index = (CISTATUS_FRAMECNT(status) + 2) & 1;
-
-               ktime_get_ts(&ts);
                vbuf = camif_active_queue_peek(vp, index);
 
                if (!WARN_ON(vbuf == NULL)) {
                        /* Dequeue a filled buffer */
-                       tv = &vbuf->vb.v4l2_buf.timestamp;
-                       tv->tv_sec = ts.tv_sec;
-                       tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC;
-                       vbuf->vb.v4l2_buf.sequence = vp->frame_sequence++;
-                       vb2_buffer_done(&vbuf->vb, VB2_BUF_STATE_DONE);
+                       v4l2_get_timestamp(&vbuf->vb.timestamp);
+                       vbuf->vb.sequence = vp->frame_sequence++;
+                       vb2_buffer_done(&vbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
 
                        /* Set up an empty buffer at the DMA engine */
                        vbuf = camif_pending_queue_pop(vp);
@@ -441,27 +435,31 @@ static void stop_streaming(struct vb2_queue *vq)
        camif_stop_capture(vp);
 }
 
-static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *pfmt,
+static int queue_setup(struct vb2_queue *vq, const void *parg,
                       unsigned int *num_buffers, unsigned int *num_planes,
                       unsigned int sizes[], void *allocators[])
 {
+       const struct v4l2_format *pfmt = parg;
        const struct v4l2_pix_format *pix = NULL;
        struct camif_vp *vp = vb2_get_drv_priv(vq);
        struct camif_dev *camif = vp->camif;
        struct camif_frame *frame = &vp->out_frame;
-       const struct camif_fmt *fmt = vp->out_fmt;
+       const struct camif_fmt *fmt;
        unsigned int size;
 
        if (pfmt) {
                pix = &pfmt->fmt.pix;
                fmt = s3c_camif_find_format(vp, &pix->pixelformat, -1);
+               if (fmt == NULL)
+                       return -EINVAL;
                size = (pix->width * pix->height * fmt->depth) / 8;
        } else {
+               fmt = vp->out_fmt;
+               if (fmt == NULL)
+                       return -EINVAL;
                size = (frame->f_width * frame->f_height * fmt->depth) / 8;
        }
 
-       if (fmt == NULL)
-               return -EINVAL;
        *num_planes = 1;
 
        if (pix)
@@ -493,13 +491,14 @@ static int buffer_prepare(struct vb2_buffer *vb)
 
 static void buffer_queue(struct vb2_buffer *vb)
 {
-       struct camif_buffer *buf = container_of(vb, struct camif_buffer, vb);
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
+       struct camif_buffer *buf = container_of(vbuf, struct camif_buffer, vb);
        struct camif_vp *vp = vb2_get_drv_priv(vb->vb2_queue);
        struct camif_dev *camif = vp->camif;
        unsigned long flags;
 
        spin_lock_irqsave(&camif->slock, flags);
-       WARN_ON(camif_prepare_addr(vp, &buf->vb, &buf->paddr));
+       WARN_ON(camif_prepare_addr(vp, &buf->vb.vb2_buf, &buf->paddr));
 
        if (!(vp->state & ST_VP_STREAMING) && vp->active_buffers < 2) {
                /* Schedule an empty buffer in H/W */