summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux/drivers/media/video/saa7134/saa7134-core.c78
1 files changed, 24 insertions, 54 deletions
diff --git a/linux/drivers/media/video/saa7134/saa7134-core.c b/linux/drivers/media/video/saa7134/saa7134-core.c
index 0195b3597..194ad5a3f 100644
--- a/linux/drivers/media/video/saa7134/saa7134-core.c
+++ b/linux/drivers/media/video/saa7134/saa7134-core.c
@@ -242,59 +242,44 @@ static void dump_statusregs(struct saa7134_dev *dev)
/* delayed request_module */
#if defined(CONFIG_MODULES) && defined(MODULE)
-static int need_empress;
-static int need_dvb;
-static int need_alsa;
-static int need_oss;
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-#define request_module_depend(name,flag) request_module(name);
+/* This is the same as it did before, it very likely doesn't work
+ someone please review this part and remove it.. */
+static void request_submodules(struct saa7134_dev *dev){
+ if (card_is_empress(dev))
+ request_module("saa7134-empress");
+ if (card_is_dvb(dev))
+ request_module("saa7134-dvb");
+ if (alsa)
+ request_module("saa7134-alsa");
+ if (oss)
+ request_module("saa7134-oss");
+}
#else
-static int pending_call(struct notifier_block *self, unsigned long state,
- void *module)
-{
- if (module != THIS_MODULE || state != MODULE_STATE_LIVE)
- return NOTIFY_DONE;
+static struct work_struct request_module_wk;
- if (need_empress)
+static void request_module_async(void *ptr){
+ struct saa7134_dev *dev=(struct saa7134_dev*)ptr;
+ if (card_is_empress(dev))
request_module("saa7134-empress");
- if (need_dvb)
+ if (card_is_dvb(dev))
request_module("saa7134-dvb");
- if (need_alsa)
+ if (alsa)
request_module("saa7134-alsa");
- if (need_oss)
+ if (oss)
request_module("saa7134-oss");
- return NOTIFY_DONE;
}
-static int pending_registered;
-static struct notifier_block pending_notifier = {
- .notifier_call = pending_call,
-};
-
-static void request_module_depend(char *name, int *flag)
+static void request_submodules(struct saa7134_dev *dev)
{
- int err;
- switch (THIS_MODULE->state) {
- case MODULE_STATE_COMING:
- if (!pending_registered) {
- err = register_module_notifier(&pending_notifier);
- pending_registered = 1;
- }
- *flag = 1;
- break;
- case MODULE_STATE_LIVE:
- request_module(name);
- break;
- default:
- /* nothing */;
- break;
- }
+ INIT_WORK(&request_module_wk, request_module_async, dev);
+ schedule_work(&request_module_wk);
}
#endif
#else
-#define request_module_depend(name,flag)
+#define request_module_depend(name)
#endif /* CONFIG_MODULES */
/* ------------------------------------------------------------------ */
@@ -1076,18 +1061,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
request_module("tuner");
if (card_is_empress(dev)) {
request_module("saa6752hs");
- request_module_depend("saa7134-empress",&need_empress);
}
- if (card_is_dvb(dev))
- request_module_depend("saa7134-dvb",&need_dvb);
-
-
- if (alsa)
- request_module_depend("saa7134-alsa",&need_alsa);
-
- if (oss)
- request_module_depend("saa7134-oss",&need_oss);
+ request_submodules(dev);
v4l2_prio_init(&dev->prio);
@@ -1287,12 +1263,6 @@ static int saa7134_init(void)
static void saa7134_fini(void)
{
-#if defined(CONFIG_MODULES) && defined(MODULE)
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
- if (pending_registered)
- unregister_module_notifier(&pending_notifier);
-#endif
-#endif /* CONFIG_MODULES */
pci_unregister_driver(&saa7134_pci_driver);
}