[media] tm6000: automatically load alsa and dvb modules
authorMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 30 Nov 2011 17:54:05 +0000 (14:54 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 30 Nov 2011 18:49:37 +0000 (16:49 -0200)
All devices should support alsa module. Devices with DVB will
auto-load the dvb module. This way, tm6000-based devices should
now have hot plugin.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/tm6000/tm6000-cards.c
drivers/media/video/tm6000/tm6000.h

index 3873ce4dfdd797384d93f490baf31fdf1ff16262..6b74259cd5c89da5a7c77e769020a478c300a8e2 100644 (file)
@@ -1052,6 +1052,33 @@ static void use_alternative_detection_method(struct tm6000_core *dev)
               tm6000_boards[model].name, model);
 }
 
+#if defined(CONFIG_MODULES) && defined(MODULE)
+static void request_module_async(struct work_struct *work)
+{
+       struct tm6000_core *dev = container_of(work, struct tm6000_core,
+                                              request_module_wk);
+
+       request_module("tm6000-alsa");
+
+       if (dev->caps.has_dvb)
+               request_module("tm6000-dvb");
+}
+
+static void request_modules(struct tm6000_core *dev)
+{
+       INIT_WORK(&dev->request_module_wk, request_module_async);
+       schedule_work(&dev->request_module_wk);
+}
+
+static void flush_request_modules(struct tm6000_core *dev)
+{
+       flush_work_sync(&dev->request_module_wk);
+}
+#else
+#define request_modules(dev)
+#define flush_request_modules(dev)
+#endif /* CONFIG_MODULES */
+
 static int tm6000_init_dev(struct tm6000_core *dev)
 {
        struct v4l2_frequency f;
@@ -1114,6 +1141,8 @@ static int tm6000_init_dev(struct tm6000_core *dev)
 
        tm6000_ir_init(dev);
 
+       request_modules(dev);
+
        mutex_unlock(&dev->lock);
        return 0;
 
@@ -1326,6 +1355,8 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)
 
        printk(KERN_INFO "tm6000: disconnecting %s\n", dev->name);
 
+       flush_request_modules(dev);
+
        tm6000_ir_fini(dev);
 
        if (dev->gpio.power_led) {
index 2777e514eff27a8a95fa0d315f7b040c1ff2c8b3..27ba659cfa85610be14ecd957d5e11d9cdb775c0 100644 (file)
@@ -188,6 +188,9 @@ struct tm6000_core {
        /* Device Capabilities*/
        struct tm6000_capabilities      caps;
 
+       /* Used to load alsa/dvb */
+        struct work_struct             request_module_wk;
+
        /* Tuner configuration */
        int                             tuner_type;             /* type of the tuner */
        int                             tuner_addr;             /* tuner address */