Commit 6294513d authored by Daniel Scheller's avatar Daniel Scheller Committed by Mauro Carvalho Chehab

media: ngene: add proper polling to the dvbdev_ci file ops

Implement the poll callback for the dvbdev_ci file ops. The ts_poll()
function queries the DVB ring buffers for available data and space, and
reports this as appropriate. Also, set the dvb_device readers, writers
and users to proper values (one reader, one writer, two users).

This fixes the raw CI TS transport in conjunction with TVheadend's
DDCI functionality.
Signed-off-by: default avatarDaniel Scheller <d.scheller@gmx.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 96c7bc8c
......@@ -84,18 +84,41 @@ static ssize_t ts_read(struct file *file, char __user *buf,
return count;
}
static __poll_t ts_poll(struct file *file, poll_table *wait)
{
struct dvb_device *dvbdev = file->private_data;
struct ngene_channel *chan = dvbdev->priv;
struct ngene *dev = chan->dev;
struct dvb_ringbuffer *rbuf = &dev->tsin_rbuf;
struct dvb_ringbuffer *wbuf = &dev->tsout_rbuf;
__poll_t mask = 0;
poll_wait(file, &rbuf->queue, wait);
poll_wait(file, &wbuf->queue, wait);
if (!dvb_ringbuffer_empty(rbuf))
mask |= EPOLLIN | EPOLLRDNORM;
if (dvb_ringbuffer_free(wbuf) >= 188)
mask |= EPOLLOUT | EPOLLWRNORM;
return mask;
}
static const struct file_operations ci_fops = {
.owner = THIS_MODULE,
.read = ts_read,
.write = ts_write,
.open = dvb_generic_open,
.release = dvb_generic_release,
.poll = ts_poll,
.mmap = NULL,
};
struct dvb_device ngene_dvbdev_ci = {
.readers = -1,
.writers = -1,
.users = -1,
.priv = NULL,
.readers = 1,
.writers = 1,
.users = 2,
.fops = &ci_fops,
};
......
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