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