OSDN Git Service

V4L/DVB (11744): pvrusb2: Select, track, and report IR scheme in use with the device
authorMike Isely <isely@pobox.com>
Mon, 6 Apr 2009 04:51:38 +0000 (01:51 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 16 Jun 2009 21:20:59 +0000 (18:20 -0300)
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>
drivers/media/video/pvrusb2/pvrusb2-devattr.c
drivers/media/video/pvrusb2/pvrusb2-devattr.h
drivers/media/video/pvrusb2/pvrusb2-hdw-internal.h
drivers/media/video/pvrusb2/pvrusb2-hdw.c
drivers/media/video/pvrusb2/pvrusb2-i2c-core.c

index 76d42d9..a0688c0 100644 (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,
 };
 
 
index 3e55338..73e0e0b 100644 (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
index 5d75eb5..5b152ff 100644 (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;
index add3395..686df1a 100644 (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;
index 9af282f..838d01c 100644 (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);