Hi Martin, Richard,

On Tue, 19 Aug 2008 21:41:21 +0200, Martin Samuelsson wrote:
> On Tue, 19 Aug 2008 12:58:16 +0200
> richard <[EMAIL PROTECTED]> wrote:
> 
> > Hello,
> > 
> > I'm using multiple (3 now) dc10plus cards for doing live video shows as
> 
> I've got a Buz, a 6 Eyes and a DC10+ in mine.
> 
> > So everything works fine 
> > except for the dc10plus cards
> > They are not always initialized correctly, so sometimes I have two
> > sometimes one and sometimes three cards working. 
> 
> I can imagine that. I have similar problems, but I'm a little surprised your 
> system works as good as it does.
> 
> > It might have something to do with the order in which the cards are
> > initialized when all cards are found first an then initialized it seems
> > to work, but when a card is initialized before other cards are found
> > then there is an error.
> 
> That is most likely the problem, yes. If you dig at the really low
> levels in the initialization routines, you'll probably find out that
> the video encoders and decoders are initialized at least nine times
> each per card, due to some peculiarities concerning the interaction
> between i2c buses and i2c devices.

Not sure what you mean with "initialized". I fail to see how a given
decoder or encoder could be initialized more than once, given that the
address becomes busy once an i2c client is attached.

The main problem of the current code is when mixing different types of
zoran adapters. I don't expect that many problems when several adapters
of the same type (i.e. using the same encoder and decoder) are used.

> In short, the kernel should see each encoder and decoder once for every
> i2c bus on each of the cards, but as things are now, all of them are
> visible, without any buses differentiating them.
> 
> If this is the culprit, it has been identified, and is being worked on
> by Jean Delvare. I don't know what the time table looks like; there's
> quite a bit of fiddling involved.

Actually I'm done with the conversion now, and would welcome testers.
I'm attaching a (relatively large) patch against 2.6.27-rc3, which
converts the whole zoran driver set to the new i2c device binding model.
With this conversion, each zoran adapter will explicitly instantiate its
I2C encoder and decoder devices. No more probing and guessing.

I would like to head feedback from testers. In particular:
* I want to be sure that the patch doesn't break existing working
  setups.
* If the patch solves problems, I'd like to know. One thing for sure
  is that driver loading should be somewhat faster.

Note that the patch won't work with kernels older than 2.6.27-rc1.

> 
> You _might_ be helped by manually modprobing the encoder and decoder
> drivers before zr63060.
> 
> Follow-up question: Are you using the on-board composite output
> connector? My DC10+ stops after a number of frames when playing with
> lavplay -pC, stalling waiting for a buffer. I've reduced it to some
> kind of race condition, but I'm not sure where to go from there, or
> if indeed any other DC10+ users than me experience the problem.

I don't think I ever used my DC10+ output channels, sorry.

