summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Isely <isely@pobox.com>2006-04-20 00:20:40 -0500
committerMike Isely <isely@pobox.com>2006-04-20 00:20:40 -0500
commitd678f2eed5e7c30fc3976ef3e8293221ff2c0bea (patch)
treeccb60880168178b0a85defd26e0c695d72e97b9c
parent8bd600f2ff270e5c65b368fd240b41bb33ea57d2 (diff)
downloadmediapointer-dvb-s2-d678f2eed5e7c30fc3976ef3e8293221ff2c0bea.tar.gz
mediapointer-dvb-s2-d678f2eed5e7c30fc3976ef3e8293221ff2c0bea.tar.bz2
Change pvrusb2 module request behavior to be more conservative
From: Mike Isely <isely@pobox.com> Previously when the pvrusb2 driver loaded, it immediately did a request_module() on all possible I2C support modules it might need. But that is overkill, since the actual modules needed is a subset depending on the model type. This change delays module request until the hardware shows up, and then it only requests the modules that make sense for the specific hardware. Signed-off-by: Mike Isely <isely@pobox.com>
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c43
-rw-r--r--linux/drivers/media/video/pvrusb2/pvrusb2-main.c10
2 files changed, 39 insertions, 14 deletions
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
index 350db8dcb..8da06d216 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-hdw.c
@@ -53,6 +53,40 @@ static const char *pvr2_device_names[] = {
#endif
};
+struct pvr2_string_table {
+ const char **lst;
+ unsigned int cnt;
+};
+
+// Names of other client modules to request for 24xxx model hardware
+static const char *pvr2_client_24xxx[] = {
+ "cx25840",
+ "tuner",
+ "tda9887",
+ "wm8775",
+};
+
+// Names of other client modules to request for 29xxx model hardware
+static const char *pvr2_client_29xxx[] = {
+ "msp3400",
+ "saa7115",
+ "tuner",
+ "tda9887",
+};
+
+static struct pvr2_string_table pvr2_client_lists[] = {
+ [PVR2_HDW_TYPE_29XXX] = {
+ pvr2_client_29xxx,
+ sizeof(pvr2_client_29xxx)/sizeof(pvr2_client_29xxx[0]),
+ },
+#ifdef CONFIG_VIDEO_PVRUSB2_24XXX
+ [PVR2_HDW_TYPE_24XXX] = {
+ pvr2_client_24xxx,
+ sizeof(pvr2_client_24xxx)/sizeof(pvr2_client_24xxx[0]),
+ },
+#endif
+};
+
static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = 0};
DECLARE_MUTEX(pvr2_unit_sem);
@@ -817,10 +851,7 @@ int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
"v4l-pvrusb2-24xxx-01.fw",
};
#endif
- static const struct {
- const char **lst;
- unsigned int cnt;
- } fw_file_defs[] = {
+ static const struct pvr2_string_table fw_file_defs[] = {
[PVR2_HDW_TYPE_29XXX] = {
fw_files_29xxx,
sizeof(fw_files_29xxx)/sizeof(fw_files_29xxx[0]),
@@ -1465,6 +1496,10 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
}
if (!pvr2_hdw_dev_ok(hdw)) return;
+ for (idx = 0; idx < pvr2_client_lists[hdw->hdw_type].cnt; idx++) {
+ request_module(pvr2_client_lists[hdw->hdw_type].lst[idx]);
+ }
+
pvr2_hdw_cmd_powerup(hdw);
if (!pvr2_hdw_dev_ok(hdw)) return;
diff --git a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
index 988f32ad4..245f7a36d 100644
--- a/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
+++ b/linux/drivers/media/video/pvrusb2/pvrusb2-main.c
@@ -134,16 +134,6 @@ static int __init pvr_init(void)
pvr2_trace(PVR2_TRACE_INIT,"pvr_init");
- /* Auto-load various support modules (with which we may
- indirectly interact) */
- request_module("msp3400");
- request_module("cx25840");
- request_module("saa7115");
- request_module("tuner");
- request_module("tveeprom");
- request_module("tda9887");
- request_module("wm8775");
-
#ifdef CONFIG_VIDEO_PVRUSB2_SYSFS
class_ptr = pvr2_sysfs_class_create();
#endif /* CONFIG_VIDEO_PVRUSB2_SYSFS */