Commit 4217e252 authored by Markus Rechberger's avatar Markus Rechberger Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (5324): This patch fixes request_module_depend()



this patch fixes request_module_depend()

Signed-off-by: default avatarMarkus Rechberger <markus.rechberger@amd.com>
Signed-off-by: default avatarHartmut Hackmann <hartmut.hackmann@t-online.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent cfeb8839
Loading
Loading
Loading
Loading
+11 −51
Original line number Diff line number Diff line
@@ -182,55 +182,28 @@ int saa7134_tuner_callback(void *ptr, int command, int arg)
/* 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;

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)
static void request_module_async(struct work_struct *work){
	struct saa7134_dev* dev = container_of(work, struct saa7134_dev, request_module_wk);
	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(&dev->request_module_wk, request_module_async);
	schedule_work(&dev->request_module_wk);
}

#else
#define request_module_depend(name,flag)
#define request_submodules()
#endif /* CONFIG_MODULES */

/* ------------------------------------------------------------------ */
@@ -1002,18 +975,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);

@@ -1210,10 +1174,6 @@ static int saa7134_init(void)

static void saa7134_fini(void)
{
#if defined(CONFIG_MODULES) && defined(MODULE)
	if (pending_registered)
		unregister_module_notifier(&pending_notifier);
#endif /* CONFIG_MODULES */
	pci_unregister_driver(&saa7134_pci_driver);
}

+2 −0
Original line number Diff line number Diff line
@@ -437,6 +437,8 @@ struct saa7134_dev {
#ifdef VIDIOC_G_PRIORITY
	struct v4l2_prio_state     prio;
#endif
	/* workstruct for loading modules */
	struct work_struct request_module_wk;

	/* insmod option/autodetected */
	int                        autodetected;