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

Commit 27eab384 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (11744): pvrusb2: Select, track, and report IR scheme in use with the device



This change defines all possible "IR schemes" related to the pvrusb2
driver, on a per-device basis.  That information is then set according
to the hardware in use.  The idea here is to make possible a more
intelligent future decision on which, if any, IR receiver driver might
be loaded during initialization.

Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 06e61f8d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ static const struct pvr2_device_desc pvr2_device_29xxx = {
		.flag_has_svideo = !0,
		.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
		.led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
		.ir_scheme = PVR2_IR_SCHEME_29XXX,
};


+7 −15
Original line number Diff line number Diff line
@@ -78,8 +78,10 @@ struct pvr2_string_table {
#define PVR2_LED_SCHEME_HAUPPAUGE 1

#define PVR2_IR_SCHEME_NONE 0
#define PVR2_IR_SCHEME_24XXX 1
#define PVR2_IR_SCHEME_ZILOG 2
#define PVR2_IR_SCHEME_24XXX 1 /* FX2-controlled IR */
#define PVR2_IR_SCHEME_ZILOG 2 /* HVR-1950 style (must be taken out of reset) */
#define PVR2_IR_SCHEME_24XXX_MCE 3 /* 24xxx MCE device */
#define PVR2_IR_SCHEME_29XXX 4 /* Original 29xxx device */

/* This describes a particular hardware type (except for the USB device ID
   which must live in a separate structure due to environmental
@@ -162,19 +164,9 @@ struct pvr2_device_desc {
	   ensure that it is found. */
	unsigned int flag_has_wm8775:1;

	/* Indicate any specialized IR scheme that might need to be
	   supported by this driver.  If not set, then it is assumed that
	   IR can work without help from the driver (which is frequently
	   the case).  This is otherwise set to one of
	   PVR2_IR_SCHEME_xxxx.  For "xxxx", the value "24XXX" indicates a
	   Hauppauge 24xxx class device which has an FPGA-hosted IR
	   receiver that can only be reached via FX2 command codes.  In
	   that case the pvrusb2 driver will emulate the behavior of the
	   older 29xxx device's IR receiver (a "virtual" I2C chip) in terms
	   of those command codes.  For the value "ZILOG", we're dealing
	   with an IR chip that must be taken out of reset via another FX2
	   command code (which is the case for HVR-1950 devices). */
	unsigned int ir_scheme:2;
	/* Indicate IR scheme of hardware.  If not set, then it is assumed
	   that IR can work without any help from the driver. */
	unsigned int ir_scheme:3;

	/* These bits define which kinds of sources the device can handle.
	   Note: Digital tuner presence is inferred by the
+3 −0
Original line number Diff line number Diff line
@@ -200,6 +200,9 @@ struct pvr2_hdw {
	int i2c_cx25840_hack_state;
	int i2c_linked;

	/* IR related */
	unsigned int ir_scheme_active; /* IR scheme as seen from the outside */

	/* Frequency table */
	unsigned int freqTable[FREQTABLE_SIZE];
	unsigned int freqProgSlot;
+17 −1
Original line number Diff line number Diff line
@@ -142,6 +142,15 @@ static const unsigned char *module_i2c_addresses[] = {
};


static const char *ir_scheme_names[] = {
	[PVR2_IR_SCHEME_NONE] = "none",
	[PVR2_IR_SCHEME_29XXX] = "29xxx",
	[PVR2_IR_SCHEME_24XXX] = "24xxx (29xxx emulation)",
	[PVR2_IR_SCHEME_24XXX_MCE] = "24xxx (MCE device)",
	[PVR2_IR_SCHEME_ZILOG] = "Zilog",
};


/* Define the list of additional controls we'll dynamically construct based
   on query of the cx2341x module. */
struct pvr2_mpeg_ids {
@@ -2170,7 +2179,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
	}

	/* Take the IR chip out of reset, if appropriate */
	if (hdw->hdw_desc->ir_scheme == PVR2_IR_SCHEME_ZILOG) {
	if (hdw->ir_scheme_active == PVR2_IR_SCHEME_ZILOG) {
		pvr2_issue_simple_cmd(hdw,
				      FX2CMD_HCW_ZILOG_RESET |
				      (1 << 8) |
@@ -2451,6 +2460,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
				GFP_KERNEL);
	if (!hdw->controls) goto fail;
	hdw->hdw_desc = hdw_desc;
	hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
	for (idx = 0; idx < hdw->control_cnt; idx++) {
		cptr = hdw->controls + idx;
		cptr->hdw = hdw;
@@ -4809,6 +4819,12 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
			stats.buffers_processed,
			stats.buffers_failed);
	}
	case 6: {
		unsigned int id = hdw->ir_scheme_active;
		return scnprintf(buf, acnt, "ir scheme: id=%d %s", id,
				 (id >= ARRAY_SIZE(ir_scheme_names) ?
				  "?" : ir_scheme_names[id]));
	}
	default: break;
	}
	return 0;
+10 −2
Original line number Diff line number Diff line
@@ -574,7 +574,9 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
		printk(KERN_INFO "%s: IR disabled\n",hdw->name);
		hdw->i2c_func[0x18] = i2c_black_hole;
	} else if (ir_mode[hdw->unit_number] == 1) {
		if (hdw->hdw_desc->ir_scheme == PVR2_IR_SCHEME_24XXX) {
		if (hdw->ir_scheme_active == PVR2_IR_SCHEME_24XXX) {
			/* Set up translation so that our IR looks like a
			   29xxx device */
			hdw->i2c_func[0x18] = i2c_24xxx_ir;
		}
	}
@@ -597,12 +599,18 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
	i2c_add_adapter(&hdw->i2c_adap);
	if (hdw->i2c_func[0x18] == i2c_24xxx_ir) {
		/* Probe for a different type of IR receiver on this
		   device.  If present, disable the emulated IR receiver. */
		   device.  This is really the only way to differentiate
		   older 24xxx devices from 24xxx variants that include an
		   IR blaster.  If the IR blaster is present, the IR
		   receiver is part of that chip and thus we must disable
		   the emulated IR receiver. */
		if (do_i2c_probe(hdw, 0x71)) {
			pvr2_trace(PVR2_TRACE_INFO,
				   "Device has newer IR hardware;"
				   " disabling unneeded virtual IR device");
			hdw->i2c_func[0x18] = NULL;
			/* Remember that this is a different device... */
			hdw->ir_scheme_active = PVR2_IR_SCHEME_24XXX_MCE;
		}
	}
	if (i2c_scan) do_i2c_scan(hdw);