aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88/cx88.h
diff options
context:
space:
mode:
authorTrent Piepho <xyzzy@speakeasy.org>2007-10-14 01:52:17 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2007-10-22 10:01:43 -0400
commit081c2fc8b9cdd13a2436e8510889293874a33340 (patch)
tree0eee36eb0d0de0a578082995027ca2832025964a /drivers/media/video/cx88/cx88.h
parentf0ad90975bc9ff6cd7361b452b31dab7a90084fc (diff)
V4L/DVB (6334): cx88: Change (struct cx8802_dev)->drvlist to a list_head and fix bugs
It was a struct cx8802_driver for no apparent reason. Nothing uses a cx8802_driver in the cx8802_dev struct. The only field that was used was devlist, a list_head. The code in cx8802_remove() that removed any loaded sub-drivers was broken. It would delete the current list entry, but didn't use list_for_each_safe. It also called list_del() on the list _head_ inside the list_for_each loop? It would crash if it was run, which I don't think can ever happen. Since the cx8802 sub-drivers use the cx8802 driver, they have to be unloaded first. So there isn't any way for a sub-driver to still be loaded when cx8802_remove() is called... Except maybe with PCI hot-plug, if one removes the PCI card while the drivers are loaded? So I left some code in to handle that if it's actually possible. It will remove the sub-drivers from the device cx8802_remove() was called on, and only that device. If one has two DVB cards and unplugs one, there is no reason to unload the DVB drivers for both cards. I have no way to test this, but it can't be worse than what was there before. cx8802_get_driver() is passed a cx8802_dev pointer and looks for the requested driver on that device. It first loops over the cx8802 device list looking for the device it was passed, which is pointless. It doesn't need to find the device pointer in the list, as it already has the pointer. The list_head in the cx8802_driver struct, which joins all the _drivers_ attached to a device, was named devlist. Changed that to drvlist, since the devlist is used for a list of _devices_ in other cx8802 structs. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Reviewed-by: Michael Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx88/cx88.h')
-rw-r--r--drivers/media/video/cx88/cx88.h8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h
index 2e0911bad43a..eb296bdecb1e 100644
--- a/drivers/media/video/cx88/cx88.h
+++ b/drivers/media/video/cx88/cx88.h
@@ -412,7 +412,9 @@ struct cx8802_suspend_state {
412 412
413struct cx8802_driver { 413struct cx8802_driver {
414 struct cx88_core *core; 414 struct cx88_core *core;
415 struct list_head devlist; 415
416 /* List of drivers attached to device */
417 struct list_head drvlist;
416 418
417 /* Type of driver and access required */ 419 /* Type of driver and access required */
418 enum cx88_board_type type_id; 420 enum cx88_board_type type_id;
@@ -478,8 +480,8 @@ struct cx8802_dev {
478 unsigned char ts_gen_cntrl; 480 unsigned char ts_gen_cntrl;
479 481
480 /* List of attached drivers */ 482 /* List of attached drivers */
481 struct cx8802_driver drvlist; 483 struct list_head drvlist;
482 struct work_struct request_module_wk; 484 struct work_struct request_module_wk;
483}; 485};
484 486
485/* ----------------------------------------------------------- */ 487/* ----------------------------------------------------------- */