V4L/DVB (7688): pvrusb2: Clean up dvb streaming start/stop
[linux-2.6] / drivers / media / video / pvrusb2 / pvrusb2-dvb.c
1 /*
2  *  pvrusb2-dvb.c - linux-dvb api interface to the pvrusb2 driver.
3  *
4  *  Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  */
20
21 #include <linux/kthread.h>
22 #include <linux/freezer.h>
23 #include "dvbdev.h"
24 #include "pvrusb2-hdw-internal.h"
25 #include "pvrusb2-hdw.h"
26 #include "pvrusb2-io.h"
27 #include "pvrusb2-dvb.h"
28
29 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
30
31 static int pvr2_dvb_feed_func(struct pvr2_dvb_adapter *adap)
32 {
33         int ret;
34         unsigned int count;
35         struct pvr2_buffer *bp;
36         struct pvr2_stream *stream;
37
38         printk(KERN_DEBUG "dvb thread started\n");
39         set_freezable();
40
41         stream = adap->channel.stream->stream;
42
43         for (;;) {
44                 if (kthread_should_stop()) break;
45
46                 /* Not sure about this... */
47                 try_to_freeze();
48
49                 bp = pvr2_stream_get_ready_buffer(stream);
50                 if (bp != NULL) {
51                         count = pvr2_buffer_get_count(bp);
52                         if (count) {
53                                 dvb_dmx_swfilter(
54                                         &adap->demux,
55                                         adap->buffer_storage[
56                                             pvr2_buffer_get_id(bp)],
57                                         count);
58                         } else {
59                                 ret = pvr2_buffer_get_status(bp);
60                                 if (ret < 0) break;
61                         }
62                         ret = pvr2_buffer_queue(bp);
63                         if (ret < 0) break;
64
65                         /* Since we know we did something to a buffer,
66                            just go back and try again.  No point in
67                            blocking unless we really ran out of
68                            buffers to process. */
69                         continue;
70                 }
71
72
73                 /* Wait until more buffers become available. */
74                 ret = wait_event_interruptible(
75                     adap->buffer_wait_data,
76                     pvr2_stream_get_ready_count(stream) > 0);
77                 if (ret < 0) break;
78         }
79
80         /* If we get here and ret is < 0, then an error has occurred.
81            Probably would be a good idea to communicate that to DVB core... */
82
83         printk(KERN_DEBUG "dvb thread stopped\n");
84
85         return 0;
86 }
87
88 static int pvr2_dvb_feed_thread(void *data)
89 {
90         int stat = pvr2_dvb_feed_func(data);
91         /* from videobuf-dvb.c: */
92         while (!kthread_should_stop()) {
93                 set_current_state(TASK_INTERRUPTIBLE);
94                 schedule();
95         }
96         return stat;
97 }
98
99 static void pvr2_dvb_notify(struct pvr2_dvb_adapter *adap)
100 {
101         wake_up(&adap->buffer_wait_data);
102 }
103
104 static void pvr2_dvb_stream_end(struct pvr2_dvb_adapter *adap)
105 {
106         unsigned int idx;
107         struct pvr2_stream *stream;
108
109         if (adap->thread) {
110                 kthread_stop(adap->thread);
111                 adap->thread = NULL;
112         }
113
114         if (adap->channel.stream) {
115                 stream = adap->channel.stream->stream;
116         } else {
117                 stream = NULL;
118         }
119         if (stream) {
120                 pvr2_hdw_set_streaming(adap->channel.hdw, 0);
121                 pvr2_stream_set_callback(stream, NULL, NULL);
122                 pvr2_stream_kill(stream);
123                 pvr2_stream_set_buffer_count(stream, 0);
124                 pvr2_channel_claim_stream(&adap->channel, NULL);
125         }
126
127         if (adap->stream_run) {
128                 for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) {
129                         if (!(adap->buffer_storage[idx])) continue;
130                         kfree(adap->buffer_storage[idx]);
131                         adap->buffer_storage[idx] = 0;
132                 }
133                 adap->stream_run = 0;
134         }
135 }
136
137 static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap)
138 {
139         struct pvr2_context *pvr = adap->channel.mc_head;
140         unsigned int idx;
141         int ret;
142         struct pvr2_buffer *bp;
143         struct pvr2_stream *stream = 0;
144
145         if (adap->stream_run) return -EIO;
146
147         ret = pvr2_channel_claim_stream(&adap->channel, &pvr->video_stream);
148         /* somebody else already has the stream */
149         if (ret < 0) return ret;
150
151         stream = adap->channel.stream->stream;
152
153         for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) {
154                 adap->buffer_storage[idx] = kmalloc(PVR2_DVB_BUFFER_SIZE,
155                                                     GFP_KERNEL);
156                 if (!(adap->buffer_storage[idx])) return -ENOMEM;
157         }
158
159         pvr2_stream_set_callback(pvr->video_stream.stream,
160                                  (pvr2_stream_callback) pvr2_dvb_notify, adap);
161
162         ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT);
163         if (ret < 0) return ret;
164
165         for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) {
166                 bp = pvr2_stream_get_buffer(stream, idx);
167                 pvr2_buffer_set_buffer(bp,
168                                        adap->buffer_storage[idx],
169                                        PVR2_DVB_BUFFER_SIZE);
170         }
171
172         ret = pvr2_hdw_set_streaming(adap->channel.hdw, 1);
173         if (ret < 0) return ret;
174
175         while ((bp = pvr2_stream_get_idle_buffer(stream)) != 0) {
176                 ret = pvr2_buffer_queue(bp);
177                 if (ret < 0) return ret;
178         }
179
180         adap->thread = kthread_run(pvr2_dvb_feed_thread, adap, "pvrusb2-dvb");
181
182         if (IS_ERR(adap->thread)) {
183                 ret = PTR_ERR(adap->thread);
184                 adap->thread = NULL;
185                 return ret;
186         }
187
188         adap->stream_run = !0;
189
190         return 0;
191 }
192
193 static int pvr2_dvb_stream_start(struct pvr2_dvb_adapter *adap)
194 {
195         int ret = pvr2_dvb_stream_do_start(adap);
196         if (ret < 0) pvr2_dvb_stream_end(adap);
197         return ret;
198 }
199
200 static int pvr2_dvb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, int onoff)
201 {
202         struct pvr2_dvb_adapter *adap = dvbdmxfeed->demux->priv;
203         int ret = 0;
204
205         if (adap == NULL) return -ENODEV;
206
207         mutex_lock(&adap->lock);
208         do {
209                 if (onoff) {
210                         if (!adap->feedcount) {
211                                 printk(KERN_DEBUG "start feeding\n");
212                                 ret = pvr2_dvb_stream_start(adap);
213                                 if (ret < 0) break;
214                         }
215                         (adap->feedcount)++;
216                 } else if (adap->feedcount > 0) {
217                         (adap->feedcount)--;
218                         if (!adap->feedcount) {
219                                 printk(KERN_DEBUG "stop feeding\n");
220                                 pvr2_dvb_stream_end(adap);
221                         }
222                 }
223         } while (0);
224         mutex_unlock(&adap->lock);
225
226         return ret;
227 }
228
229 static int pvr2_dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
230 {
231         printk(KERN_DEBUG "start pid: 0x%04x, feedtype: %d\n",
232                dvbdmxfeed->pid, dvbdmxfeed->type);
233         return pvr2_dvb_ctrl_feed(dvbdmxfeed, 1);
234 }
235
236 static int pvr2_dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
237 {
238         printk(KERN_DEBUG "stop pid: 0x%04x, feedtype: %d\n",
239                dvbdmxfeed->pid, dvbdmxfeed->type);
240         return pvr2_dvb_ctrl_feed(dvbdmxfeed, 0);
241 }
242
243 static int pvr2_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
244 {
245         /* TO DO: This function will call into the core and request for
246          * input to be set to 'dtv' if (acquire) and if it isn't set already.
247          *
248          * If (!acquire) then we should do nothing -- don't switch inputs
249          * again unless the analog side of the driver requests the bus.
250          */
251         return 0;
252 }
253
254 static int pvr2_dvb_adapter_init(struct pvr2_dvb_adapter *adap)
255 {
256         int ret;
257
258         ret = dvb_register_adapter(&adap->dvb_adap, "pvrusb2-dvb",
259                                    THIS_MODULE/*&hdw->usb_dev->owner*/,
260                                    &adap->channel.hdw->usb_dev->dev,
261                                    adapter_nr);
262         if (ret < 0) {
263                 err("dvb_register_adapter failed: error %d", ret);
264                 goto err;
265         }
266         adap->dvb_adap.priv = adap;
267
268         adap->demux.dmx.capabilities = DMX_TS_FILTERING |
269                                        DMX_SECTION_FILTERING |
270                                        DMX_MEMORY_BASED_FILTERING;
271         adap->demux.priv             = adap;
272         adap->demux.filternum        = 256;
273         adap->demux.feednum          = 256;
274         adap->demux.start_feed       = pvr2_dvb_start_feed;
275         adap->demux.stop_feed        = pvr2_dvb_stop_feed;
276         adap->demux.write_to_decoder = NULL;
277
278         ret = dvb_dmx_init(&adap->demux);
279         if (ret < 0) {
280                 err("dvb_dmx_init failed: error %d", ret);
281                 goto err_dmx;
282         }
283
284         adap->dmxdev.filternum       = adap->demux.filternum;
285         adap->dmxdev.demux           = &adap->demux.dmx;
286         adap->dmxdev.capabilities    = 0;
287
288         ret = dvb_dmxdev_init(&adap->dmxdev, &adap->dvb_adap);
289         if (ret < 0) {
290                 err("dvb_dmxdev_init failed: error %d", ret);
291                 goto err_dmx_dev;
292         }
293
294         dvb_net_init(&adap->dvb_adap, &adap->dvb_net, &adap->demux.dmx);
295
296         adap->digital_up = 1;
297
298         return 0;
299
300 err_dmx_dev:
301         dvb_dmx_release(&adap->demux);
302 err_dmx:
303         dvb_unregister_adapter(&adap->dvb_adap);
304 err:
305         return ret;
306 }
307
308 static int pvr2_dvb_adapter_exit(struct pvr2_dvb_adapter *adap)
309 {
310         if (adap->digital_up) {
311                 printk(KERN_DEBUG "unregistering DVB devices\n");
312                 dvb_net_release(&adap->dvb_net);
313                 adap->demux.dmx.close(&adap->demux.dmx);
314                 dvb_dmxdev_release(&adap->dmxdev);
315                 dvb_dmx_release(&adap->demux);
316                 dvb_unregister_adapter(&adap->dvb_adap);
317                 adap->digital_up = 0;
318         }
319         return 0;
320 }
321
322 static int pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap)
323 {
324         struct pvr2_hdw *hdw = adap->channel.hdw;
325         struct pvr2_dvb_props *dvb_props = hdw->hdw_desc->dvb_props;
326         int ret;
327
328         if (dvb_props == NULL) {
329                 err("fe_props not defined!");
330                 return -EINVAL;
331         }
332
333         /* FIXME: This code should be moved into the core,
334          * and should only be called if we don't already have
335          * control of the bus.
336          *
337          * We can't call "pvr2_dvb_bus_ctrl(adap->fe, 1)" from here,
338          * because adap->fe isn't defined yet.
339          */
340         ret = pvr2_ctrl_set_value(pvr2_hdw_get_ctrl_by_id(hdw,
341                                                           PVR2_CID_INPUT),
342                                   PVR2_CVAL_INPUT_DTV);
343         if (ret != 0)
344                 return ret;
345
346         pvr2_hdw_commit_ctl(hdw);
347
348
349         if (dvb_props->frontend_attach == NULL) {
350                 err("frontend_attach not defined!");
351                 return -EINVAL;
352         }
353
354         if ((dvb_props->frontend_attach(adap) == 0) && (adap->fe)) {
355
356                 if (dvb_register_frontend(&adap->dvb_adap, adap->fe)) {
357                         err("frontend registration failed!");
358                         dvb_frontend_detach(adap->fe);
359                         adap->fe = NULL;
360                         return -ENODEV;
361                 }
362
363                 if (dvb_props->tuner_attach)
364                         dvb_props->tuner_attach(adap);
365
366                 if (adap->fe->ops.analog_ops.standby)
367                         adap->fe->ops.analog_ops.standby(adap->fe);
368
369                 /* Ensure all frontends negotiate bus access */
370                 adap->fe->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl;
371
372         } else {
373                 err("no frontend was attached!");
374                 return -ENODEV;
375         }
376
377         return 0;
378 }
379
380 static int pvr2_dvb_frontend_exit(struct pvr2_dvb_adapter *adap)
381 {
382         if (adap->fe != NULL) {
383                 dvb_unregister_frontend(adap->fe);
384                 dvb_frontend_detach(adap->fe);
385         }
386         return 0;
387 }
388
389 int pvr2_dvb_init(struct pvr2_context *pvr)
390 {
391         int ret = 0;
392         struct pvr2_dvb_adapter *adap;
393         adap = &pvr->hdw->dvb;
394         adap->init = !0;
395         pvr2_channel_init(&adap->channel, pvr);
396         init_waitqueue_head(&adap->buffer_wait_data);
397         mutex_init(&pvr->hdw->dvb.lock);
398         ret = pvr2_dvb_adapter_init(&pvr->hdw->dvb);
399         if (ret < 0) goto fail;
400         ret = pvr2_dvb_frontend_init(&pvr->hdw->dvb);
401 fail:
402         return ret;
403 }
404
405 int pvr2_dvb_exit(struct pvr2_context *pvr)
406 {
407         struct pvr2_dvb_adapter *adap;
408         adap = &pvr->hdw->dvb;
409         if (!adap->init) return 0;
410         pvr2_dvb_stream_end(adap);
411         pvr2_dvb_frontend_exit(adap);
412         pvr2_dvb_adapter_exit(adap);
413         pvr2_channel_done(&adap->channel);
414         return 0;
415 }