Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (9335): videobuf: split unregister bus creating self-contained frontend de-allocator

This creates a self contained frontend de-allocator
for the instances where an adapter has not been
registered yet frontend de-allocation may
be required.

Signed-off-by: Darron Broad <darron@kewl.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Darron Broad and committed by
Mauro Carvalho Chehab
878595f6 0fcd488d

+30 -23
+29 -23
drivers/media/video/videobuf-dvb.c
··· 296 296 297 297 void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f) 298 298 { 299 - struct list_head *list, *q; 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); 299 + videobuf_dvb_dealloc_frontends(f); 322 300 323 301 dvb_unregister_adapter(&f->adapter); 324 302 } ··· 367 389 return fe; 368 390 } 369 391 EXPORT_SYMBOL(videobuf_dvb_alloc_frontend); 392 + 393 + void videobuf_dvb_dealloc_frontends(struct videobuf_dvb_frontends *f) 394 + { 395 + struct list_head *list, *q; 396 + struct videobuf_dvb_frontend *fe; 397 + 398 + mutex_lock(&f->lock); 399 + list_for_each_safe(list, q, &f->felist) { 400 + fe = list_entry(list, struct videobuf_dvb_frontend, felist); 401 + if (fe->dvb.net.dvbdev) { 402 + dvb_net_release(&fe->dvb.net); 403 + fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, 404 + &fe->dvb.fe_mem); 405 + fe->dvb.demux.dmx.remove_frontend(&fe->dvb.demux.dmx, 406 + &fe->dvb.fe_hw); 407 + dvb_dmxdev_release(&fe->dvb.dmxdev); 408 + dvb_dmx_release(&fe->dvb.demux); 409 + dvb_unregister_frontend(fe->dvb.frontend); 410 + } 411 + if (fe->dvb.frontend) 412 + /* always allocated, may have been reset */ 413 + dvb_frontend_detach(fe->dvb.frontend); 414 + list_del(list); /* remove list entry */ 415 + kfree(fe); /* free frontend allocation */ 416 + } 417 + mutex_unlock(&f->lock); 418 + } 419 + EXPORT_SYMBOL(videobuf_dvb_dealloc_frontends);
+1
include/media/videobuf-dvb.h
··· 47 47 void videobuf_dvb_unregister_bus(struct videobuf_dvb_frontends *f); 48 48 49 49 struct videobuf_dvb_frontend * videobuf_dvb_alloc_frontend(struct videobuf_dvb_frontends *f, int id); 50 + void videobuf_dvb_dealloc_frontends(struct videobuf_dvb_frontends *f); 50 51 51 52 struct videobuf_dvb_frontend * videobuf_dvb_get_frontend(struct videobuf_dvb_frontends *f, int id); 52 53 int videobuf_dvb_find_frontend(struct videobuf_dvb_frontends *f, struct dvb_frontend *p);