summaryrefslogtreecommitdiff
path: root/meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch')
-rw-r--r--meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch198
1 files changed, 198 insertions, 0 deletions
diff --git a/meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch b/meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch
new file mode 100644
index 0000000..a2e9eef
--- /dev/null
+++ b/meta-bsp/recipes-kernel/linux/linux-vuplus-4.1.45/linux_dvb-core.patch
@@ -0,0 +1,198 @@
+diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
+index d0e3f9d..d060019 100644
+--- a/drivers/media/dvb-core/dmxdev.c
++++ b/drivers/media/dvb-core/dmxdev.c
+@@ -82,7 +82,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
+
+ ret = wait_event_interruptible(src->queue,
+ !dvb_ringbuffer_empty(src) ||
+- (src->error != 0));
++ (src->error != 0) ||
++ (src->do_wait != 1));
++ if (src->do_wait != 1)
++ ret = -EINTR;
++
+ if (ret < 0)
+ break;
+
+@@ -955,6 +959,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
+ return ret;
+ }
+
++static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
++{
++ int ret;
++
++ dmxdevfilter->buffer.do_wait = 0;
++
++ if (waitqueue_active(&dmxdevfilter->buffer.queue))
++ wake_up(&dmxdevfilter->buffer.queue);
++
++ ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
++
++ dmxdevfilter->buffer.do_wait = 1;
++
++ return ret;
++}
++
+ static int dvb_demux_do_ioctl(struct file *file,
+ unsigned int cmd, void *parg)
+ {
+@@ -968,7 +988,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+
+ switch (cmd) {
+ case DMX_START:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -980,7 +1000,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_STOP:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -989,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_FILTER:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -998,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_PES_FILTER:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -1007,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_SET_BUFFER_SIZE:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ mutex_unlock(&dmxdev->mutex);
+ return -ERESTARTSYS;
+ }
+@@ -1051,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_ADD_PID:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ ret = -ERESTARTSYS;
+ break;
+ }
+@@ -1060,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
+ break;
+
+ case DMX_REMOVE_PID:
+- if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
++ if (dvb_demux_lock_filter(dmxdevfilter)) {
+ ret = -ERESTARTSYS;
+ break;
+ }
+@@ -1221,6 +1241,13 @@ static const struct dvb_device dvbdev_dvr = {
+ #endif
+ .fops = &dvb_dvr_fops
+ };
++
++void (*dvb_dmxdev_init_hook)(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) = NULL;
++EXPORT_SYMBOL(dvb_dmxdev_init_hook);
++
++void (*dvb_dmxdev_release_hook)(struct dmxdev *dmxdev) = NULL;
++EXPORT_SYMBOL(dvb_dmxdev_release_hook);
++
+ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
+ {
+ int i;
+@@ -1248,6 +1275,9 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
+
+ dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
+
++ if (dvb_dmxdev_init_hook) {
++ dvb_dmxdev_init_hook(dmxdev, dvb_adapter);
++ }
+ return 0;
+ }
+
+@@ -1255,6 +1285,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
+
+ void dvb_dmxdev_release(struct dmxdev *dmxdev)
+ {
++ if (dvb_dmxdev_release_hook) {
++ dvb_dmxdev_release_hook(dmxdev);
++ }
++
+ dmxdev->exit=1;
+ if (dmxdev->dvbdev->users > 1) {
+ wait_event(dmxdev->dvbdev->wait_queue,
+diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
+index 6c7ff0c..bd2d3c5 100644
+--- a/drivers/media/dvb-core/dvb_demux.c
++++ b/drivers/media/dvb-core/dvb_demux.c
+@@ -60,6 +60,9 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
+ printk(x); \
+ } while (0)
+
++int (*dmx_swfilter_hook)(struct dvb_demux *dvbdmx, const u8 *buffer, size_t length) = NULL;
++EXPORT_SYMBOL(dmx_swfilter_hook);
++
+ /******************************************************************************
+ * static inlined helper functions
+ ******************************************************************************/
+@@ -478,6 +481,10 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
+ {
+ unsigned long flags;
+
++ if (dmx_swfilter_hook) {
++ if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
++ }
++
+ spin_lock_irqsave(&demux->lock, flags);
+
+ while (count--) {
+@@ -572,6 +579,10 @@ bailout:
+
+ void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
+ {
++ if (dmx_swfilter_hook) {
++ if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
++ }
++
+ _dvb_dmx_swfilter(demux, buf, count, 188);
+ }
+ EXPORT_SYMBOL(dvb_dmx_swfilter);
+diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c
+index 7df7fb3..b8771b3 100644
+--- a/drivers/media/dvb-core/dvb_ringbuffer.c
++++ b/drivers/media/dvb-core/dvb_ringbuffer.c
+@@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
+ rbuf->data=data;
+ rbuf->size=len;
+ rbuf->error=0;
++ rbuf->do_wait=1;
+
+ init_waitqueue_head(&rbuf->queue);
+
+diff --git a/drivers/media/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb-core/dvb_ringbuffer.h
+index 9e1e11b..0f876c0 100644
+--- a/drivers/media/dvb-core/dvb_ringbuffer.h
++++ b/drivers/media/dvb-core/dvb_ringbuffer.h
+@@ -39,6 +39,7 @@ struct dvb_ringbuffer {
+
+ wait_queue_head_t queue;
+ spinlock_t lock;
++ int do_wait;
+ };
+
+ #define DVB_RINGBUFFER_PKTHDRSIZE 3