add models, vusolo/vuuno/vuultimo/vusolo2/vuduo2
[vuplus_openvuplus_3.0] / meta-bsp / common / recipes / linux / linux-vuplus-3.3.6 / dvb_core_5.5.patch
1 diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
2 index e4b5c03..caca6e5 100644
3 --- a/drivers/media/dvb/dvb-core/dmxdev.c
4 +++ b/drivers/media/dvb/dvb-core/dmxdev.c
5 @@ -81,9 +81,14 @@ static ssize_t dvb_dmxdev_buffer_read(struct dvb_ringbuffer *src,
6                         break;
7                 }
8  
9 +
10                 ret = wait_event_interruptible(src->queue,
11                                                !dvb_ringbuffer_empty(src) ||
12 -                                              (src->error != 0));
13 +                                              (src->error != 0) ||
14 +                                              (src->do_wait != 1));
15 +               if (src->do_wait != 1)
16 +                       ret = -EINTR;
17 +               
18                 if (ret < 0)
19                         break;
20  
21 @@ -963,6 +968,22 @@ dvb_demux_read(struct file *file, char __user *buf, size_t count,
22         return ret;
23  }
24  
25 +static int dvb_demux_lock_filter(struct dmxdev_filter *dmxdevfilter)
26 +{
27 +       int ret;
28 +
29 +       dmxdevfilter->buffer.do_wait = 0;
30 +
31 +       if (waitqueue_active(&dmxdevfilter->buffer.queue))
32 +               wake_up(&dmxdevfilter->buffer.queue);
33 +
34 +       ret = mutex_lock_interruptible(&dmxdevfilter->mutex);
35 +
36 +       dmxdevfilter->buffer.do_wait = 1;
37 +
38 +       return ret;
39 +}
40 +
41  static int dvb_demux_do_ioctl(struct file *file,
42                               unsigned int cmd, void *parg)
43  {
44 @@ -976,7 +997,7 @@ static int dvb_demux_do_ioctl(struct file *file,
45  
46         switch (cmd) {
47         case DMX_START:
48 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
49 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
50                         mutex_unlock(&dmxdev->mutex);
51                         return -ERESTARTSYS;
52                 }
53 @@ -988,7 +1009,7 @@ static int dvb_demux_do_ioctl(struct file *file,
54                 break;
55  
56         case DMX_STOP:
57 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
58 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
59                         mutex_unlock(&dmxdev->mutex);
60                         return -ERESTARTSYS;
61                 }
62 @@ -997,7 +1018,7 @@ static int dvb_demux_do_ioctl(struct file *file,
63                 break;
64  
65         case DMX_SET_FILTER:
66 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
67 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
68                         mutex_unlock(&dmxdev->mutex);
69                         return -ERESTARTSYS;
70                 }
71 @@ -1006,7 +1027,7 @@ static int dvb_demux_do_ioctl(struct file *file,
72                 break;
73  
74         case DMX_SET_PES_FILTER:
75 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
76 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
77                         mutex_unlock(&dmxdev->mutex);
78                         return -ERESTARTSYS;
79                 }
80 @@ -1015,7 +1036,7 @@ static int dvb_demux_do_ioctl(struct file *file,
81                 break;
82  
83         case DMX_SET_BUFFER_SIZE:
84 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
85 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
86                         mutex_unlock(&dmxdev->mutex);
87                         return -ERESTARTSYS;
88                 }
89 @@ -1059,7 +1080,7 @@ static int dvb_demux_do_ioctl(struct file *file,
90                 break;
91  
92         case DMX_ADD_PID:
93 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
94 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
95                         ret = -ERESTARTSYS;
96                         break;
97                 }
98 @@ -1068,7 +1089,7 @@ static int dvb_demux_do_ioctl(struct file *file,
99                 break;
100  
101         case DMX_REMOVE_PID:
102 -               if (mutex_lock_interruptible(&dmxdevfilter->mutex)) {
103 +               if (dvb_demux_lock_filter(dmxdevfilter)) {
104                         ret = -ERESTARTSYS;
105                         break;
106                 }
107 diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
108 old mode 100644
109 new mode 100755
110 index a5712cd..9f744c2
111 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
112 +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
113 @@ -45,7 +45,8 @@ void dvb_ringbuffer_init(struct dvb_ringbuffer *rbuf, void *data, size_t len)
114         rbuf->data=data;
115         rbuf->size=len;
116         rbuf->error=0;
117 -
118 +       rbuf->do_wait=1;
119 +       
120         init_waitqueue_head(&rbuf->queue);
121  
122         spin_lock_init(&(rbuf->lock));
123 diff --git a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
124 old mode 100644
125 new mode 100755
126 index 41f04da..6951dd3
127 --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
128 +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
129 @@ -39,6 +39,7 @@ struct dvb_ringbuffer {
130  
131         wait_queue_head_t queue;
132         spinlock_t        lock;
133 +       int               do_wait;
134  };
135  
136  #define DVB_RINGBUFFER_PKTHDRSIZE 3