diff options
author | Markus Rechberger <mrechberger@gmail.com> | 2007-04-27 11:31:06 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-04-27 14:43:25 -0400 |
commit | 77b7477467824098741351b6253a4ad292e28df9 (patch) | |
tree | 948ae57ed00c6f33400692100523256471fa5b37 | |
parent | acf2821282bdd912f9ca46780879a21679429f85 (diff) |
V4L/DVB (5298): Added support for deferred module requesting to cx88
added support for deferred module requesting to cx88
Signed-off-by: Markus Rechberger <mrechberger@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
-rw-r--r-- | drivers/media/video/cx88/cx88-mpeg.c | 32 | ||||
-rw-r--r-- | drivers/media/video/cx88/cx88.h | 2 |
2 files changed, 34 insertions, 0 deletions
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index 1fe1a833c7c7..cd01d23cd2f1 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c | |||
@@ -49,6 +49,35 @@ MODULE_PARM_DESC(debug,"enable debug messages [mpeg]"); | |||
49 | #define mpeg_dbg(level,fmt, arg...) if (debug >= level) \ | 49 | #define mpeg_dbg(level,fmt, arg...) if (debug >= level) \ |
50 | printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg) | 50 | printk(KERN_DEBUG "%s/2-mpeg: " fmt, core->name, ## arg) |
51 | 51 | ||
52 | #if defined(CONFIG_MODULES) && defined(MODULE) | ||
53 | static void request_module_async(struct work_struct *work) | ||
54 | { | ||
55 | struct cx8802_dev *dev=container_of(work, struct cx8802_dev, request_module_wk); | ||
56 | switch (cx88_boards[dev->core->board].mpeg) { | ||
57 | case CX88_MPEG_BLACKBIRD: | ||
58 | request_module("cx88-blackbird"); | ||
59 | break; | ||
60 | case CX88_MPEG_DVB: | ||
61 | request_module("cx88-dvb"); | ||
62 | break; | ||
63 | case CX88_BOARD_NONE: | ||
64 | /* reaching this one isn't possible */ | ||
65 | break; | ||
66 | default: | ||
67 | printk("cx88-mpeg.c: WARNING extension [%d] is not supposed to be supported\n",cx88_boards[dev->core->board].mpeg); | ||
68 | } | ||
69 | } | ||
70 | |||
71 | static void request_modules(struct cx8802_dev *dev) | ||
72 | { | ||
73 | INIT_WORK(&dev->request_module_wk, request_module_async); | ||
74 | schedule_work(&dev->request_module_wk); | ||
75 | } | ||
76 | #else | ||
77 | #define request_modules(dev) | ||
78 | #endif /* CONFIG_MODULES */ | ||
79 | |||
80 | |||
52 | static LIST_HEAD(cx8802_devlist); | 81 | static LIST_HEAD(cx8802_devlist); |
53 | /* ------------------------------------------------------------------ */ | 82 | /* ------------------------------------------------------------------ */ |
54 | 83 | ||
@@ -778,6 +807,9 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev, | |||
778 | 807 | ||
779 | /* Maintain a reference so cx88-video can query the 8802 device. */ | 808 | /* Maintain a reference so cx88-video can query the 8802 device. */ |
780 | core->dvbdev = dev; | 809 | core->dvbdev = dev; |
810 | |||
811 | /* now autoload cx88-dvb or cx88-blackbird */ | ||
812 | request_modules(dev); | ||
781 | return 0; | 813 | return 0; |
782 | 814 | ||
783 | fail_free: | 815 | fail_free: |
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index a4f7befda5b0..d16ed93080e9 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
@@ -481,6 +481,8 @@ struct cx8802_dev { | |||
481 | 481 | ||
482 | /* List of attached drivers */ | 482 | /* List of attached drivers */ |
483 | struct cx8802_driver drvlist; | 483 | struct cx8802_driver drvlist; |
484 | struct work_struct request_module_wk; | ||
485 | |||
484 | }; | 486 | }; |
485 | 487 | ||
486 | /* ----------------------------------------------------------- */ | 488 | /* ----------------------------------------------------------- */ |