Input: synaptics-rmi4 - fix various V4L2 compliance problems in F54
[sfrench/cifs-2.6.git] / drivers / input / rmi4 / rmi_f54.c
index 514f5568b74d3e6873f7cdcc64c62d95715a7f81..5a3bf07e98f487fa76a1948a1d564c84f4b18406 100644 (file)
@@ -110,6 +110,7 @@ struct f54_data {
        struct video_device vdev;
        struct vb2_queue queue;
        struct mutex lock;
+       u32 sequence;
        int input;
        enum rmi_f54_report_type inputs[F54_MAX_REPORT_TYPE];
 };
@@ -284,6 +285,7 @@ static int rmi_f54_queue_setup(struct vb2_queue *q, unsigned int *nbuffers,
 
 static void rmi_f54_buffer_queue(struct vb2_buffer *vb)
 {
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
        struct f54_data *f54 = vb2_get_drv_priv(vb->vb2_queue);
        u16 *ptr;
        enum vb2_buffer_state state;
@@ -292,6 +294,7 @@ static void rmi_f54_buffer_queue(struct vb2_buffer *vb)
 
        mutex_lock(&f54->status_mutex);
 
+       vb2_set_plane_payload(vb, 0, 0);
        reptype = rmi_f54_get_reptype(f54, f54->input);
        if (reptype == F54_REPORT_NONE) {
                state = VB2_BUF_STATE_ERROR;
@@ -338,14 +341,25 @@ static void rmi_f54_buffer_queue(struct vb2_buffer *vb)
 data_done:
        mutex_unlock(&f54->data_mutex);
 done:
+       vb->timestamp = ktime_get_ns();
+       vbuf->field = V4L2_FIELD_NONE;
+       vbuf->sequence = f54->sequence++;
        vb2_buffer_done(vb, state);
        mutex_unlock(&f54->status_mutex);
 }
 
+static void rmi_f54_stop_streaming(struct vb2_queue *q)
+{
+       struct f54_data *f54 = vb2_get_drv_priv(q);
+
+       f54->sequence = 0;
+}
+
 /* V4L2 structures */
 static const struct vb2_ops rmi_f54_queue_ops = {
        .queue_setup            = rmi_f54_queue_setup,
        .buf_queue              = rmi_f54_buffer_queue,
+       .stop_streaming         = rmi_f54_stop_streaming,
        .wait_prepare           = vb2_ops_wait_prepare,
        .wait_finish            = vb2_ops_wait_finish,
 };
@@ -357,7 +371,6 @@ static const struct vb2_queue rmi_f54_queue = {
        .ops = &rmi_f54_queue_ops,
        .mem_ops = &vb2_vmalloc_memops,
        .timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
-       .min_buffers_needed = 1,
 };
 
 static int rmi_f54_vidioc_querycap(struct file *file, void *priv,