mirror of
https://github.com/torvalds/linux.git
synced 2024-11-08 13:11:45 +00:00
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:
parent
06e61f8d5f
commit
27eab3840b
@ -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,
|
||||
};
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user