diff options
-rw-r--r-- | linux/drivers/media/video/saa7134/saa7134-core.c | 78 |
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); } |