Commit 71c296f6 authored by Hans Verkuil's avatar Hans Verkuil Committed by Dmitry Torokhov
Browse files

Input: synaptics-rmi4 - fix various V4L2 compliance problems in F54



The v4l2-compliance utility reported several V4L2 API compliance
issues:

- the sequence counter wasn't filled in
- the sequence counter wasn't reset to 0 at the start of streaming
- the returned field value wasn't set to V4L2_FIELD_NONE
- the timestamp wasn't set
- the payload size was undefined if an error was returned
- min_buffers_needed doesn't need to be initialized

Fix these issues.

Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: default avatarLucas Stach <l.stach@pengutronix.de>
Link: https://lore.kernel.org/r/20191119105118.54285-3-hverkuil-cisco@xs4all.nl


Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent fc1156f3
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -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,