Browse Source

V4L/DVB (6697): pvrusb2: Existence of Hauppauge ROM is a device-specific attribute

Arrange so that the pvrusb2 driver can optionally work without a
Hauppauge ROM being present - which is fairly important for devices
that happen to not come from Hauppauge.  The expected existence of a
Hauppauge ROM is now a device attribute.  The tuner type is now also a
device attribute, which is consulted if there is no ROM.

Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Mike Isely 17 years ago
parent
commit
aaf7884db3

+ 2 - 0
drivers/media/video/pvrusb2/pvrusb2-devattr.c

@@ -72,6 +72,7 @@ const struct pvr2_device_desc pvr2_device_descriptions[] = {
 		.client_modules.cnt = ARRAY_SIZE(pvr2_client_29xxx),
 		.fx2_firmware.lst = pvr2_fw1_names_29xxx,
 		.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_29xxx),
+		.flag_has_hauppauge_rom = !0,
 	},
 	[PVR2_HDW_TYPE_24XXX] = {
 		.description = "WinTV PVR USB2 Model Category 24xxxx",
@@ -82,6 +83,7 @@ const struct pvr2_device_desc pvr2_device_descriptions[] = {
 		.fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_24xxx),
 		.flag_has_cx25840 = !0,
 		.flag_has_wm8775 = !0,
+		.flag_has_hauppauge_rom = !0,
 	},
 };
 

+ 7 - 0
drivers/media/video/pvrusb2/pvrusb2-devattr.h

@@ -55,9 +55,16 @@ struct pvr2_device_desc {
 	   was initialized from internal ROM. */
 	struct pvr2_string_table fx2_firmware;
 
+	/* V4L tuner type ID to use with this device (only used if the
+	   driver could not discover the type any other way). */
+	int default_tuner_type;
+
 	/* If set, we don't bother trying to load cx23416 firmware. */
 	char flag_skip_cx23416_firmware;
 
+	/* Device has a hauppauge eeprom which we can interrogate. */
+	char flag_has_hauppauge_rom;
+
 	/* Device does not require a powerup command to be issued. */
 	char flag_no_powerup;
 

+ 16 - 9
drivers/media/video/pvrusb2/pvrusb2-hdw.c

@@ -1428,6 +1428,7 @@ static int get_default_tuner_type(struct pvr2_hdw *hdw)
 	}
 	if (tp < 0) return -EINVAL;
 	hdw->tuner_type = tp;
+	hdw->tuner_updated = !0;
 	return 0;
 }
 
@@ -1669,15 +1670,22 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
 	// thread-safe against the normal pvr2_send_request() mechanism.
 	// (We should make it thread safe).
 
-	ret = pvr2_hdw_get_eeprom_addr(hdw);
-	if (!pvr2_hdw_dev_ok(hdw)) return;
-	if (ret < 0) {
-		pvr2_trace(PVR2_TRACE_ERROR_LEGS,
-			   "Unable to determine location of eeprom, skipping");
-	} else {
-		hdw->eeprom_addr = ret;
-		pvr2_eeprom_analyze(hdw);
+	if (hdw->hdw_desc->flag_has_hauppauge_rom) {
+		ret = pvr2_hdw_get_eeprom_addr(hdw);
 		if (!pvr2_hdw_dev_ok(hdw)) return;
+		if (ret < 0) {
+			pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+				   "Unable to determine location of eeprom,"
+				   " skipping");
+		} else {
+			hdw->eeprom_addr = ret;
+			pvr2_eeprom_analyze(hdw);
+			if (!pvr2_hdw_dev_ok(hdw)) return;
+		}
+	} else {
+		hdw->tuner_type = hdw->hdw_desc->default_tuner_type;
+		hdw->tuner_updated = !0;
+		hdw->std_mask_eeprom = V4L2_STD_ALL;
 	}
 
 	pvr2_hdw_setup_std(hdw);
@@ -1686,7 +1694,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
 		pvr2_trace(PVR2_TRACE_INIT,
 			   "pvr2_hdw_setup: Tuner type overridden to %d",
 			   hdw->tuner_type);
-		hdw->tuner_updated = !0;
 	}
 
 	pvr2_i2c_core_check_stale(hdw);