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