-- 
Jean Delvare
--- linux-2.6.27-rc3.orig/drivers/media/video/zoran_card.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/zoran_card.c	2008-08-19 21:53:54.000000000 +0200
@@ -65,12 +65,12 @@ static int card[BUZ_MAX] = { -1, -1, -1,
 module_param_array(card, int, NULL, 0444);
 MODULE_PARM_DESC(card, "The type of card");
 
-static int encoder[BUZ_MAX] = { -1, -1, -1, -1 };
-module_param_array(encoder, int, NULL, 0444);
+static char *encoder[BUZ_MAX];
+module_param_array(encoder, charp, NULL, 0444);
 MODULE_PARM_DESC(encoder, "i2c TV encoder");
 
-static int decoder[BUZ_MAX] = { -1, -1, -1, -1 };
-module_param_array(decoder, int, NULL, 0444);
+static char *decoder[BUZ_MAX];
+module_param_array(decoder, charp, NULL, 0444);
 MODULE_PARM_DESC(decoder, "i2c TV decoder");
 
 /*
@@ -326,45 +326,32 @@ avs6eyes_init (struct zoran *zr)
 }
 
 static char *
-i2cid_to_modulename (u16 i2c_id)
+i2cid_to_modulename(const char *i2c_name)
 {
 	char *name = NULL;
 
-	switch (i2c_id) {
-	case I2C_DRIVERID_SAA7110:
+	if (strcmp(i2c_name, "saa7110") == 0)
 		name = "saa7110";
-		break;
-	case I2C_DRIVERID_SAA7111A:
+	else if (strcmp(i2c_name, "saa7111_old") == 0)
 		name = "saa7111";
-		break;
-	case I2C_DRIVERID_SAA7114:
+	else if (strcmp(i2c_name, "saa7114_old") == 0)
 		name = "saa7114";
-		break;
-	case I2C_DRIVERID_SAA7185B:
+	else if (strcmp(i2c_name, "saa7185") == 0)
 		name = "saa7185";
-		break;
-	case I2C_DRIVERID_ADV7170:
+	else if (strcmp(i2c_name, "adv7170") == 0)
 		name = "adv7170";
-		break;
-	case I2C_DRIVERID_ADV7175:
+	else if (strcmp(i2c_name, "adv7176") == 0)
 		name = "adv7175";
-		break;
-	case I2C_DRIVERID_BT819:
+	else if (strcmp(i2c_name, "bt819a") == 0)
 		name = "bt819";
-		break;
-	case I2C_DRIVERID_BT856:
+	else if (strcmp(i2c_name, "bt856") == 0)
 		name = "bt856";
-		break;
-	case I2C_DRIVERID_BT866:
+	else if (strcmp(i2c_name, "bt866") == 0)
 		name = "bt866";
-		break;
-	case I2C_DRIVERID_VPX3220:
+	else if (strcmp(i2c_name, "vpx3220a") == 0)
 		name = "vpx3220";
-		break;
-	case I2C_DRIVERID_KS0127:
+	else if (strcmp(i2c_name, "ks0127") == 0)
 		name = "ks0127";
-		break;
-	}
 
 	return name;
 }
@@ -423,7 +410,8 @@ static struct card_info zoran_cards[NUM_
 	{
 		.type = DC10_old,
 		.name = "DC10(old)",
-		.i2c_decoder = I2C_DRIVERID_VPX3220,
+		.i2c_decoder = "vpx3220a",
+		.decoder_addr = { 0x86 >> 1, (0x86 >> 1) + 4, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36050,
 		.video_vfe = CODEC_TYPE_ZR36016,
 
@@ -451,8 +439,10 @@ static struct card_info zoran_cards[NUM_
 	}, {
 		.type = DC10_new,
 		.name = "DC10(new)",
-		.i2c_decoder = I2C_DRIVERID_SAA7110,
-		.i2c_encoder = I2C_DRIVERID_ADV7175,
+		.i2c_decoder = "saa7110",
+		.i2c_encoder = "adv7176",
+		.decoder_addr = { 0x9c >> 1, (0x9c >> 1) + 1, I2C_CLIENT_END },
+		.encoder_addr = { 0x54 >> 1, (0x54 >> 1) + 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 3,
@@ -480,8 +470,10 @@ static struct card_info zoran_cards[NUM_
 		.name = "DC10plus",
 		.vendor_id = PCI_VENDOR_ID_MIRO,
 		.device_id = PCI_DEVICE_ID_MIRO_DC10PLUS,
-		.i2c_decoder = I2C_DRIVERID_SAA7110,
-		.i2c_encoder = I2C_DRIVERID_ADV7175,
+		.i2c_decoder = "saa7110",
+		.i2c_encoder = "adv7176",
+		.decoder_addr = { 0x9c >> 1, (0x9c >> 1) + 1, I2C_CLIENT_END },
+		.encoder_addr = { 0x54 >> 1, (0x54 >> 1) + 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 3,
@@ -508,8 +500,10 @@ static struct card_info zoran_cards[NUM_
 	}, {
 		.type = DC30,
 		.name = "DC30",
-		.i2c_decoder = I2C_DRIVERID_VPX3220,
-		.i2c_encoder = I2C_DRIVERID_ADV7175,
+		.i2c_decoder = "vpx3220a",
+		.i2c_encoder = "adv7176",
+		.decoder_addr = { 0x86 >> 1, (0x86 >> 1) + 4, I2C_CLIENT_END },
+		.encoder_addr = { 0x54 >> 1, (0x54 >> 1) + 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36050,
 		.video_vfe = CODEC_TYPE_ZR36016,
 
@@ -539,8 +533,10 @@ static struct card_info zoran_cards[NUM_
 		.name = "DC30plus",
 		.vendor_id = PCI_VENDOR_ID_MIRO,
 		.device_id = PCI_DEVICE_ID_MIRO_DC30PLUS,
-		.i2c_decoder = I2C_DRIVERID_VPX3220,
-		.i2c_encoder = I2C_DRIVERID_ADV7175,
+		.i2c_decoder = "vpx3220a",
+		.i2c_encoder = "adv7176",
+		.decoder_addr = { 0x86 >> 1, (0x86 >> 1) + 4, I2C_CLIENT_END },
+		.encoder_addr = { 0x54 >> 1, (0x54 >> 1) + 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36050,
 		.video_vfe = CODEC_TYPE_ZR36016,
 
@@ -568,8 +564,10 @@ static struct card_info zoran_cards[NUM_
 	}, {
 		.type = LML33,
 		.name = "LML33",
-		.i2c_decoder = I2C_DRIVERID_BT819,
-		.i2c_encoder = I2C_DRIVERID_BT856,
+		.i2c_decoder = "bt819a",
+		.i2c_encoder = "bt856",
+		.decoder_addr = { 0x8a >> 1, I2C_CLIENT_END },
+		.encoder_addr = { 0x88 >> 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 2,
@@ -597,8 +595,10 @@ static struct card_info zoran_cards[NUM_
 		.name = "LML33R10",
 		.vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH,
 		.device_id = PCI_DEVICE_ID_LML_33R10,
-		.i2c_decoder = I2C_DRIVERID_SAA7114,
-		.i2c_encoder = I2C_DRIVERID_ADV7170,
+		.i2c_decoder = "saa7114_old",
+		.i2c_encoder = "adv7170",
+		.decoder_addr = { 0x42 >> 1, 0x40 >> 1, I2C_CLIENT_END },
+		.encoder_addr = { 0xd4 >> 1, (0xd4 >> 1) + 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 2,
@@ -626,8 +626,10 @@ static struct card_info zoran_cards[NUM_
 		.name = "Buz",
 		.vendor_id = PCI_VENDOR_ID_IOMEGA,
 		.device_id = PCI_DEVICE_ID_IOMEGA_BUZ,
-		.i2c_decoder = I2C_DRIVERID_SAA7111A,
-		.i2c_encoder = I2C_DRIVERID_SAA7185B,
+		.i2c_decoder = "saa7111_old",
+		.i2c_encoder = "saa7185",
+		.decoder_addr = { 0x48 >> 1, I2C_CLIENT_END },
+		.encoder_addr = { 0x88 >> 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 2,
@@ -657,8 +659,10 @@ static struct card_info zoran_cards[NUM_
 		   can't be autodetected, and requires card=x. */
 		.vendor_id = -1,
 		.device_id = -1,
-		.i2c_decoder = I2C_DRIVERID_KS0127,
-		.i2c_encoder = I2C_DRIVERID_BT866,
+		.i2c_decoder = "ks0127",
+		.i2c_encoder = "bt866",
+		.decoder_addr = { 0xd8 >> 1, 0xda >> 1, I2C_CLIENT_END },
+		.encoder_addr = { 0x88 >> 1, I2C_CLIENT_END },
 		.video_codec = CODEC_TYPE_ZR36060,
 
 		.inputs = 10,
@@ -739,69 +743,6 @@ zoran_i2c_setscl (void *data,
 	btwrite(zr->i2cbr, ZR36057_I2CBR);
 }
 
-static int
-zoran_i2c_client_register (struct i2c_client *client)
-{
-	struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
-	int res = 0;
-
-	dprintk(2,
-		KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
-		ZR_DEVNAME(zr), client->driver->id);
-
-	mutex_lock(&zr->resource_lock);
-
-	if (zr->user > 0) {
-		/* we're already busy, so we keep a reference to
-		 * them... Could do a lot of stuff here, but this
-		 * is easiest. (Did I ever mention I'm a lazy ass?)
-		 */
-		res = -EBUSY;
-		goto clientreg_unlock_and_return;
-	}
-
-	if (client->driver->id == zr->card.i2c_decoder)
-		zr->decoder = client;
-	else if (client->driver->id == zr->card.i2c_encoder)
-		zr->encoder = client;
-	else {
-		res = -ENODEV;
-		goto clientreg_unlock_and_return;
-	}
-
-clientreg_unlock_and_return:
-	mutex_unlock(&zr->resource_lock);
-
-	return res;
-}
-
-static int
-zoran_i2c_client_unregister (struct i2c_client *client)
-{
-	struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter);
-	int res = 0;
-
-	dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
-
-	mutex_lock(&zr->resource_lock);
-
-	if (zr->user > 0) {
-		res = -EBUSY;
-		goto clientunreg_unlock_and_return;
-	}
-
-	/* try to locate it */
-	if (client == zr->encoder) {
-		zr->encoder = NULL;
-	} else if (client == zr->decoder) {
-		zr->decoder = NULL;
-		snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
-	}
-clientunreg_unlock_and_return:
-	mutex_unlock(&zr->resource_lock);
-	return res;
-}
-
 static const struct i2c_algo_bit_data zoran_i2c_bit_data_template = {
 	.setsda = zoran_i2c_setsda,
 	.setscl = zoran_i2c_setscl,
@@ -814,23 +755,56 @@ static const struct i2c_algo_bit_data zo
 static int
 zoran_register_i2c (struct zoran *zr)
 {
+	struct i2c_board_info info;
+	int err;
+
 	memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template,
 	       sizeof(struct i2c_algo_bit_data));
 	zr->i2c_algo.data = zr;
-	zr->i2c_adapter.id = I2C_HW_B_ZR36067;
-	zr->i2c_adapter.client_register = zoran_i2c_client_register;
-	zr->i2c_adapter.client_unregister = zoran_i2c_client_unregister;
 	strlcpy(zr->i2c_adapter.name, ZR_DEVNAME(zr),
 		sizeof(zr->i2c_adapter.name));
 	i2c_set_adapdata(&zr->i2c_adapter, zr);
 	zr->i2c_adapter.algo_data = &zr->i2c_algo;
 	zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
-	return i2c_bit_add_bus(&zr->i2c_adapter);
+
+	err = i2c_bit_add_bus(&zr->i2c_adapter);
+	if (err)
+		return err;
+
+	mutex_lock(&zr->resource_lock);
+	/* register the decoder */
+	if (zr->card.i2c_decoder) {
+		memset(&info, 0, sizeof(struct i2c_board_info));
+		strlcpy(info.type, zr->card.i2c_decoder, I2C_NAME_SIZE);
+		zr->decoder = i2c_new_probed_device(&zr->i2c_adapter, &info,
+						    zr->card.decoder_addr);
+	}
+	/* register the encoder */
+	if (zr->card.i2c_encoder) {
+		memset(&info, 0, sizeof(struct i2c_board_info));
+		strlcpy(info.type, zr->card.i2c_encoder, I2C_NAME_SIZE);
+		zr->encoder = i2c_new_probed_device(&zr->i2c_adapter, &info,
+						    zr->card.encoder_addr);
+	}
+	mutex_unlock(&zr->resource_lock);
+
+	return 0;
 }
 
 static void
 zoran_unregister_i2c (struct zoran *zr)
 {
+	mutex_lock(&zr->resource_lock);
+	if (zr->decoder) {
+		i2c_unregister_device(zr->decoder);
+		zr->decoder = NULL;
+	}
+	if (zr->encoder) {
+		i2c_unregister_device(zr->encoder);
+		zr->encoder = NULL;
+	}
+	mutex_unlock(&zr->resource_lock);
+
 	i2c_del_adapter(&zr->i2c_adapter);
 }
 
