diff options
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/videobuf-dvb.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/drivers/media/video/videobuf-dvb.c b/drivers/media/video/videobuf-dvb.c index 917277d36605..0e7dcba8e4ae 100644 --- a/drivers/media/video/videobuf-dvb.c +++ b/drivers/media/video/videobuf-dvb.c | |||
@@ -296,29 +296,7 @@ EXPORT_SYMBOL(videobuf_dvb_register_bus); | |||
296 | 296 | ||
297 | void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f) | 297 | void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f) |
298 | { | 298 | { |
299 | struct list_head *list, *q; | 299 | videobuf_dvb_dealloc_frontends(f); |
300 | struct videobuf_dvb_frontend *fe; | ||
301 | |||
302 | mutex_lock(&f->lock); | ||
303 | list_for_each_safe(list, q, &f->felist) { | ||
304 | fe = list_entry(list, struct videobuf_dvb_frontend, felist); | ||
305 | if (fe->dvb.net.dvbdev) { | ||
306 | dvb_net_release(&fe->dvb.net); | ||
307 | fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, | ||
308 | &fe->dvb.fe_mem); | ||
309 | fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, | ||
310 | &fe->dvb.fe_hw); | ||
311 | dvb_dmxdev_release(&fe->dvb.dmxdev); | ||
312 | dvb_dmx_release(&fe->dvb.demux); | ||
313 | dvb_unregister_frontend(fe->dvb.frontend); | ||
314 | } | ||
315 | if (fe->dvb.frontend) | ||
316 | /* always allocated, may have been reset */ | ||
317 | dvb_frontend_detach(fe->dvb.frontend); | ||
318 | list_del(list); | ||
319 | kfree(fe); | ||
320 | } | ||
321 | mutex_unlock(&f->lock); | ||
322 | 300 | ||
323 | dvb_unregister_adapter(&f->adapter); | 301 | dvb_unregister_adapter(&f->adapter); |
324 | } | 302 | } |
@@ -389,3 +367,31 @@ fail_alloc: | |||
389 | return fe; | 367 | return fe; |
390 | } | 368 | } |
391 | EXPORT_SYMBOL(videobuf_dvb_alloc_frontend); | 369 | EXPORT_SYMBOL(videobuf_dvb_alloc_frontend); |
370 | |||
371 | void videobuf_dvb_dealloc_frontends(struct videobuf_dvb_frontends *f) | ||
372 | { | ||
373 | struct list_head *list, *q; | ||
374 | struct videobuf_dvb_frontend *fe; | ||
375 | |||
376 | mutex_lock(&f->lock); | ||
377 | list_for_each_safe(list, q, &f->felist) { | ||
378 | fe = list_entry(list, struct videobuf_dvb_frontend, felist); | ||
379 | if (fe->dvb.net.dvbdev) { | ||
380 | dvb_net_release(&fe->dvb.net); | ||
381 | fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, | ||
382 | &fe->dvb.fe_mem); | ||
383 | fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, | ||
384 | &fe->dvb.fe_hw); | ||
385 | dvb_dmxdev_release(&fe->dvb.dmxdev); | ||
386 | dvb_dmx_release(&fe->dvb.demux); | ||
387 | dvb_unregister_frontend(fe->dvb.frontend); | ||
388 | } | ||
389 | if (fe->dvb.frontend) | ||
390 | /* always allocated, may have been reset */ | ||
391 | dvb_frontend_detach(fe->dvb.frontend); | ||
392 | list_del(list); /* remove list entry */ | ||
393 | kfree(fe); /* free frontend allocation */ | ||
394 | } | ||
395 | mutex_unlock(&f->lock); | ||
396 | } | ||
397 | EXPORT_SYMBOL(videobuf_dvb_dealloc_frontends); | ||