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

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
...@@ -71,6 +71,7 @@ static const struct pvr2_device_desc pvr2_device_29xxx = { ...@@ -71,6 +71,7 @@ static const struct pvr2_device_desc pvr2_device_29xxx = {
.flag_has_svideo = !0, .flag_has_svideo = !0,
.signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE,
.led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE,
.ir_scheme = PVR2_IR_SCHEME_29XXX,
}; };
......
...@@ -78,8 +78,10 @@ struct pvr2_string_table { ...@@ -78,8 +78,10 @@ struct pvr2_string_table {
#define PVR2_LED_SCHEME_HAUPPAUGE 1 #define PVR2_LED_SCHEME_HAUPPAUGE 1
#define PVR2_IR_SCHEME_NONE 0 #define PVR2_IR_SCHEME_NONE 0
#define PVR2_IR_SCHEME_24XXX 1 #define PVR2_IR_SCHEME_24XXX 1 /* FX2-controlled IR */
#define PVR2_IR_SCHEME_ZILOG 2 #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 /* This describes a particular hardware type (except for the USB device ID
which must live in a separate structure due to environmental which must live in a separate structure due to environmental
...@@ -162,19 +164,9 @@ struct pvr2_device_desc { ...@@ -162,19 +164,9 @@ struct pvr2_device_desc {
ensure that it is found. */ ensure that it is found. */
unsigned int flag_has_wm8775:1; unsigned int flag_has_wm8775:1;
/* Indicate any specialized IR scheme that might need to be /* Indicate IR scheme of hardware. If not set, then it is assumed
supported by this driver. If not set, then it is assumed that that IR can work without any help from the driver. */
IR can work without help from the driver (which is frequently unsigned int ir_scheme:3;
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;
/* These bits define which kinds of sources the device can handle. /* These bits define which kinds of sources the device can handle.
Note: Digital tuner presence is inferred by the Note: Digital tuner presence is inferred by the
......
...@@ -200,6 +200,9 @@ struct pvr2_hdw { ...@@ -200,6 +200,9 @@ struct pvr2_hdw {
int i2c_cx25840_hack_state; int i2c_cx25840_hack_state;
int i2c_linked; int i2c_linked;
/* IR related */
unsigned int ir_scheme_active; /* IR scheme as seen from the outside */
/* Frequency table */ /* Frequency table */
unsigned int freqTable[FREQTABLE_SIZE]; unsigned int freqTable[FREQTABLE_SIZE];
unsigned int freqProgSlot; unsigned int freqProgSlot;
......
...@@ -142,6 +142,15 @@ static const unsigned char *module_i2c_addresses[] = { ...@@ -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 /* Define the list of additional controls we'll dynamically construct based
on query of the cx2341x module. */ on query of the cx2341x module. */
struct pvr2_mpeg_ids { struct pvr2_mpeg_ids {
...@@ -2170,7 +2179,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw) ...@@ -2170,7 +2179,7 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
} }
/* Take the IR chip out of reset, if appropriate */ /* 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, pvr2_issue_simple_cmd(hdw,
FX2CMD_HCW_ZILOG_RESET | FX2CMD_HCW_ZILOG_RESET |
(1 << 8) | (1 << 8) |
...@@ -2451,6 +2460,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, ...@@ -2451,6 +2460,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
GFP_KERNEL); GFP_KERNEL);
if (!hdw->controls) goto fail; if (!hdw->controls) goto fail;
hdw->hdw_desc = hdw_desc; hdw->hdw_desc = hdw_desc;
hdw->ir_scheme_active = hdw->hdw_desc->ir_scheme;
for (idx = 0; idx < hdw->control_cnt; idx++) { for (idx = 0; idx < hdw->control_cnt; idx++) {
cptr = hdw->controls + idx; cptr = hdw->controls + idx;
cptr->hdw = hdw; cptr->hdw = hdw;
...@@ -4809,6 +4819,12 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which, ...@@ -4809,6 +4819,12 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
stats.buffers_processed, stats.buffers_processed,
stats.buffers_failed); 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; default: break;
} }
return 0; return 0;
......
...@@ -574,7 +574,9 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw) ...@@ -574,7 +574,9 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
printk(KERN_INFO "%s: IR disabled\n",hdw->name); printk(KERN_INFO "%s: IR disabled\n",hdw->name);
hdw->i2c_func[0x18] = i2c_black_hole; hdw->i2c_func[0x18] = i2c_black_hole;
} else if (ir_mode[hdw->unit_number] == 1) { } 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; hdw->i2c_func[0x18] = i2c_24xxx_ir;
} }
} }
...@@ -597,12 +599,18 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw) ...@@ -597,12 +599,18 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
i2c_add_adapter(&hdw->i2c_adap); i2c_add_adapter(&hdw->i2c_adap);
if (hdw->i2c_func[0x18] == i2c_24xxx_ir) { if (hdw->i2c_func[0x18] == i2c_24xxx_ir) {
/* Probe for a different type of IR receiver on this /* 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)) { if (do_i2c_probe(hdw, 0x71)) {
pvr2_trace(PVR2_TRACE_INFO, pvr2_trace(PVR2_TRACE_INFO,
"Device has newer IR hardware;" "Device has newer IR hardware;"
" disabling unneeded virtual IR device"); " disabling unneeded virtual IR device");
hdw->i2c_func[0x18] = NULL; 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); if (i2c_scan) do_i2c_scan(hdw);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment