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: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Mike Isely 2009-04-06 01:51:38 -03:00 committed by Mauro Carvalho Chehab
parent 06e61f8d5f
commit 27eab3840b
5 changed files with 38 additions and 18 deletions

View File

@ -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,
};

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);