Commit 6740a932 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] tm6000: automatically load alsa and dvb modules

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: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9f711a80
...@@ -1052,6 +1052,33 @@ static void use_alternative_detection_method(struct tm6000_core *dev) ...@@ -1052,6 +1052,33 @@ static void use_alternative_detection_method(struct tm6000_core *dev)
tm6000_boards[model].name, model); 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) static int tm6000_init_dev(struct tm6000_core *dev)
{ {
struct v4l2_frequency f; struct v4l2_frequency f;
...@@ -1114,6 +1141,8 @@ static int tm6000_init_dev(struct tm6000_core *dev) ...@@ -1114,6 +1141,8 @@ static int tm6000_init_dev(struct tm6000_core *dev)
tm6000_ir_init(dev); tm6000_ir_init(dev);
request_modules(dev);
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return 0; return 0;
...@@ -1326,6 +1355,8 @@ static void tm6000_usb_disconnect(struct usb_interface *interface) ...@@ -1326,6 +1355,8 @@ static void tm6000_usb_disconnect(struct usb_interface *interface)
printk(KERN_INFO "tm6000: disconnecting %s\n", dev->name); printk(KERN_INFO "tm6000: disconnecting %s\n", dev->name);
flush_request_modules(dev);
tm6000_ir_fini(dev); tm6000_ir_fini(dev);
if (dev->gpio.power_led) { if (dev->gpio.power_led) {
......
...@@ -188,6 +188,9 @@ struct tm6000_core { ...@@ -188,6 +188,9 @@ struct tm6000_core {
/* Device Capabilities*/ /* Device Capabilities*/
struct tm6000_capabilities caps; struct tm6000_capabilities caps;
/* Used to load alsa/dvb */
struct work_struct request_module_wk;
/* Tuner configuration */ /* Tuner configuration */
int tuner_type; /* type of the tuner */ int tuner_type; /* type of the tuner */
int tuner_addr; /* tuner address */ int tuner_addr; /* tuner address */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment