Support Uno4kSE
[vuplus_openvuplus_3.0] / meta-bsp / recipes-kernel / linux / linux-vuplus-4.1.20 / linux_dvb-core.patch
1 commit 900c688fa839fa2b84f99d6024ba46ca178c896e
2 Author: gdhan <gdhan@dev3>
3 Date:   Thu Feb 23 16:20:47 2017 +0900
4
5     linux_dvb-core.patch
6
7 diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c
8 index d0e3f9d..d060019 100644
9 --- a/drivers/media/dvb-core/dmxdev.c
10 +++ b/drivers/media/dvb-core/dmxdev.c
11 @@ -82,7 +82,11 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
12  
13                 ret = wait_event_interruptible(src->queue,
14                                                !dvb_ringbuffer_empty(src) ||
15 -                                              (src->error != 0));
16 +                                              (src->error != 0) ||
17 +                                              (src->do_wait != 1));
18 +               if (src->do_wait != 1)
19 +                       ret = -EINTR;
20 +
21                 if (ret < 0)
22                         break;
23  
24 @@ -955,6 +959,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
25         return ret;
26  }
27  
28 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
29 +{
30 +       int ret;
31 +
32 +       dmxdevfilter->buffer.do_wait = 0;
33 +
34 +       if (waitqueue_active(&dmxdevfilter->buffer.queue))
35 +               wake_up(&dmxdevfilter->buffer.queue);
36 +
37 +       ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
38 +
39 +       dmxdevfilter->buffer.do_wait = 1;
40 +
41 +       return ret;
42 +}
43 +
44  static int dvb_demux_do_ioctl(struct file *file,
45                               unsigned int cmd, void *parg)
46  {
47 @@ -968,7 +988,7 @@ static int dvb_demux_do_ioctl(struct file *file,
48  
49         switch (cmd) {
50         case DMX_START:
51 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
52 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
53                         mutex_unlock(&dmxdev->mutex);
54                         return -ERESTARTSYS;
55                 }
56 @@ -980,7 +1000,7 @@ static int dvb_demux_do_ioctl(struct file *file,
57                 break;
58  
59         case DMX_STOP:
60 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
61 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
62                         mutex_unlock(&dmxdev->mutex);
63                         return -ERESTARTSYS;
64                 }
65 @@ -989,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
66                 break;
67  
68         case DMX_SET_FILTER:
69 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
70 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
71                         mutex_unlock(&dmxdev->mutex);
72                         return -ERESTARTSYS;
73                 }
74 @@ -998,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
75                 break;
76  
77         case DMX_SET_PES_FILTER:
78 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
79 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
80                         mutex_unlock(&dmxdev->mutex);
81                         return -ERESTARTSYS;
82                 }
83 @@ -1007,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
84                 break;
85  
86         case DMX_SET_BUFFER_SIZE:
87 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
88 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
89                         mutex_unlock(&dmxdev->mutex);
90                         return -ERESTARTSYS;
91                 }
92 @@ -1051,7 +1071,7 @@ static int dvb_demux_do_ioctl(struct file *file,
93                 break;
94  
95         case DMX_ADD_PID:
96 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
97 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
98                         ret = -ERESTARTSYS;
99                         break;
100                 }
101 @@ -1060,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
102                 break;
103  
104         case DMX_REMOVE_PID:
105 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
106 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
107                         ret = -ERESTARTSYS;
108                         break;
109                 }
110 @@ -1221,6 +1241,13 @@ static const struct dvb_device dvbdev_dvr = {
111  #endif
112         .fops = &dvb_dvr_fops
113  };
114 +
115 +void (*dvb_dmxdev_init_hook)(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter) = NULL;
116 +EXPORT_SYMBOL(dvb_dmxdev_init_hook);
117 +
118 +void (*dvb_dmxdev_release_hook)(struct dmxdev *dmxdev) = NULL;
119 +EXPORT_SYMBOL(dvb_dmxdev_release_hook);
120 +
121  int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
122  {
123         int i;
124 @@ -1248,6 +1275,9 @@ int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *dvb_adapter)
125  
126         dvb_ringbuffer_init(&dmxdev->dvr_buffer, NULL, 8192);
127  
128 +       if (dvb_dmxdev_init_hook) {
129 +               dvb_dmxdev_init_hook(dmxdev, dvb_adapter);
130 +       }
131         return 0;
132  }
133  
134 @@ -1255,6 +1285,10 @@ EXPORT_SYMBOL(dvb_dmxdev_init);
135  
136  void dvb_dmxdev_release(struct dmxdev *dmxdev)
137  {
138 +       if (dvb_dmxdev_release_hook) {
139 +               dvb_dmxdev_release_hook(dmxdev);
140 +       }
141 +
142         dmxdev->exit=1;
143         if (dmxdev->dvbdev->users > 1) {
144                 wait_event(dmxdev->dvbdev->wait_queue,
145 diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c
146 index 6c7ff0c..bd2d3c5 100644
147 --- a/drivers/media/dvb-core/dvb_demux.c
148 +++ b/drivers/media/dvb-core/dvb_demux.c
149 @@ -60,6 +60,9 @@ MODULE_PARM_DESC(dvb_demux_feed_err_pkts,
150                         printk(x);                              \
151         } while (0)
152  
153 +int (*dmx_swfilter_hook)(struct dvb_demux *dvbdmx, const u8 *buffer, size_t length) = NULL;
154 +EXPORT_SYMBOL(dmx_swfilter_hook);
155 +
156  /******************************************************************************
157   * static inlined helper functions
158   ******************************************************************************/
159 @@ -478,6 +481,10 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
160  {
161         unsigned long flags;
162  
163 +       if (dmx_swfilter_hook) {
164 +               if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
165 +       }
166 +
167         spin_lock_irqsave(&demux->lock, flags);
168  
169         while (count--) {
170 @@ -572,6 +579,10 @@ bailout:
171  
172  void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
173  {
174 +       if (dmx_swfilter_hook) {
175 +               if (dmx_swfilter_hook(demux, buf, count) >= 0) return;
176 +       }
177 +
178         _dvb_dmx_swfilter(demux, buf, count, 188);
179  }
180  EXPORT_SYMBOL(dvb_dmx_swfilter);
181 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb-core/dvb_ringbuffer.c
182 index 1100e98..64a77fe 100644
183 --- a/drivers/media/dvb-core/dvb_ringbuffer.c
184 +++ b/drivers/media/dvb-core/dvb_ringbuffer.c
185 @@ -45,6 +45,7 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
186         rbuf->data=data;
187         rbuf->size=len;
188         rbuf->error=0;
189 +       rbuf->do_wait=1;
190  
191         init_waitqueue_head(&rbuf->queue);
192  
193 diff --git a/drivers/media/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb-core/dvb_ringbuffer.h
194 index 9e1e11b..0f876c0 100644
195 --- a/drivers/media/dvb-core/dvb_ringbuffer.h
196 +++ b/drivers/media/dvb-core/dvb_ringbuffer.h
197 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
198  
199         wait_queue_head_t queue;
200         spinlock_t        lock;
201 +       int               do_wait;
202  };
203  
204  #define DVB_RINGBUFFER_PKTHDRSIZE 3