From: Gerd Knorr - fix saa7134 module loading issues. Signed-off-by: Gerd Knorr Signed-off-by: Andrew Morton --- 25-akpm/drivers/media/video/saa7134/saa7134-core.c | 47 ++++++++++++++++++++- 1 files changed, 45 insertions(+), 2 deletions(-) diff -puN drivers/media/video/saa7134/saa7134-core.c~v4l-saa7134-module drivers/media/video/saa7134/saa7134-core.c --- 25/drivers/media/video/saa7134/saa7134-core.c~v4l-saa7134-module 2005-01-22 18:44:46.764115840 -0800 +++ 25-akpm/drivers/media/video/saa7134/saa7134-core.c 2005-01-22 18:44:46.768115232 -0800 @@ -222,6 +222,49 @@ static void dump_statusregs(struct saa71 } #endif +/* ----------------------------------------------------------- */ +/* delayed request_module */ + +static int need_empress; +static int need_dvb; + +static int pending_call(struct notifier_block *self, unsigned long state, + void *module) +{ + if (module != THIS_MODULE || state != MODULE_STATE_LIVE) + return NOTIFY_DONE; + + if (need_empress) + request_module("saa7134-empress"); + if (need_dvb) + request_module("saa7134-dvb"); + 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) +{ + switch (THIS_MODULE->state) { + case MODULE_STATE_COMING: + if (!pending_registered) { + register_module_notifier(&pending_notifier); + pending_registered = 1; + } + *flag = 1; + break; + case MODULE_STATE_LIVE: + request_module(name); + break; + default: + /* nothing */; + break; + } +} + /* ------------------------------------------------------------------ */ /* nr of (saa7134-)pages for the given buffer size */ @@ -941,11 +984,11 @@ static int __devinit saa7134_initdev(str if (dev->tda9887_conf) request_module("tda9887"); if (card_is_empress(dev)) { - request_module("saa7134-empress"); request_module("saa6752hs"); + request_module_depend("saa7134-empress",&need_empress); } if (card_is_dvb(dev)) - request_module("saa7134-dvb"); + request_module_depend("saa7134-dvb",&need_dvb); v4l2_prio_init(&dev->prio); _