Commit ebd5b5d9 authored by Ronald S. Bultje's avatar Ronald S. Bultje Committed by Deepak Saxena

[PATCH] I2C: new i2c video decoder calls: saa7111 driver

Attached patch implements the i2c calls in the saa7111 driver.

The driver is still compatible with old behaviour, so the zr36067 driver
(the original user of the saa7111 module) doesn't need any changes.  I'll
probably gradually make everything use DECODER_INIT instead of 0 (that was
a nice hack back then) somewhere later.

Can I just remove '0' later on? Or are there official ABI rules for
stable kernel versions?
parent 2afffbde
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
* Changes by Ronald Bultje <rbultje@ronald.bitfreak.net> * Changes by Ronald Bultje <rbultje@ronald.bitfreak.net>
* - moved over to linux>=2.4.x i2c protocol (1/1/2003) * - moved over to linux>=2.4.x i2c protocol (1/1/2003)
* *
* Changes by Michael Hunold <michael@mihu.de>
* - implemented DECODER_SET_GPIO, DECODER_INIT, DECODER_SET_VBI_BYPASS
*
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
...@@ -112,7 +115,7 @@ saa7111_write_block (struct i2c_client *client, ...@@ -112,7 +115,7 @@ saa7111_write_block (struct i2c_client *client,
u8 block_data[32]; u8 block_data[32];
msg.addr = client->addr; msg.addr = client->addr;
msg.flags = client->flags; msg.flags = 0;
while (len >= 2) { while (len >= 2) {
msg.buf = (char *) block_data; msg.buf = (char *) block_data;
msg.len = 0; msg.len = 0;
...@@ -142,6 +145,13 @@ saa7111_write_block (struct i2c_client *client, ...@@ -142,6 +145,13 @@ saa7111_write_block (struct i2c_client *client,
return ret; return ret;
} }
static int
saa7111_init_decoder (struct i2c_client *client,
struct video_decoder_init *init)
{
return saa7111_write_block(client, init->data, init->len);
}
static inline int static inline int
saa7111_read (struct i2c_client *client, saa7111_read (struct i2c_client *client,
u8 reg) u8 reg)
...@@ -151,7 +161,7 @@ saa7111_read (struct i2c_client *client, ...@@ -151,7 +161,7 @@ saa7111_read (struct i2c_client *client,
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static const unsigned char init[] = { static const unsigned char saa7111_i2c_init[] = {
0x00, 0x00, /* 00 - ID byte */ 0x00, 0x00, /* 00 - ID byte */
0x01, 0x00, /* 01 - reserved */ 0x01, 0x00, /* 01 - reserved */
...@@ -201,8 +211,18 @@ saa7111_command (struct i2c_client *client, ...@@ -201,8 +211,18 @@ saa7111_command (struct i2c_client *client,
switch (cmd) { switch (cmd) {
case 0: case 0:
//saa7111_write_block(client, init, sizeof(init)); case DECODER_INIT:
break; {
struct video_decoder_init *init = arg;
if (NULL != init)
return saa7111_init_decoder(client, init);
else {
struct video_decoder_init vdi;
vdi.data = saa7111_i2c_init;
vdi.len = sizeof(saa7111_i2c_init);
return saa7111_init_decoder(client, &vdi);
}
}
case DECODER_DUMP: case DECODER_DUMP:
{ {
...@@ -274,6 +294,32 @@ saa7111_command (struct i2c_client *client, ...@@ -274,6 +294,32 @@ saa7111_command (struct i2c_client *client,
} }
break; break;
case DECODER_SET_GPIO:
{
int *iarg = arg;
if (0 != *iarg) {
saa7111_write(client, 0x11,
(decoder->reg[0x11] | 0x80));
} else {
saa7111_write(client, 0x11,
(decoder->reg[0x11] & 0x7f));
}
break;
}
case DECODER_SET_VBI_BYPASS:
{
int *iarg = arg;
if (0 != *iarg) {
saa7111_write(client, 0x13,
(decoder->reg[0x13] & 0xf0) | 0x0a);
} else {
saa7111_write(client, 0x13,
(decoder->reg[0x13] & 0xf0));
}
break;
}
case DECODER_SET_NORM: case DECODER_SET_NORM:
{ {
int *iarg = arg; int *iarg = arg;
...@@ -465,6 +511,7 @@ saa7111_detect_client (struct i2c_adapter *adapter, ...@@ -465,6 +511,7 @@ saa7111_detect_client (struct i2c_adapter *adapter,
int i; int i;
struct i2c_client *client; struct i2c_client *client;
struct saa7111 *decoder; struct saa7111 *decoder;
struct video_decoder_init vdi;
dprintk(1, dprintk(1,
KERN_INFO KERN_INFO
...@@ -509,7 +556,9 @@ saa7111_detect_client (struct i2c_adapter *adapter, ...@@ -509,7 +556,9 @@ saa7111_detect_client (struct i2c_adapter *adapter,
return i; return i;
} }
i = saa7111_write_block(client, init, sizeof(init)); vdi.data = saa7111_i2c_init;
vdi.len = sizeof(saa7111_i2c_init);
i = saa7111_init_decoder(client, &vdi);
if (i < 0) { if (i < 0) {
dprintk(1, KERN_ERR "%s_attach error: init status %d\n", dprintk(1, KERN_ERR "%s_attach error: init status %d\n",
I2C_NAME(client), i); I2C_NAME(client), i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment