Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d643a37 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (6209): pvrusb2: Better discriminate among device types



This is a bunch of cleanup in various places to improve behavior based
on actual device type being driven.  While this doesn't actually
affect operation with existing devices, it cleans things up so that it
will be easier / more deterministic when other devices are added.
Ideally we should make stuff like this table-driven, but for now this
is just a series of small incremental (read: safe) improvements.

Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 4db666cc
Loading
Loading
Loading
Loading
+54 −28
Original line number Diff line number Diff line
@@ -1143,6 +1143,13 @@ static int pvr2_upload_firmware1(struct pvr2_hdw *hdw)
			fw_files_24xxx, ARRAY_SIZE(fw_files_24xxx)
		},
	};

	if ((hdw->hdw_type >= ARRAY_SIZE(fw_file_defs)) ||
	    (!fw_file_defs[hdw->hdw_type].lst)) {
		hdw->fw1_state = FW1_STATE_OK;
		return 0;
	}

	hdw->fw1_state = FW1_STATE_FAILED; // default result

	trace_firmware("pvr2_upload_firmware1");
@@ -1224,6 +1231,11 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw)
		CX2341X_FIRM_ENC_FILENAME,
	};

	if ((hdw->hdw_type != PVR2_HDW_TYPE_29XXX) &&
	    (hdw->hdw_type != PVR2_HDW_TYPE_24XXX)) {
		return 0;
	}

	trace_firmware("pvr2_upload_firmware2");

	ret = pvr2_locate_firmware(hdw,&fw_entry,"encoder",
@@ -1742,13 +1754,17 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
	unsigned int idx;
	struct pvr2_ctrl *cptr;
	int reloadFl = 0;
	if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) ||
	    (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
		if (!reloadFl) {
		reloadFl = (hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
			reloadFl =
				(hdw->usb_intf->cur_altsetting->desc.bNumEndpoints
				 == 0);
			if (reloadFl) {
				pvr2_trace(PVR2_TRACE_INIT,
					   "USB endpoint config looks strange"
				   "; possibly firmware needs to be loaded");
					   "; possibly firmware needs to be"
					   " loaded");
			}
		}
		if (!reloadFl) {
@@ -1756,7 +1772,8 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
			if (reloadFl) {
				pvr2_trace(PVR2_TRACE_INIT,
					   "Check for FX2 firmware failed"
				   "; possibly firmware needs to be loaded");
					   "; possibly firmware needs to be"
					   " loaded");
			}
		}
		if (reloadFl) {
@@ -1766,6 +1783,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
			}
			return;
		}
	}
	hdw->fw1_state = FW1_STATE_OK;

	if (initusbreset) {
@@ -1773,10 +1791,17 @@ 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]);
	if (hdw->hdw_type < ARRAY_SIZE(pvr2_client_lists)) {
		for (idx = 0;
		     idx < pvr2_client_lists[hdw->hdw_type].cnt;
		     idx++) {
			request_module(
				pvr2_client_lists[hdw->hdw_type].lst[idx]);
		}
	}

	if ((hdw->hdw_type == PVR2_HDW_TYPE_29XXX) ||
	    (hdw->hdw_type == PVR2_HDW_TYPE_24XXX)) {
		pvr2_hdw_cmd_powerup(hdw);
		if (!pvr2_hdw_dev_ok(hdw)) return;

@@ -1785,6 +1810,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
			pvr2_hdw_render_useless(hdw);
			return;
		}
	}

	// This step MUST happen after the earlier powerup step.
	pvr2_i2c_core_init(hdw);