V4L/DVB (8901): pvrusb2: Disable virtual IR device when not needed.
authorMike Isely <isely@pobox.com>
Mon, 1 Sep 2008 00:06:11 +0000 (21:06 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:36:57 +0000 (09:36 -0200)
Disable "virtual" IR receiver on for 24xxx devices that have an
internal IR blaster.  In that case there's another another IR
receiver present and to leave the virtual receiver available
just causes confusion.  This means that 24xxx users will no
longer see a phantom IR chip.

Signed-off-by: Mike Isely <isely@pobox.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/pvrusb2/pvrusb2-i2c-core.c

index afb53b49b31a0433a7cecb21fa5bbd063e86828e..72d615a87c36d972404be5e2ee9229a0291bac51 100644 (file)
@@ -948,22 +948,32 @@ static struct i2c_adapter pvr2_i2c_adap_template = {
        .client_unregister = pvr2_i2c_detach_inform,
 };
 
-static void do_i2c_scan(struct pvr2_hdw *hdw)
+
+/* Return true if device exists at given address */
+static int do_i2c_probe(struct pvr2_hdw *hdw, int addr)
 {
        struct i2c_msg msg[1];
-       int i,rc;
+       int rc;
        msg[0].addr = 0;
        msg[0].flags = I2C_M_RD;
        msg[0].len = 0;
        msg[0].buf = NULL;
-       printk("%s: i2c scan beginning\n",hdw->name);
+       msg[0].addr = addr;
+       rc = i2c_transfer(&hdw->i2c_adap, msg, ARRAY_SIZE(msg));
+       return rc == 1;
+}
+
+static void do_i2c_scan(struct pvr2_hdw *hdw)
+{
+       int i;
+       printk(KERN_INFO "%s: i2c scan beginning\n", hdw->name);
        for (i = 0; i < 128; i++) {
-               msg[0].addr = i;
-               rc = i2c_transfer(&hdw->i2c_adap,msg, ARRAY_SIZE(msg));
-               if (rc != 1) continue;
-               printk("%s: i2c scan: found device @ 0x%x\n",hdw->name,i);
+               if (do_i2c_probe(hdw, i)) {
+                       printk(KERN_INFO "%s: i2c scan: found device @ 0x%x\n",
+                              hdw->name, i);
+               }
        }
-       printk("%s: i2c scan done.\n",hdw->name);
+       printk(KERN_INFO "%s: i2c scan done.\n", hdw->name);
 }
 
 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
@@ -1008,6 +1018,16 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
        mutex_init(&hdw->i2c_list_lock);
        hdw->i2c_linked = !0;
        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. */
+               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;
+               }
+       }
        if (i2c_scan) do_i2c_scan(hdw);
 }