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: Hans Verkuil <hverkuil-cisco@xs4all.nl> Reviewed-by: Lucas Stach <l.stach@pengutronix.de Link: https://lore.kernel.org/r/20191119105118.54285-3-hverkuil-cisco@xs4all.nl Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
fc1156f373
commit
71c296f6d5
@ -110,6 +110,7 @@ struct f54_data {
|
|||||||
struct video_device vdev;
|
struct video_device vdev;
|
||||||
struct vb2_queue queue;
|
struct vb2_queue queue;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
|
u32 sequence;
|
||||||
int input;
|
int input;
|
||||||
enum rmi_f54_report_type inputs[F54_MAX_REPORT_TYPE];
|
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)
|
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);
|
struct f54_data *f54 = vb2_get_drv_priv(vb->vb2_queue);
|
||||||
u16 *ptr;
|
u16 *ptr;
|
||||||
enum vb2_buffer_state state;
|
enum vb2_buffer_state state;
|
||||||
@ -292,6 +294,7 @@ static void rmi_f54_buffer_queue(struct vb2_buffer *vb)
|
|||||||
|
|
||||||
mutex_lock(&f54->status_mutex);
|
mutex_lock(&f54->status_mutex);
|
||||||
|
|
||||||
|
vb2_set_plane_payload(vb, 0, 0);
|
||||||
reptype = rmi_f54_get_reptype(f54, f54->input);
|
reptype = rmi_f54_get_reptype(f54, f54->input);
|
||||||
if (reptype == F54_REPORT_NONE) {
|
if (reptype == F54_REPORT_NONE) {
|
||||||
state = VB2_BUF_STATE_ERROR;
|
state = VB2_BUF_STATE_ERROR;
|
||||||
@ -338,14 +341,25 @@ static void rmi_f54_buffer_queue(struct vb2_buffer *vb)
|
|||||||
data_done:
|
data_done:
|
||||||
mutex_unlock(&f54->data_mutex);
|
mutex_unlock(&f54->data_mutex);
|
||||||
done:
|
done:
|
||||||
|
vb->timestamp = ktime_get_ns();
|
||||||
|
vbuf->field = V4L2_FIELD_NONE;
|
||||||
|
vbuf->sequence = f54->sequence++;
|
||||||
vb2_buffer_done(vb, state);
|
vb2_buffer_done(vb, state);
|
||||||
mutex_unlock(&f54->status_mutex);
|
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 */
|
/* V4L2 structures */
|
||||||
static const struct vb2_ops rmi_f54_queue_ops = {
|
static const struct vb2_ops rmi_f54_queue_ops = {
|
||||||
.queue_setup = rmi_f54_queue_setup,
|
.queue_setup = rmi_f54_queue_setup,
|
||||||
.buf_queue = rmi_f54_buffer_queue,
|
.buf_queue = rmi_f54_buffer_queue,
|
||||||
|
.stop_streaming = rmi_f54_stop_streaming,
|
||||||
.wait_prepare = vb2_ops_wait_prepare,
|
.wait_prepare = vb2_ops_wait_prepare,
|
||||||
.wait_finish = vb2_ops_wait_finish,
|
.wait_finish = vb2_ops_wait_finish,
|
||||||
};
|
};
|
||||||
@ -357,7 +371,6 @@ static const struct vb2_queue rmi_f54_queue = {
|
|||||||
.ops = &rmi_f54_queue_ops,
|
.ops = &rmi_f54_queue_ops,
|
||||||
.mem_ops = &vb2_vmalloc_memops,
|
.mem_ops = &vb2_vmalloc_memops,
|
||||||
.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
|
.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC,
|
||||||
.min_buffers_needed = 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rmi_f54_vidioc_querycap(struct file *file, void *priv,
|
static int rmi_f54_vidioc_querycap(struct file *file, void *priv,
|
||||||
|
Loading…
Reference in New Issue
Block a user