@@ -1423,7 +1397,7 @@ find_zr36057 (void)
 			ZR_DEVNAME(zr));
 
 		/* i2c decoder */
-		if (decoder[zr->id] != -1) {
+		if (decoder[zr->id]) {
 			i2c_dec_name = i2cid_to_modulename(decoder[zr->id]);
 			zr->card.i2c_decoder = decoder[zr->id];
 		} else if (zr->card.i2c_decoder != 0) {
@@ -1443,7 +1417,7 @@ find_zr36057 (void)
 		}
 
 		/* i2c encoder */
-		if (encoder[zr->id] != -1) {
+		if (encoder[zr->id]) {
 			i2c_enc_name = i2cid_to_modulename(encoder[zr->id]);
 			zr->card.i2c_encoder = encoder[zr->id];
 		} else if (zr->card.i2c_encoder != 0) {
--- linux-2.6.27-rc3.orig/drivers/media/video/adv7170.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/adv7170.c	2008-08-19 21:53:54.000000000 +0200
@@ -80,12 +80,6 @@ struct adv7170 {
 	int sat;
 };
 
-#define   I2C_ADV7170        0xd4
-#define   I2C_ADV7171        0x54
-
-static char adv7170_name[] = "adv7170";
-static char adv7171_name[] = "adv7171";
-
 static char *inputs[] = { "pass_through", "play_back" };
 static char *norms[] = { "PAL", "NTSC" };
 
@@ -372,63 +366,18 @@ adv7170_command (struct i2c_client *clie
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] =
-    { I2C_ADV7170 >> 1, (I2C_ADV7170 >> 1) + 1,
-	I2C_ADV7171 >> 1, (I2C_ADV7171 >> 1) + 1,
-	I2C_CLIENT_END
-};
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_adv7170;
 
 static int
-adv7170_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+adv7170_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
 	int i;
-	struct i2c_client *client;
 	struct adv7170 *encoder;
-	char *dname;
-
-	dprintk(1,
-		KERN_INFO
-		"adv7170.c: detecting adv7170 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_adv7170;
-	if ((client->addr == I2C_ADV7170 >> 1) ||
-	    (client->addr == (I2C_ADV7170 >> 1) + 1)) {
-		dname = adv7170_name;
-	} else if ((client->addr == I2C_ADV7171 >> 1) ||
-		   (client->addr == (I2C_ADV7171 >> 1) + 1)) {
-		dname = adv7171_name;
-	} else {
-		/* We should never get here!!! */
-		kfree(client);
-		return 0;
-	}
-	strlcpy(I2C_NAME(client), dname, sizeof(I2C_NAME(client)));
 
 	encoder = kzalloc(sizeof(struct adv7170), GFP_KERNEL);
 	if (encoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	encoder->norm = VIDEO_MODE_NTSC;
@@ -436,13 +385,6 @@ adv7170_detect_client (struct i2c_adapte
 	encoder->enable = 1;
 	i2c_set_clientdata(client, encoder);
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(encoder);
-		return i;
-	}
-
 	i = adv7170_write_block(client, init_NTSC, sizeof(init_NTSC));
 	if (i >= 0) {
 		i = adv7170_write(client, 0x07, TR0MODE | TR0RST);
@@ -460,43 +402,32 @@ adv7170_detect_client (struct i2c_adapte
 }
 
 static int
-adv7170_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"adv7170.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &adv7170_detect_client);
-}
-
-static int
-adv7170_detach_client (struct i2c_client *client)
+adv7170_remove(struct i2c_client *client)
 {
 	struct adv7170 *encoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(encoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id adv7170_id[] = {
+	{ "adv7170", 0 },
+	{ "adv7171", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, adv7170_id);
+
 static struct i2c_driver i2c_driver_adv7170 = {
 	.driver = {
 		.name = "adv7170",	/* name */
 	},
 
-	.id = I2C_DRIVERID_ADV7170,
-
-	.attach_adapter = adv7170_attach_adapter,
-	.detach_client = adv7170_detach_client,
+	.probe = adv7170_probe,
+	.remove = adv7170_remove,
+	.id_table = adv7170_id,
 	.command = adv7170_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/adv7175.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/adv7175.c	2008-08-19 21:53:54.000000000 +0200
@@ -74,12 +74,6 @@ struct adv7175 {
 	int sat;
 };
 
-#define   I2C_ADV7175        0xd4
-#define   I2C_ADV7176        0x54
-
-static char adv7175_name[] = "adv7175";
-static char adv7176_name[] = "adv7176";
-
 static char *inputs[] = { "pass_through", "play_back", "color_bar" };
 static char *norms[] = { "PAL", "NTSC", "SECAM->PAL (may not work!)" };
 
@@ -390,63 +384,18 @@ adv7175_command (struct i2c_client *clie
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] =
-    { I2C_ADV7175 >> 1, (I2C_ADV7175 >> 1) + 1,
-	I2C_ADV7176 >> 1, (I2C_ADV7176 >> 1) + 1,
-	I2C_CLIENT_END
-};
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_adv7175;
 
 static int
-adv7175_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+adv7175_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
 	int i;
-	struct i2c_client *client;
 	struct adv7175 *encoder;
-	char *dname;
-
-	dprintk(1,
-		KERN_INFO
-		"adv7175.c: detecting adv7175 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_adv7175;
-	if ((client->addr == I2C_ADV7175 >> 1) ||
-	    (client->addr == (I2C_ADV7175 >> 1) + 1)) {
-		dname = adv7175_name;
-	} else if ((client->addr == I2C_ADV7176 >> 1) ||
-		   (client->addr == (I2C_ADV7176 >> 1) + 1)) {
-		dname = adv7176_name;
-	} else {
-		/* We should never get here!!! */
-		kfree(client);
-		return 0;
-	}
-	strlcpy(I2C_NAME(client), dname, sizeof(I2C_NAME(client)));
 
 	encoder = kzalloc(sizeof(struct adv7175), GFP_KERNEL);
 	if (encoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	encoder->norm = VIDEO_MODE_PAL;
@@ -454,13 +403,6 @@ adv7175_detect_client (struct i2c_adapte
 	encoder->enable = 1;
 	i2c_set_clientdata(client, encoder);
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(encoder);
-		return i;
-	}
-
 	i = adv7175_write_block(client, init_common, sizeof(init_common));
 	if (i >= 0) {
 		i = adv7175_write(client, 0x07, TR0MODE | TR0RST);
@@ -478,43 +420,32 @@ adv7175_detect_client (struct i2c_adapte
 }
 
 static int
-adv7175_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"adv7175.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &adv7175_detect_client);
-}
-
-static int
-adv7175_detach_client (struct i2c_client *client)
+adv7175_remove(struct i2c_client *client)
 {
 	struct adv7175 *encoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(encoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id adv7175_id[] = {
+	{ "adv7175", 0 },
+	{ "adv7176", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, adv7175_id);
+
 static struct i2c_driver i2c_driver_adv7175 = {
 	.driver = {
 		.name = "adv7175",	/* name */
 	},
 
-	.id = I2C_DRIVERID_ADV7175,
-
-	.attach_adapter = adv7175_attach_adapter,
-	.detach_client = adv7175_detach_client,
+	.probe = adv7175_probe,
+	.remove = adv7175_remove,
+	.id_table = adv7175_id,
 	.command = adv7175_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/bt819.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/bt819.c	2008-08-19 21:53:54.000000000 +0200
@@ -97,8 +97,6 @@ static struct timing timing_data[] = {
 	{858 - 24, 20, 525 - 2, 1, 0x00f8, 0x0000},
 };
 
-#define   I2C_BT819        0x8a
-
 /* ----------------------------------------------------------------------- */
 
 static inline int
@@ -490,49 +488,18 @@ bt819_command (struct i2c_client *client
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] = {
-	I2C_BT819 >> 1,
-	I2C_CLIENT_END,
-};
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_bt819;
 
 static int
-bt819_detect_client (struct i2c_adapter *adapter,
-		     int                 address,
-		     int                 kind)
+bt819_probe(struct i2c_client          *client,
+	    const struct i2c_device_id *did)
 {
-	int i, id;
+	int id, i;
 	struct bt819 *decoder;
-	struct i2c_client *client;
-
-	dprintk(1,
-		KERN_INFO
-		"bt819: detecting bt819 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_bt819;
 
 	decoder = kzalloc(sizeof(struct bt819), GFP_KERNEL);
 	if (decoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	decoder->norm = VIDEO_MODE_NTSC;
@@ -546,33 +513,6 @@ bt819_detect_client (struct i2c_adapter 
 	i2c_set_clientdata(client, decoder);
 
 	id = bt819_read(client, 0x17);
-	switch (id & 0xf0) {
-	case 0x70:
-		strlcpy(I2C_NAME(client), "bt819a", sizeof(I2C_NAME(client)));
-		break;
-	case 0x60:
-		strlcpy(I2C_NAME(client), "bt817a", sizeof(I2C_NAME(client)));
-		break;
-	case 0x20:
-		strlcpy(I2C_NAME(client), "bt815a", sizeof(I2C_NAME(client)));
-		break;
-	default:
-		dprintk(1,
-			KERN_ERR
-			"bt819: unknown chip version 0x%x (ver 0x%x)\n",
-			id & 0xf0, id & 0x0f);
-		kfree(decoder);
-		kfree(client);
-		return 0;
-	}
-
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(decoder);
-		return i;
-	}
-
 	i = bt819_init(client);
 	if (i < 0) {
 		dprintk(1, KERN_ERR "%s_attach: init status %d\n",
@@ -589,39 +529,33 @@ bt819_detect_client (struct i2c_adapter 
 }
 
 static int
-bt819_attach_adapter (struct i2c_adapter *adapter)
-{
-	return i2c_probe(adapter, &addr_data, &bt819_detect_client);
-}
-
-static int
-bt819_detach_client (struct i2c_client *client)
+bt819_remove(struct i2c_client *client)
 {
 	struct bt819 *decoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(decoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id bt819_id[] = {
+	{ "bt819a", 0 },
+	{ "bt817a", 0 },
+	{ "bt815a", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, bt819_id);
+
 static struct i2c_driver i2c_driver_bt819 = {
 	.driver = {
 		.name = "bt819",
 	},
 
-	.id = I2C_DRIVERID_BT819,
-
-	.attach_adapter = bt819_attach_adapter,
-	.detach_client = bt819_detach_client,
+	.probe = bt819_probe,
+	.remove = bt819_remove,
+	.id_table = bt819_id,
 	.command = bt819_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/bt856.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/bt856.c	2008-08-19 21:53:54.000000000 +0200
@@ -78,8 +78,6 @@ struct bt856 {
 	int enable;
 };
 
-#define   I2C_BT856        0x88
-
 /* ----------------------------------------------------------------------- */
 
 static inline int
@@ -280,60 +278,23 @@ bt856_command (struct i2c_client *client
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] = { I2C_BT856 >> 1, I2C_CLIENT_END };
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_bt856;
 
 static int
-bt856_detect_client (struct i2c_adapter *adapter,
-		     int                 address,
-		     int                 kind)
+bt856_probe(struct i2c_client          *client,
+	    const struct i2c_device_id *id)
 {
-	int i;
-	struct i2c_client *client;
 	struct bt856 *encoder;
 
-	dprintk(1,
-		KERN_INFO
-		"bt856.c: detecting bt856 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_bt856;
-	strlcpy(I2C_NAME(client), "bt856", sizeof(I2C_NAME(client)));
-
 	encoder = kzalloc(sizeof(struct bt856), GFP_KERNEL);
 	if (encoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	encoder->norm = VIDEO_MODE_NTSC;
 	encoder->enable = 1;
 	i2c_set_clientdata(client, encoder);
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(encoder);
-		return i;
-	}
-
 	bt856_write(client, 0xdc, 0x18);
 	bt856_write(client, 0xda, 0);
 	bt856_write(client, 0xde, 0);
@@ -367,43 +328,31 @@ bt856_detect_client (struct i2c_adapter 
 }
 
 static int
-bt856_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"bt856.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &bt856_detect_client);
-}
-
-static int
-bt856_detach_client (struct i2c_client *client)
+bt856_remove(struct i2c_client *client)
 {
 	struct bt856 *encoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(encoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id bt856_id[] = {
+	{ "bt856", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, bt856_id);
+
 static struct i2c_driver i2c_driver_bt856 = {
 	.driver = {
 		.name = "bt856",
 	},
 
-	.id = I2C_DRIVERID_BT856,
-
-	.attach_adapter = bt856_attach_adapter,
-	.detach_client = bt856_detach_client,
+	.probe = bt856_probe,
+	.remove = bt856_remove,
+	.id_table = bt856_id,
 	.command = bt856_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/saa7110.c	2008-08-19 18:23:39.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/saa7110.c	2008-08-19 21:53:54.000000000 +0200
@@ -59,8 +59,6 @@ MODULE_PARM_DESC(debug, "Debug level (0-
 #define SAA7110_MAX_INPUT	9	/* 6 CVBS, 3 SVHS */
 #define SAA7110_MAX_OUTPUT	0	/* its a decoder only */
 
-#define	I2C_SAA7110		0x9C	/* or 0x9E */
-
 #define SAA7110_NR_REG		0x35
 
 struct saa7110 {
@@ -451,53 +449,18 @@ saa7110_command (struct i2c_client *clie
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] = {
-	I2C_SAA7110 >> 1,
-	(I2C_SAA7110 >> 1) + 1,
-	I2C_CLIENT_END
-};
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_saa7110;
 
 static int
-saa7110_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+saa7110_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
-	struct i2c_client *client;
 	struct saa7110 *decoder;
 	int rv;
 
-	dprintk(1,
-		KERN_INFO
-		"saa7110.c: detecting saa7110 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality
-	    (adapter,
-	     I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_saa7110;
-	strlcpy(I2C_NAME(client), "saa7110", sizeof(I2C_NAME(client)));
-
 	decoder = kzalloc(sizeof(struct saa7110), GFP_KERNEL);
 	if (!decoder) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	decoder->norm = VIDEO_MODE_PAL;
@@ -510,13 +473,6 @@ saa7110_detect_client (struct i2c_adapte
 	init_waitqueue_head(&decoder->wq);
 	i2c_set_clientdata(client, decoder);
 
-	rv = i2c_attach_client(client);
-	if (rv) {
-		kfree(client);
-		kfree(decoder);
-		return rv;
-	}
-
 	rv = saa7110_write_block(client, initseq, sizeof(initseq));
 	if (rv < 0)
 		dprintk(1, KERN_ERR "%s_attach: init status %d\n",
@@ -548,43 +504,31 @@ saa7110_detect_client (struct i2c_adapte
 }
 
 static int
-saa7110_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"saa7110.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &saa7110_detect_client);
-}
-
-static int
-saa7110_detach_client (struct i2c_client *client)
+saa7110_remove(struct i2c_client *client)
 {
 	struct saa7110 *decoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(decoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id saa7110_id[] = {
+	{ "saa7110", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, saa7110_id);
+
 static struct i2c_driver i2c_driver_saa7110 = {
 	.driver = {
 		.name = "saa7110",
 	},
 
-	.id = I2C_DRIVERID_SAA7110,
-
-	.attach_adapter = saa7110_attach_adapter,
-	.detach_client = saa7110_detach_client,
+	.probe = saa7110_probe,
+	.remove = saa7110_remove,
+	.id_table = saa7110_id,
 	.command = saa7110_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/saa7111.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/saa7111.c	2008-08-19 21:53:54.000000000 +0200
@@ -482,36 +482,47 @@ static struct i2c_client_address_data ad
 
 static struct i2c_driver i2c_driver_saa7111;
 
+/* Return 0 if detection is successful, -ENODEV otherwise */
 static int
-saa7111_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+saa7111_detect(struct i2c_client     *client,
+	       int                    kind,
+	       struct i2c_board_info *info)
 {
 	int i;
-	struct i2c_client *client;
-	struct saa7111 *decoder;
-	struct video_decoder_init vdi;
+	const u8 id[6] = { 0x1, 0xf, 0x7, 0x1, 0x1, 0x1 };
+	struct i2c_adapter *adapter = client->adapter;
 
 	dprintk(1,
 		KERN_INFO
 		"saa7111.c: detecting saa7111 client on address 0x%x\n",
-		address << 1);
+		client->addr << 1);
 
 	/* Check if the adapter supports the needed features */
 	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
+		return -ENODEV;
 
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_saa7111;
-	strlcpy(I2C_NAME(client), "saa7111", sizeof(I2C_NAME(client)));
+	/* Make sure it's a SAA7111 chip */
+	for (i = 0; i < ARRAY_SIZE(id); i++) {
+		i2c_smbus_write_byte_data(client, 0, i);
+		if ((i2c_smbus_read_byte_data(client, 0) & 0xf) != id[i])
+			return -ENODEV;
+	}
+
+	strlcpy(info->type, "saa7111_old", I2C_NAME_SIZE);
+
+	return 0;
+}
+
+static int
+saa7111_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
+{
+	int i;
+	struct saa7111 *decoder;
+	struct video_decoder_init vdi;
 
 	decoder = kzalloc(sizeof(struct saa7111), GFP_KERNEL);
 	if (decoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	decoder->norm = VIDEO_MODE_NTSC;
@@ -519,13 +530,6 @@ saa7111_detect_client (struct i2c_adapte
 	decoder->enable = 1;
 	i2c_set_clientdata(client, decoder);
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(decoder);
-		return i;
-	}
-
 	vdi.data = saa7111_i2c_init;
 	vdi.len = sizeof(saa7111_i2c_init);
 	i = saa7111_init_decoder(client, &vdi);
@@ -544,43 +548,36 @@ saa7111_detect_client (struct i2c_adapte
 }
 
 static int
-saa7111_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"saa7111.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &saa7111_detect_client);
-}
-
-static int
-saa7111_detach_client (struct i2c_client *client)
+saa7111_remove(struct i2c_client *client)
 {
 	struct saa7111 *decoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(decoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id saa7111_id[] = {
+	{ "saa7111_old", 0 },	/* "saa7111" maps to the saa7115 driver */
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, saa7111_id);
+
 static struct i2c_driver i2c_driver_saa7111 = {
 	.driver = {
 		.name = "saa7111",
 	},
 
+	.class = I2C_CLASS_TV_ANALOG,
 	.id = I2C_DRIVERID_SAA7111A,
 
-	.attach_adapter = saa7111_attach_adapter,
-	.detach_client = saa7111_detach_client,
+	.probe = saa7111_probe,
+	.remove = saa7111_remove,
+	.id_table = saa7111_id,
+	.detect = saa7111_detect,
+	.address_data = &addr_data,
 	.command = saa7111_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/saa7114.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/saa7114.c	2008-08-19 21:53:54.000000000 +0200
@@ -81,9 +81,6 @@ struct saa7114 {
 	int playback;
 };
 
-#define   I2C_SAA7114        0x42
-#define   I2C_SAA7114A       0x40
-
 #define   I2C_DELAY   10
 
 
@@ -805,52 +802,22 @@ saa7114_command (struct i2c_client *clie
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] =
-    { I2C_SAA7114 >> 1, I2C_SAA7114A >> 1, I2C_CLIENT_END };
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_saa7114;
 
 static int
-saa7114_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+saa7114_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
 	int i, err[30];
 	short int hoff = SAA_7114_NTSC_HOFFSET;
 	short int voff = SAA_7114_NTSC_VOFFSET;
 	short int w = SAA_7114_NTSC_WIDTH;
 	short int h = SAA_7114_NTSC_HEIGHT;
-	struct i2c_client *client;
 	struct saa7114 *decoder;
 
-	dprintk(1,
-		KERN_INFO
-		"saa7114.c: detecting saa7114 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_saa7114;
-	strlcpy(I2C_NAME(client), "saa7114", sizeof(I2C_NAME(client)));
-
 	decoder = kzalloc(sizeof(struct saa7114), GFP_KERNEL);
 	if (decoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	decoder->norm = VIDEO_MODE_NTSC;
@@ -967,7 +934,6 @@ saa7114_detect_client (struct i2c_adapte
 				"%s_attach: init error %d at stage %d, leaving attach.\n",
 				I2C_NAME(client), i, err[i]);
 			kfree(decoder);
-			kfree(client);
 			return 0;
 		}
 	}
@@ -996,7 +962,6 @@ saa7114_detect_client (struct i2c_adapte
 				"%s_attach: init error %d at stage %d, leaving attach.\n",
 				I2C_NAME(client), i, err[i]);
 			kfree(decoder);
-			kfree(client);
 			return 0;
 		}
 	}
@@ -1044,7 +1009,6 @@ saa7114_detect_client (struct i2c_adapte
 				"%s_attach: init error %d at stage %d, leaving attach.\n",
 				I2C_NAME(client), i, err[i]);
 			kfree(decoder);
-			kfree(client);
 			return 0;
 		}
 	}
@@ -1085,7 +1049,6 @@ saa7114_detect_client (struct i2c_adapte
 				"%s_attach: init error %d at stage %d, leaving attach.\n",
 				I2C_NAME(client), i, err[i]);
 			kfree(decoder);
-			kfree(client);
 			return 0;
 		}
 	}
@@ -1107,7 +1070,6 @@ saa7114_detect_client (struct i2c_adapte
 				"%s_attach: init error %d at stage %d, leaving attach.\n",
 				I2C_NAME(client), i, err[i]);
 			kfree(decoder);
-			kfree(client);
 			return 0;
 		}
 	}
@@ -1136,13 +1098,6 @@ saa7114_detect_client (struct i2c_adapte
 			decoder->reg[REG_ADDR(i)]);
 	}
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(decoder);
-		return i;
-	}
-
 	//i = saa7114_write_block(client, init, sizeof(init));
 	i = 0;
 	if (i < 0) {
@@ -1160,43 +1115,31 @@ saa7114_detect_client (struct i2c_adapte
 }
 
 static int
-saa7114_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"saa7114.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &saa7114_detect_client);
-}
-
-static int
-saa7114_detach_client (struct i2c_client *client)
+saa7114_remove(struct i2c_client *client)
 {
 	struct saa7114 *decoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(decoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id saa7114_id[] = {
+	{ "saa7114_old", 0 },	/* "saa7114" maps to the saa7115 driver */
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, saa7114_id);
+
 static struct i2c_driver i2c_driver_saa7114 = {
 	.driver = {
 		.name = "saa7114",
 	},
 
-	.id = I2C_DRIVERID_SAA7114,
-
-	.attach_adapter = saa7114_attach_adapter,
-	.detach_client = saa7114_detach_client,
+	.probe = saa7114_probe,
+	.remove = saa7114_remove,
+	.id_table = saa7114_id,
 	.command = saa7114_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/saa7185.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/saa7185.c	2008-08-19 21:53:54.000000000 +0200
@@ -75,8 +75,6 @@ struct saa7185 {
 	int sat;
 };
 
-#define   I2C_SAA7185        0x88
-
 /* ----------------------------------------------------------------------- */
 
 static inline int
@@ -372,60 +370,24 @@ saa7185_command (struct i2c_client *clie
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] = { I2C_SAA7185 >> 1, I2C_CLIENT_END };
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver i2c_driver_saa7185;
 
 static int
-saa7185_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+saa7185_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
 	int i;
-	struct i2c_client *client;
 	struct saa7185 *encoder;
 
-	dprintk(1,
-		KERN_INFO
-		"saa7185.c: detecting saa7185 client on address 0x%x\n",
-		address << 1);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (!client)
-		return -ENOMEM;
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &i2c_driver_saa7185;
-	strlcpy(I2C_NAME(client), "saa7185", sizeof(I2C_NAME(client)));
-
 	encoder = kzalloc(sizeof(struct saa7185), GFP_KERNEL);
 	if (encoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	encoder->norm = VIDEO_MODE_NTSC;
 	encoder->enable = 1;
 	i2c_set_clientdata(client, encoder);
 
-	i = i2c_attach_client(client);
-	if (i) {
-		kfree(client);
-		kfree(encoder);
-		return i;
-	}
-
 	i = saa7185_write_block(client, init_common, sizeof(init_common));
 	if (i >= 0) {
 		i = saa7185_write_block(client, init_ntsc,
@@ -446,46 +408,34 @@ saa7185_detect_client (struct i2c_adapte
 }
 
 static int
-saa7185_attach_adapter (struct i2c_adapter *adapter)
-{
-	dprintk(1,
-		KERN_INFO
-		"saa7185.c: starting probe for adapter %s (0x%x)\n",
-		I2C_NAME(adapter), adapter->id);
-	return i2c_probe(adapter, &addr_data, &saa7185_detect_client);
-}
-
-static int
-saa7185_detach_client (struct i2c_client *client)
+saa7185_remove(struct i2c_client *client)
 {
 	struct saa7185 *encoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	saa7185_write(client, 0x61, (encoder->reg[0x61]) | 0x40);	/* SW: output off is active */
 	//saa7185_write(client, 0x3a, (encoder->reg[0x3a]) | 0x80); /* SW: color bar */
 
 	kfree(encoder);
-	kfree(client);
 
 	return 0;
 }
 
 /* ----------------------------------------------------------------------- */
 
+static const struct i2c_device_id saa7185_id[] = {
+	{ "saa7185", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, saa7185_id);
+
 static struct i2c_driver i2c_driver_saa7185 = {
 	.driver = {
 		.name = "saa7185",	/* name */
 	},
 
-	.id = I2C_DRIVERID_SAA7185B,
-
-	.attach_adapter = saa7185_attach_adapter,
-	.detach_client = saa7185_detach_client,
+	.probe = saa7185_probe,
+	.remove = saa7185_remove,
+	.id_table = saa7185_id,
 	.command = saa7185_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/vpx3220.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/vpx3220.c	2008-08-19 21:53:54.000000000 +0200
@@ -37,7 +37,6 @@
 #include <media/v4l2-common.h>
 #include <linux/video_decoder.h>
 
-#define I2C_VPX3220        0x86
 #define VPX3220_DEBUG	KERN_DEBUG "vpx3220: "
 
 static int debug;
@@ -573,109 +572,27 @@ vpx3220_init_client (struct i2c_client *
  * Generic i2c probe
  * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1'
  */
-static unsigned short normal_i2c[] =
-    { I2C_VPX3220 >> 1, (I2C_VPX3220 >> 1) + 4,
-	I2C_CLIENT_END
-};
-
-static unsigned short ignore = I2C_CLIENT_END;
-
-static struct i2c_client_address_data addr_data = {
-	.normal_i2c		= normal_i2c,
-	.probe			= &ignore,
-	.ignore			= &ignore,
-};
 
 static struct i2c_driver vpx3220_i2c_driver;
 
 static int
-vpx3220_detach_client (struct i2c_client *client)
+vpx3220_remove(struct i2c_client *client)
 {
 	struct vpx3220 *decoder = i2c_get_clientdata(client);
-	int err;
-
-	err = i2c_detach_client(client);
-	if (err) {
-		return err;
-	}
 
 	kfree(decoder);
-	kfree(client);
 
 	return 0;
 }
 
 static int
-vpx3220_detect_client (struct i2c_adapter *adapter,
-		       int                 address,
-		       int                 kind)
+vpx3220_probe(struct i2c_client          *client,
+	      const struct i2c_device_id *id)
 {
-	int err;
-	struct i2c_client *client;
 	struct vpx3220 *decoder;
 
-	dprintk(1, VPX3220_DEBUG "%s\n", __func__);
-
-	/* Check if the adapter supports the needed features */
-	if (!i2c_check_functionality
-	    (adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
-		return 0;
-
-	client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-	if (client == NULL) {
-		return -ENOMEM;
-	}
-
-	client->addr = address;
-	client->adapter = adapter;
-	client->driver = &vpx3220_i2c_driver;
-
-	/* Check for manufacture ID and part number */
-	if (kind < 0) {
-		u8 id;
-		u16 pn;
-
-		id = vpx3220_read(client, 0x00);
-		if (id != 0xec) {
-			dprintk(1,
-				KERN_INFO
-				"vpx3220_attach: Wrong manufacturer ID (0x%02x)\n",
-				id);
-			kfree(client);
-			return 0;
-		}
-
-		pn = (vpx3220_read(client, 0x02) << 8) +
-		    vpx3220_read(client, 0x01);
-		switch (pn) {
-		case 0x4680:
-			strlcpy(I2C_NAME(client), "vpx3220a",
-				sizeof(I2C_NAME(client)));
-			break;
-		case 0x4260:
-			strlcpy(I2C_NAME(client), "vpx3216b",
-				sizeof(I2C_NAME(client)));
-			break;
-		case 0x4280:
-			strlcpy(I2C_NAME(client), "vpx3214c",
-				sizeof(I2C_NAME(client)));
-			break;
-		default:
-			dprintk(1,
-				KERN_INFO
-				"%s: Wrong part number (0x%04x)\n",
-				__func__, pn);
-			kfree(client);
-			return 0;
-		}
-	} else {
-		strlcpy(I2C_NAME(client), "forced vpx32xx",
-			sizeof(I2C_NAME(client)));
-	}
-
 	decoder = kzalloc(sizeof(struct vpx3220), GFP_KERNEL);
 	if (decoder == NULL) {
-		kfree(client);
 		return -ENOMEM;
 	}
 	decoder->norm = VIDEO_MODE_PAL;
@@ -687,13 +604,6 @@ vpx3220_detect_client (struct i2c_adapte
 	decoder->sat = 32768;
 	i2c_set_clientdata(client, decoder);
 
-	err = i2c_attach_client(client);
-	if (err) {
-		kfree(client);
-		kfree(decoder);
-		return err;
-	}
-
 	dprintk(1, KERN_INFO "%s: vpx32xx client found at address 0x%02x\n",
 		I2C_NAME(client), client->addr << 1);
 
@@ -702,30 +612,26 @@ vpx3220_detect_client (struct i2c_adapte
 	return 0;
 }
 
-static int
-vpx3220_attach_adapter (struct i2c_adapter *adapter)
-{
-	int ret;
-
-	ret = i2c_probe(adapter, &addr_data, &vpx3220_detect_client);
-	dprintk(1, VPX3220_DEBUG "%s: i2c_probe returned %d\n",
-		__func__, ret);
-	return ret;
-}
-
 /* -----------------------------------------------------------------------
  * Driver initialization and cleanup code
  */
 
+static const struct i2c_device_id vpx3220_id[] = {
+	{ "vpx3220a", 0 },
+	{ "vpx3216b", 0 },
+	{ "vpx3214c", 0 },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, vpx3220_id);
+
 static struct i2c_driver vpx3220_i2c_driver = {
 	.driver = {
 		.name = "vpx3220",
 	},
 
-	.id = I2C_DRIVERID_VPX3220,
-
-	.attach_adapter = vpx3220_attach_adapter,
-	.detach_client = vpx3220_detach_client,
+	.probe = vpx3220_probe,
+	.remove = vpx3220_remove,
+	.id_table = vpx3220_id,
 	.command = vpx3220_command,
 };
 
--- linux-2.6.27-rc3.orig/drivers/media/video/bt866.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/bt866.c	2008-08-19 21:53:54.000000000 +0200
@@ -53,7 +53,6 @@
 MODULE_LICENSE("GPL");
 
 #define	BT866_DEVNAME	"bt866"
-#define I2C_BT866	0x88
 
 MODULE_LICENSE("GPL");
 
@@ -268,87 +267,50 @@ static int bt866_write(struct bt866 *enc
 	return 0;
 }
 
-static int bt866_attach(struct i2c_adapter *adapter);
-static int bt866_detach(struct i2c_client *client);
+static int bt866_probe(struct i2c_client *client,
+		       const struct i2c_device_id *id);
+static int bt866_remove(struct i2c_client *client);
 static int bt866_command(struct i2c_client *client,
 			 unsigned int cmd, void *arg);
 
 
-/* Addresses to scan */
-static unsigned short normal_i2c[]	= {I2C_BT866>>1, I2C_CLIENT_END};
-static unsigned short probe[2]		= {I2C_CLIENT_END, I2C_CLIENT_END};
-static unsigned short ignore[2]		= {I2C_CLIENT_END, I2C_CLIENT_END};
-
-static struct i2c_client_address_data addr_data = {
-	normal_i2c,
-	probe,
-	ignore,
+static const struct i2c_device_id bt866_id[] = {
+	{ "bt866", 0 },
+	{ }
 };
+MODULE_DEVICE_TABLE(i2c, bt866_id);
 
 static struct i2c_driver i2c_driver_bt866 = {
 	.driver.name = BT866_DEVNAME,
-	.id = I2C_DRIVERID_BT866,
-	.attach_adapter = bt866_attach,
-	.detach_client = bt866_detach,
+	.probe = bt866_probe,
+	.remove = bt866_remove,
+	.id_table = bt866_id,
 	.command = bt866_command
 };
 
 
-static struct i2c_client bt866_client_tmpl =
-{
-	.name = "(nil)",
-	.addr = 0,
-	.adapter = NULL,
-	.driver = &i2c_driver_bt866,
-};
-
-static int bt866_found_proc(struct i2c_adapter *adapter,
-			    int addr, int kind)
+static int bt866_probe(struct i2c_client *client,
+		       const struct i2c_device_id *id)
 {
 	struct bt866 *encoder;
-	struct i2c_client *client;
-
-	client = kzalloc(sizeof(*client), GFP_KERNEL);
-	if (client == NULL)
-		return -ENOMEM;
-	memcpy(client, &bt866_client_tmpl, sizeof(*client));
 
 	encoder = kzalloc(sizeof(*encoder), GFP_KERNEL);
-	if (encoder == NULL) {
-		kfree(client);
+	if (encoder == NULL)
 		return -ENOMEM;
-	}
 
 	i2c_set_clientdata(client, encoder);
-	client->adapter = adapter;
-	client->addr = addr;
-	sprintf(client->name, "%s-%02x", BT866_DEVNAME, adapter->id);
-
 	encoder->i2c = client;
-	encoder->addr = addr;
+	encoder->addr = client->addr;
 	//encoder->encoder_type = ENCODER_TYPE_UNKNOWN;
 
-	/* initialize */
-
-	i2c_attach_client(client);
-
-	return 0;
-}
-
-static int bt866_attach(struct i2c_adapter *adapter)
-{
-	if (adapter->id == I2C_HW_B_ZR36067)
-		return i2c_probe(adapter, &addr_data, bt866_found_proc);
 	return 0;
 }
 
-static int bt866_detach(struct i2c_client *client)
+static int bt866_remove(struct i2c_client *client)
 {
 	struct bt866 *encoder = i2c_get_clientdata(client);
 
-	i2c_detach_client(client);
 	kfree(encoder);
-	kfree(client);
 
 	return 0;
 }
--- linux-2.6.27-rc3.orig/drivers/media/video/ks0127.c	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/ks0127.c	2008-08-19 21:53:54.000000000 +0200
@@ -732,63 +732,39 @@ static int ks0127_command(struct i2c_cli
 
 
 
-static int ks0127_probe(struct i2c_adapter *adapter);
-static int ks0127_detach(struct i2c_client *client);
+static int ks0127_probe(struct i2c_client *client,
+			const struct i2c_device_id *id);
+static int ks0127_remove(struct i2c_client *client);
 static int ks0127_command(struct i2c_client *client,
 			  unsigned int cmd, void *arg);
 
 
-
-/* Addresses to scan */
-static unsigned short normal_i2c[] = {I2C_KS0127_ADDON>>1,
-				       I2C_KS0127_ONBOARD>>1, I2C_CLIENT_END};
-static unsigned short probe[2] =	{I2C_CLIENT_END, I2C_CLIENT_END};
-static unsigned short ignore[2] = 	{I2C_CLIENT_END, I2C_CLIENT_END};
-static struct i2c_client_address_data addr_data = {
-	normal_i2c,
-	probe,
-	ignore,
+static const struct i2c_device_id ks0127_id[] = {
+	{ "ks0127", 0 },
+	{ }
 };
+MODULE_DEVICE_TABLE(i2c, ks0127_id);
 
 static struct i2c_driver i2c_driver_ks0127 = {
 	.driver.name = "ks0127",
-	.id             = I2C_DRIVERID_KS0127,
-	.attach_adapter = ks0127_probe,
-	.detach_client  = ks0127_detach,
+	.probe		= ks0127_probe,
+	.remove		= ks0127_remove,
+	.id_table	= ks0127_id,
 	.command        = ks0127_command
 };
 
-static struct i2c_client ks0127_client_tmpl =
-{
-	.name = "(ks0127 unset)",
-	.addr = 0,
-	.adapter = NULL,
-	.driver = &i2c_driver_ks0127,
-};
-
-static int ks0127_found_proc(struct i2c_adapter *adapter, int addr, int kind)
+static int ks0127_probe(struct i2c_client *client,
+			const struct i2c_device_id *id)
 {
 	struct ks0127 *ks;
-	struct i2c_client *client;
-
-	client = kzalloc(sizeof(*client), GFP_KERNEL);
-	if (client == NULL)
-		return -ENOMEM;
-	memcpy(client, &ks0127_client_tmpl, sizeof(*client));
 
 	ks = kzalloc(sizeof(*ks), GFP_KERNEL);
-	if (ks == NULL) {
-		kfree(client);
+	if (ks == NULL)
 		return -ENOMEM;
-	}
 
 	i2c_set_clientdata(client, ks);
-	client->adapter = adapter;
-	client->addr = addr;
-	sprintf(client->name, "ks0127-%02x", adapter->id);
-
 	ks->client = client;
-	ks->addr = addr;
+	ks->addr = client->addr;
 	ks->ks_type = KS_TYPE_UNKNOWN;
 
 	/* power up */
@@ -800,28 +776,17 @@ static int ks0127_found_proc(struct i2c_
 	printk(KERN_INFO "ks0127: attach: %s video decoder\n",
 	       ks->addr==(I2C_KS0127_ADDON>>1) ? "addon" : "on-board");
 
-	i2c_attach_client(client);
-	return 0;
-}
-
-
-static int ks0127_probe(struct i2c_adapter *adapter)
-{
-	if (adapter->id == I2C_HW_B_ZR36067)
-		return i2c_probe(adapter, &addr_data, ks0127_found_proc);
 	return 0;
 }
 
-static int ks0127_detach(struct i2c_client *client)
+static int ks0127_remove(struct i2c_client *client)
 {
 	struct ks0127 *ks = i2c_get_clientdata(client);
 
 	ks0127_write(ks, KS_OFMTA, 0x20); /*tristate*/
 	ks0127_write(ks, KS_CMDA, 0x2c | 0x80); /* power down */
 
-	i2c_detach_client(client);
 	kfree(ks);
-	kfree(client);
 
 	dprintk("ks0127: detach\n");
 	return 0;
--- linux-2.6.27-rc3.orig/drivers/media/video/zoran.h	2008-08-19 21:53:41.000000000 +0200
+++ linux-2.6.27-rc3/drivers/media/video/zoran.h	2008-08-19 21:53:54.000000000 +0200
@@ -346,7 +346,8 @@ struct zoran_fh {
 struct card_info {
 	enum card_type type;
 	char name[32];
-	u16 i2c_decoder, i2c_encoder;			/* I2C types */
+	const char *i2c_decoder, *i2c_encoder;		/* I2C chip names */
+	unsigned short decoder_addr[3], encoder_addr[3];
 	u16 video_vfe, video_codec;			/* videocodec types */
 	u16 audio_chip;					/* audio type */
 	u16 vendor_id, device_id;	/* subsystem vendor/device ID */
--- linux-2.6.27-rc3.orig/include/linux/i2c-id.h	2008-08-19 18:23:38.000000000 +0200
+++ linux-2.6.27-rc3/include/linux/i2c-id.h	2008-08-19 21:53:54.000000000 +0200
@@ -37,8 +37,6 @@
 #define I2C_DRIVERID_TEA6415C	 6	/* video matrix switch		*/
 #define I2C_DRIVERID_TDA9840	 7	/* stereo sound processor	*/
 #define I2C_DRIVERID_SAA7111A	 8	/* video input processor	*/
-#define I2C_DRIVERID_SAA7185B	13	/* video encoder		*/
-#define I2C_DRIVERID_SAA7110	22	/* video decoder		*/
 #define I2C_DRIVERID_SAA5249	24	/* SAA5249 and compatibles	*/
 #define I2C_DRIVERID_PCF8583	25	/* real time clock		*/
 #define I2C_DRIVERID_SAB3036	26	/* SAB3036 tuner		*/
@@ -46,12 +44,6 @@
 #define I2C_DRIVERID_TVMIXER    28      /* Mixer driver for tv cards    */
 #define I2C_DRIVERID_TVAUDIO    29      /* Generic TV sound driver      */
 #define I2C_DRIVERID_TDA9875    32      /* TV sound decoder chip        */
-#define I2C_DRIVERID_BT819	40     /* video decoder			*/
-#define I2C_DRIVERID_BT856	41     /* video encoder			*/
-#define I2C_DRIVERID_VPX3220	42     /* video decoder+vbi/vtxt	*/
-#define I2C_DRIVERID_ADV7175	48     /* ADV 7175/7176 video encoder	*/
-#define I2C_DRIVERID_SAA7114	49	/* video decoder		*/
-#define I2C_DRIVERID_ADV7170	54	/* video encoder		*/
 #define I2C_DRIVERID_SAA7191	57	/* video decoder		*/
 #define I2C_DRIVERID_INDYCAM	58	/* SGI IndyCam			*/
 #define I2C_DRIVERID_OVCAMCHIP	61	/* OmniVision CMOS image sens.	*/
@@ -71,8 +63,6 @@
 #define I2C_DRIVERID_UPD64031A	79	/* upd64031a video processor	*/
 #define I2C_DRIVERID_SAA717X	80	/* saa717x video encoder	*/
 #define I2C_DRIVERID_DS1672	81	/* Dallas/Maxim DS1672 RTC	*/
-#define I2C_DRIVERID_BT866	85	/* Conexant bt866 video encoder */
-#define I2C_DRIVERID_KS0127	86	/* Samsung ks0127 video decoder */
 #define I2C_DRIVERID_TLV320AIC23B 87	/* TI TLV320AIC23B audio codec  */
 #define I2C_DRIVERID_WM8731	89	/* Wolfson WM8731 audio codec */
 #define I2C_DRIVERID_WM8750	90	/* Wolfson WM8750 audio codec */
@@ -100,7 +90,6 @@
 #define I2C_HW_B_RIVA		0x010010 /* Riva based graphics cards */
 #define I2C_HW_B_IOC		0x010011 /* IOC bit-wiggling */
 #define I2C_HW_B_IXP2000	0x010016 /* GPIO on IXP2000 systems */
-#define I2C_HW_B_ZR36067	0x010019 /* Zoran-36057/36067 based boards */
 #define I2C_HW_B_PCILYNX	0x01001a /* TI PCILynx I2C adapter */
 #define I2C_HW_B_CX2388x	0x01001b /* connexant 2388x based tv cards */
 #define I2C_HW_B_NVIDIA		0x01001c /* nvidia framebuffer driver */
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Mjpeg-users mailing list
Mjpeg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mjpeg-users

Reply via email to