PCI: complain about devices that seem to be broken
[safe/jmp/linux-2.6] / drivers / media / video / bt8xx / bttv-i2c.c
index bcd2cd2..407fa61 100644 (file)
 #include <linux/jiffies.h>
 #include <asm/io.h>
 
-static int attach_inform(struct i2c_client *client);
-
 static int i2c_debug;
 static int i2c_hw;
 static int i2c_scan;
 module_param(i2c_debug, int, 0644);
-MODULE_PARM_DESC(i2c_hw,"configure i2c debug level");
+MODULE_PARM_DESC(i2c_debug, "configure i2c debug level");
 module_param(i2c_hw,    int, 0444);
 MODULE_PARM_DESC(i2c_hw,"force use of hardware i2c support, "
                        "instead of software bitbang");
@@ -231,7 +229,8 @@ bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last)
 
 static int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num)
 {
-       struct bttv *btv = i2c_get_adapdata(i2c_adap);
+       struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap);
+       struct bttv *btv = to_bttv(v4l2_dev);
        int retval = 0;
        int i;
 
@@ -265,52 +264,6 @@ static const struct i2c_algorithm bttv_algo = {
 /* ----------------------------------------------------------------------- */
 /* I2C functions - common stuff                                            */
 
-static int attach_inform(struct i2c_client *client)
-{
-       struct bttv *btv = i2c_get_adapdata(client->adapter);
-       int addr=ADDR_UNSET;
-
-
-       if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr)
-               addr = bttv_tvcards[btv->c.type].tuner_addr;
-
-
-       if (bttv_debug)
-               printk(KERN_DEBUG "bttv%d: %s i2c attach [addr=0x%x,client=%s]\n",
-                       btv->c.nr, client->driver->driver.name, client->addr,
-                       client->name);
-       if (!client->driver->command)
-               return 0;
-
-       if (client->driver->id == I2C_DRIVERID_MSP3400)
-               btv->i2c_msp34xx_client = client;
-       if (client->driver->id == I2C_DRIVERID_TVAUDIO)
-               btv->i2c_tvaudio_client = client;
-       if (btv->tuner_type != UNSET) {
-               struct tuner_setup tun_setup;
-
-               if ((addr==ADDR_UNSET) ||
-                               (addr==client->addr)) {
-
-                       tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV | T_RADIO;
-                       tun_setup.type = btv->tuner_type;
-                       tun_setup.addr = addr;
-                       bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup);
-               }
-
-       }
-
-       return 0;
-}
-
-void bttv_call_i2c_clients(struct bttv *btv, unsigned int cmd, void *arg)
-{
-       if (0 != btv->i2c_rc)
-               return;
-       i2c_clients_command(&btv->c.i2c_adap, cmd, arg);
-}
-
-
 /* read I2C */
 int bttv_I2CRead(struct bttv *btv, unsigned char addr, char *probe_for)
 {
@@ -399,7 +352,6 @@ int __devinit init_bttv_i2c(struct bttv *btv)
                /* bt878 */
                strlcpy(btv->c.i2c_adap.name, "bt878",
                        sizeof(btv->c.i2c_adap.name));
-               btv->c.i2c_adap.id = I2C_HW_B_BT848;    /* FIXME */
                btv->c.i2c_adap.algo = &bttv_algo;
        } else {
                /* bt848 */
@@ -409,7 +361,6 @@ int __devinit init_bttv_i2c(struct bttv *btv)
 
                strlcpy(btv->c.i2c_adap.name, "bttv",
                        sizeof(btv->c.i2c_adap.name));
-               btv->c.i2c_adap.id = I2C_HW_B_BT848;
                memcpy(&btv->i2c_algo, &bttv_i2c_algo_bit_template,
                       sizeof(bttv_i2c_algo_bit_template));
                btv->i2c_algo.udelay = i2c_udelay;
@@ -417,21 +368,15 @@ int __devinit init_bttv_i2c(struct bttv *btv)
                btv->c.i2c_adap.algo_data = &btv->i2c_algo;
        }
        btv->c.i2c_adap.owner = THIS_MODULE;
-       btv->c.i2c_adap.class = I2C_CLASS_TV_ANALOG;
-       btv->c.i2c_adap.client_register = attach_inform;
 
        btv->c.i2c_adap.dev.parent = &btv->c.pci->dev;
        snprintf(btv->c.i2c_adap.name, sizeof(btv->c.i2c_adap.name),
                 "bt%d #%d [%s]", btv->id, btv->c.nr,
                 btv->use_i2c_hw ? "hw" : "sw");
 
-       i2c_set_adapdata(&btv->c.i2c_adap, btv);
+       i2c_set_adapdata(&btv->c.i2c_adap, &btv->c.v4l2_dev);
        btv->i2c_client.adapter = &btv->c.i2c_adap;
 
-       if (bttv_tvcards[btv->c.type].no_video)
-               btv->c.i2c_adap.class &= ~I2C_CLASS_TV_ANALOG;
-       if (bttv_tvcards[btv->c.type].has_dvb)
-               btv->c.i2c_adap.class |= I2C_CLASS_TV_DIGITAL;
 
        if (btv->use_i2c_hw) {
                btv->i2c_rc = i2c_add_adapter(&btv->c.i2c_adap);
@@ -441,10 +386,35 @@ int __devinit init_bttv_i2c(struct bttv *btv)
                btv->i2c_rc = i2c_bit_add_bus(&btv->c.i2c_adap);
        }
        if (0 == btv->i2c_rc && i2c_scan)
-               do_i2c_scan(btv->c.name,&btv->i2c_client);
+               do_i2c_scan(btv->c.v4l2_dev.name, &btv->i2c_client);
+
        return btv->i2c_rc;
 }
 
+/* Instantiate the I2C IR receiver device, if present */
+void __devinit init_bttv_i2c_ir(struct bttv *btv)
+{
+       if (0 == btv->i2c_rc) {
+               struct i2c_board_info info;
+               /* The external IR receiver is at i2c address 0x34 (0x35 for
+                  reads).  Future Hauppauge cards will have an internal
+                  receiver at 0x30 (0x31 for reads).  In theory, both can be
+                  fitted, and Hauppauge suggest an external overrides an
+                  internal.
+
+                  That's why we probe 0x1a (~0x34) first. CB
+               */
+               const unsigned short addr_list[] = {
+                       0x1a, 0x18, 0x4b, 0x64, 0x30, 0x71,
+                       I2C_CLIENT_END
+               };
+
+               memset(&info, 0, sizeof(struct i2c_board_info));
+               strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
+               i2c_new_probed_device(&btv->c.i2c_adap, &info, addr_list);
+       }
+}
+
 int __devexit fini_bttv_i2c(struct bttv *btv)
 {
        if (0 != btv->i2c_rc)