static int ovcamchip_attach(struct i2c_adapter *adap) { int rc = 0; struct ovcamchip *ov; struct i2c_client *c; /* I2C is not a PnP bus, so we can never be certain that we're talking * to the right chip. To prevent damage to EEPROMS and such, only * attach to adapters that are known to contain OV camera chips. */ switch (adap->id) { case (I2C_ALGO_SMBUS | I2C_HW_SMBUS_OV511): case (I2C_ALGO_SMBUS | I2C_HW_SMBUS_OV518): case (I2C_ALGO_SMBUS | I2C_HW_SMBUS_OVFX2): case (I2C_ALGO_SMBUS | I2C_HW_SMBUS_W9968CF): PDEBUG(1, "Adapter ID 0x%06x accepted", adap->id); break; default: PDEBUG(1, "Adapter ID 0x%06x rejected", adap->id); return -ENODEV; } c = kmalloc(sizeof *c, GFP_KERNEL); if (!c) { rc = -ENOMEM; goto no_client; } memcpy(c, &client_template, sizeof *c); c->adapter = adap; strcpy(i2c_clientname(c), "OV????"); ov = kmalloc(sizeof *ov, GFP_KERNEL); if (!ov) { rc = -ENOMEM; goto no_ov; } memset(ov, 0, sizeof *ov); i2c_set_clientdata(c, ov); rc = ovcamchip_detect(c); if (rc < 0) goto error; strcpy(i2c_clientname(c), chip_names[ov->subtype]); PDEBUG(1, "Camera chip detection complete"); i2c_attach_client(c); return rc; error: kfree(ov); no_ov: kfree(c); no_client: PDEBUG(1, "returning %d", rc); return rc; }
static int attach_inform(struct i2c_client *client) { struct bttv *btv = i2c_get_adapdata(client->adapter); if (btv->tuner_type != UNSET) bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); if (btv->pinnacle_id != UNSET) bttv_call_i2c_clients(btv,AUDC_CONFIG_PINNACLE, &btv->pinnacle_id); if (bttv_debug) printk("bttv%d: i2c attach [client=%s]\n", btv->nr, i2c_clientname(client)); return 0; }
static int attach_inform(struct i2c_client *client) { struct saa7134_dev *dev = client->adapter->algo_data; int tuner = dev->tuner_type; int conf = dev->tda9887_conf; struct tuner_setup tun_setup; d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", client->driver->name,client->addr,i2c_clientname(client)); if (!client->driver->command) return 0; if (saa7134_boards[dev->board].radio_type != UNSET) { tun_setup.type = saa7134_boards[dev->board].radio_type; tun_setup.addr = saa7134_boards[dev->board].radio_addr; if ((tun_setup.addr == ADDR_UNSET) || (tun_setup.addr == client->addr)) { tun_setup.mode_mask = T_RADIO; client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup); } } if (tuner != UNSET) { tun_setup.type = tuner; tun_setup.addr = saa7134_boards[dev->board].tuner_addr; if ((tun_setup.addr == ADDR_UNSET)||(tun_setup.addr == client->addr)) { tun_setup.mode_mask = T_ANALOG_TV; client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup); } } client->driver->command(client, TDA9887_SET_CONFIG, &conf); return 0; }