Commit 49d8ab9f authored by Junghak Sung's avatar Junghak Sung Committed by Mauro Carvalho Chehab

[media] media: videobuf2: Separate vb2_poll()

Separate vb2_poll() into core and v4l2 part.
Signed-off-by: default avatarJunghak Sung <jh1009.sung@samsung.com>
Signed-off-by: default avatarGeunyoung Kim <nenggun.kim@samsung.com>
Acked-by: default avatarSeung-Woo Kim <sw0312.kim@samsung.com>
Acked-by: default avatarInki Dae <inki.dae@samsung.com>
Signed-off-by: default avatarHans Verkuil <hansverk@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 959c3ef3
...@@ -783,7 +783,7 @@ void vb2_queue_release(struct vb2_queue *q) ...@@ -783,7 +783,7 @@ void vb2_queue_release(struct vb2_queue *q)
EXPORT_SYMBOL_GPL(vb2_queue_release); EXPORT_SYMBOL_GPL(vb2_queue_release);
/** /**
* vb2_poll() - implements poll userspace operation * vb2_core_poll() - implements poll userspace operation
* @q: videobuf2 queue * @q: videobuf2 queue
* @file: file argument passed to the poll file operation handler * @file: file argument passed to the poll file operation handler
* @wait: wait argument passed to the poll file operation handler * @wait: wait argument passed to the poll file operation handler
...@@ -795,33 +795,20 @@ EXPORT_SYMBOL_GPL(vb2_queue_release); ...@@ -795,33 +795,20 @@ EXPORT_SYMBOL_GPL(vb2_queue_release);
* For OUTPUT queues, if a buffer is ready to be dequeued, the file descriptor * For OUTPUT queues, if a buffer is ready to be dequeued, the file descriptor
* will be reported as available for writing. * will be reported as available for writing.
* *
* If the driver uses struct v4l2_fh, then vb2_poll() will also check for any
* pending events.
*
* The return values from this function are intended to be directly returned * The return values from this function are intended to be directly returned
* from poll handler in driver. * from poll handler in driver.
*/ */
unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) unsigned int vb2_core_poll(struct vb2_queue *q, struct file *file,
poll_table *wait)
{ {
struct video_device *vfd = video_devdata(file);
unsigned long req_events = poll_requested_events(wait); unsigned long req_events = poll_requested_events(wait);
struct vb2_buffer *vb = NULL; struct vb2_buffer *vb = NULL;
unsigned int res = 0;
unsigned long flags; unsigned long flags;
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
struct v4l2_fh *fh = file->private_data;
if (v4l2_event_pending(fh))
res = POLLPRI;
else if (req_events & POLLPRI)
poll_wait(file, &fh->wait, wait);
}
if (!q->is_output && !(req_events & (POLLIN | POLLRDNORM))) if (!q->is_output && !(req_events & (POLLIN | POLLRDNORM)))
return res; return 0;
if (q->is_output && !(req_events & (POLLOUT | POLLWRNORM))) if (q->is_output && !(req_events & (POLLOUT | POLLWRNORM)))
return res; return 0;
/* /*
* Start file I/O emulator only if streaming API has not been used yet. * Start file I/O emulator only if streaming API has not been used yet.
...@@ -830,16 +817,16 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) ...@@ -830,16 +817,16 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
if (!q->is_output && (q->io_modes & VB2_READ) && if (!q->is_output && (q->io_modes & VB2_READ) &&
(req_events & (POLLIN | POLLRDNORM))) { (req_events & (POLLIN | POLLRDNORM))) {
if (__vb2_init_fileio(q, 1)) if (__vb2_init_fileio(q, 1))
return res | POLLERR; return POLLERR;
} }
if (q->is_output && (q->io_modes & VB2_WRITE) && if (q->is_output && (q->io_modes & VB2_WRITE) &&
(req_events & (POLLOUT | POLLWRNORM))) { (req_events & (POLLOUT | POLLWRNORM))) {
if (__vb2_init_fileio(q, 0)) if (__vb2_init_fileio(q, 0))
return res | POLLERR; return POLLERR;
/* /*
* Write to OUTPUT queue can be done immediately. * Write to OUTPUT queue can be done immediately.
*/ */
return res | POLLOUT | POLLWRNORM; return POLLOUT | POLLWRNORM;
} }
} }
...@@ -848,21 +835,14 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) ...@@ -848,21 +835,14 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
* error flag is set. * error flag is set.
*/ */
if (!vb2_is_streaming(q) || q->error) if (!vb2_is_streaming(q) || q->error)
return res | POLLERR; return POLLERR;
/*
* For compatibility with vb1: if QBUF hasn't been called yet, then
* return POLLERR as well. This only affects capture queues, output
* queues will always initialize waiting_for_buffers to false.
*/
if (q->waiting_for_buffers)
return res | POLLERR;
/* /*
* For output streams you can call write() as long as there are fewer * For output streams you can call write() as long as there are fewer
* buffers queued than there are buffers available. * buffers queued than there are buffers available.
*/ */
if (q->is_output && q->fileio && q->queued_count < q->num_buffers) if (q->is_output && q->fileio && q->queued_count < q->num_buffers)
return res | POLLOUT | POLLWRNORM; return POLLOUT | POLLWRNORM;
if (list_empty(&q->done_list)) { if (list_empty(&q->done_list)) {
/* /*
...@@ -870,7 +850,7 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) ...@@ -870,7 +850,7 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
* return immediately. DQBUF will return -EPIPE. * return immediately. DQBUF will return -EPIPE.
*/ */
if (q->last_buffer_dequeued) if (q->last_buffer_dequeued)
return res | POLLIN | POLLRDNORM; return POLLIN | POLLRDNORM;
poll_wait(file, &q->done_wq, wait); poll_wait(file, &q->done_wq, wait);
} }
...@@ -887,10 +867,55 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) ...@@ -887,10 +867,55 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
if (vb && (vb->state == VB2_BUF_STATE_DONE if (vb && (vb->state == VB2_BUF_STATE_DONE
|| vb->state == VB2_BUF_STATE_ERROR)) { || vb->state == VB2_BUF_STATE_ERROR)) {
return (q->is_output) ? return (q->is_output) ?
res | POLLOUT | POLLWRNORM : POLLOUT | POLLWRNORM :
res | POLLIN | POLLRDNORM; POLLIN | POLLRDNORM;
} }
return res; return 0;
}
/**
* vb2_poll() - implements poll userspace operation
* @q: videobuf2 queue
* @file: file argument passed to the poll file operation handler
* @wait: wait argument passed to the poll file operation handler
*
* This function implements poll file operation handler for a driver.
* For CAPTURE queues, if a buffer is ready to be dequeued, the userspace will
* be informed that the file descriptor of a video device is available for
* reading.
* For OUTPUT queues, if a buffer is ready to be dequeued, the file descriptor
* will be reported as available for writing.
*
* If the driver uses struct v4l2_fh, then vb2_poll() will also check for any
* pending events.
*
* The return values from this function are intended to be directly returned
* from poll handler in driver.
*/
unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
{
struct video_device *vfd = video_devdata(file);
unsigned long req_events = poll_requested_events(wait);
unsigned int res = 0;
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
struct v4l2_fh *fh = file->private_data;
if (v4l2_event_pending(fh))
res = POLLPRI;
else if (req_events & POLLPRI)
poll_wait(file, &fh->wait, wait);
}
/*
* For compatibility with vb1: if QBUF hasn't been called yet, then
* return POLLERR as well. This only affects capture queues, output
* queues will always initialize waiting_for_buffers to false.
*/
if (q->waiting_for_buffers && (req_events & (POLLIN | POLLRDNORM)))
return POLLERR;
return res | vb2_core_poll(q, file, wait);
} }
EXPORT_SYMBOL_GPL(vb2_poll); EXPORT_SYMBOL_GPL(vb2_poll);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment