aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c62
-rw-r--r--drivers/media/video/saa7134/saa7134.h2
2 files changed, 13 insertions, 51 deletions
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index 5f74ea467d4e..f05b0a9a5e6f 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -182,55 +182,28 @@ int saa7134_tuner_callback(void *ptr, int command, int arg)
182/* delayed request_module */ 182/* delayed request_module */
183 183
184#if defined(CONFIG_MODULES) && defined(MODULE) 184#if defined(CONFIG_MODULES) && defined(MODULE)
185static int need_empress;
186static int need_dvb;
187static int need_alsa;
188static int need_oss;
189 185
190static int pending_call(struct notifier_block *self, unsigned long state,
191 void *module)
192{
193 if (module != THIS_MODULE || state != MODULE_STATE_LIVE)
194 return NOTIFY_DONE;
195 186
196 if (need_empress) 187static void request_module_async(struct work_struct *work){
188 struct saa7134_dev* dev = container_of(work, struct saa7134_dev, request_module_wk);
189 if (card_is_empress(dev))
197 request_module("saa7134-empress"); 190 request_module("saa7134-empress");
198 if (need_dvb) 191 if (card_is_dvb(dev))
199 request_module("saa7134-dvb"); 192 request_module("saa7134-dvb");
200 if (need_alsa) 193 if (alsa)
201 request_module("saa7134-alsa"); 194 request_module("saa7134-alsa");
202 if (need_oss) 195 if (oss)
203 request_module("saa7134-oss"); 196 request_module("saa7134-oss");
204 return NOTIFY_DONE;
205} 197}
206 198
207static int pending_registered; 199static void request_submodules(struct saa7134_dev *dev)
208static struct notifier_block pending_notifier = {
209 .notifier_call = pending_call,
210};
211
212static void request_module_depend(char *name, int *flag)
213{ 200{
214 int err; 201 INIT_WORK(&dev->request_module_wk, request_module_async);
215 switch (THIS_MODULE->state) { 202 schedule_work(&dev->request_module_wk);
216 case MODULE_STATE_COMING:
217 if (!pending_registered) {
218 err = register_module_notifier(&pending_notifier);
219 pending_registered = 1;
220 }
221 *flag = 1;
222 break;
223 case MODULE_STATE_LIVE:
224 request_module(name);
225 break;
226 default:
227 /* nothing */;
228 break;
229 }
230} 203}
231 204
232#else 205#else
233#define request_module_depend(name,flag) 206#define request_submodules()
234#endif /* CONFIG_MODULES */ 207#endif /* CONFIG_MODULES */
235 208
236/* ------------------------------------------------------------------ */ 209/* ------------------------------------------------------------------ */
@@ -1002,18 +975,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1002 request_module("tuner"); 975 request_module("tuner");
1003 if (card_is_empress(dev)) { 976 if (card_is_empress(dev)) {
1004 request_module("saa6752hs"); 977 request_module("saa6752hs");
1005 request_module_depend("saa7134-empress",&need_empress);
1006 } 978 }
1007 979
1008 if (card_is_dvb(dev)) 980 request_submodules(dev);
1009 request_module_depend("saa7134-dvb",&need_dvb);
1010
1011
1012 if (alsa)
1013 request_module_depend("saa7134-alsa",&need_alsa);
1014
1015 if (oss)
1016 request_module_depend("saa7134-oss",&need_oss);
1017 981
1018 v4l2_prio_init(&dev->prio); 982 v4l2_prio_init(&dev->prio);
1019 983
@@ -1210,10 +1174,6 @@ static int saa7134_init(void)
1210 1174
1211static void saa7134_fini(void) 1175static void saa7134_fini(void)
1212{ 1176{
1213#if defined(CONFIG_MODULES) && defined(MODULE)
1214 if (pending_registered)
1215 unregister_module_notifier(&pending_notifier);
1216#endif /* CONFIG_MODULES */
1217 pci_unregister_driver(&saa7134_pci_driver); 1177 pci_unregister_driver(&saa7134_pci_driver);
1218} 1178}
1219 1179
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index c365ec581a11..6aeba144ff6e 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -437,6 +437,8 @@ struct saa7134_dev {
437#ifdef VIDIOC_G_PRIORITY 437#ifdef VIDIOC_G_PRIORITY
438 struct v4l2_prio_state prio; 438 struct v4l2_prio_state prio;
439#endif 439#endif
440 /* workstruct for loading modules */
441 struct work_struct request_module_wk;
440 442
441 /* insmod option/autodetected */ 443 /* insmod option/autodetected */
442 int autodetected; 444 int autodetected;