You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb: V4L/DVB (3568k): zoran: Use i2c_master_send when possible V4L/DVB (3568j): adv7175: Drop unused encoder dump command V4L/DVB (3568i): adv7175: Drop unused register cache V4L/DVB (3568h): cpia: correct email address V4L/DVB (3568g): sem2mutex: zoran V4L/DVB (3568f): saa7110: Fix array overrun V4L/DVB (3568e): bt856: Spare memory V4L/DVB (3568d): saa7111.c fix V4L/DVB (3568c): zoran: Init cleanups V4L/DVB (3568b): saa7111: Prevent array overrun V4L/DVB (3568a): saa7114: Fix i2c block write
This commit is contained in:
@@ -124,24 +124,21 @@ adv7170_write_block (struct i2c_client *client,
|
|||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
struct adv7170 *encoder = i2c_get_clientdata(client);
|
struct adv7170 *encoder = i2c_get_clientdata(client);
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] =
|
||||||
encoder->reg[reg++] = data[1];
|
encoder->reg[reg++] = data[1];
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -67,8 +67,6 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
|||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
struct adv7175 {
|
struct adv7175 {
|
||||||
unsigned char reg[128];
|
|
||||||
|
|
||||||
int norm;
|
int norm;
|
||||||
int input;
|
int input;
|
||||||
int enable;
|
int enable;
|
||||||
@@ -94,9 +92,6 @@ adv7175_write (struct i2c_client *client,
|
|||||||
u8 reg,
|
u8 reg,
|
||||||
u8 value)
|
u8 value)
|
||||||
{
|
{
|
||||||
struct adv7175 *encoder = i2c_get_clientdata(client);
|
|
||||||
|
|
||||||
encoder->reg[reg] = value;
|
|
||||||
return i2c_smbus_write_byte_data(client, reg, value);
|
return i2c_smbus_write_byte_data(client, reg, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,25 +114,21 @@ adv7175_write_block (struct i2c_client *client,
|
|||||||
* the adapter understands raw I2C */
|
* the adapter understands raw I2C */
|
||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
struct adv7175 *encoder = i2c_get_clientdata(client);
|
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] = data[1];
|
||||||
encoder->reg[reg++] = data[1];
|
reg++;
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -170,24 +161,6 @@ set_subcarrier_freq (struct i2c_client *client,
|
|||||||
adv7175_write(client, 0x05, 0x25);
|
adv7175_write(client, 0x05, 0x25);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENCODER_DUMP
|
|
||||||
static void
|
|
||||||
dump (struct i2c_client *client)
|
|
||||||
{
|
|
||||||
struct adv7175 *encoder = i2c_get_clientdata(client);
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
printk(KERN_INFO "%s: registry dump\n", I2C_NAME(client));
|
|
||||||
for (i = 0; i < 182 / 8; i++) {
|
|
||||||
printk("%s: 0x%02x -", I2C_NAME(client), i * 8);
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
printk(" 0x%02x", encoder->reg[i * 8 + j]);
|
|
||||||
}
|
|
||||||
printk("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
// Output filter: S-Video Composite
|
// Output filter: S-Video Composite
|
||||||
|
|
||||||
@@ -406,14 +379,6 @@ adv7175_command (struct i2c_client *client,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef ENCODER_DUMP
|
|
||||||
case ENCODER_DUMP:
|
|
||||||
{
|
|
||||||
dump(client);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,24 +140,21 @@ bt819_write_block (struct i2c_client *client,
|
|||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
struct bt819 *decoder = i2c_get_clientdata(client);
|
struct bt819 *decoder = i2c_get_clientdata(client);
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] =
|
||||||
decoder->reg[reg++] = data[1];
|
decoder->reg[reg++] = data[1];
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -70,17 +70,14 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
|||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define REG_OFFSET 0xCE
|
#define REG_OFFSET 0xDA
|
||||||
|
#define BT856_NR_REG 6
|
||||||
|
|
||||||
struct bt856 {
|
struct bt856 {
|
||||||
unsigned char reg[32];
|
unsigned char reg[BT856_NR_REG];
|
||||||
|
|
||||||
int norm;
|
int norm;
|
||||||
int enable;
|
int enable;
|
||||||
int bright;
|
|
||||||
int contrast;
|
|
||||||
int hue;
|
|
||||||
int sat;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define I2C_BT856 0x88
|
#define I2C_BT856 0x88
|
||||||
@@ -119,8 +116,8 @@ bt856_dump (struct i2c_client *client)
|
|||||||
struct bt856 *encoder = i2c_get_clientdata(client);
|
struct bt856 *encoder = i2c_get_clientdata(client);
|
||||||
|
|
||||||
printk(KERN_INFO "%s: register dump:", I2C_NAME(client));
|
printk(KERN_INFO "%s: register dump:", I2C_NAME(client));
|
||||||
for (i = 0xd6; i <= 0xde; i += 2)
|
for (i = 0; i < BT856_NR_REG; i += 2)
|
||||||
printk(" %02x", encoder->reg[i - REG_OFFSET]);
|
printk(" %02x", encoder->reg[i]);
|
||||||
printk("\n");
|
printk("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ static int video_nr = -1;
|
|||||||
|
|
||||||
#ifdef MODULE
|
#ifdef MODULE
|
||||||
module_param(video_nr, int, 0);
|
module_param(video_nr, int, 0);
|
||||||
MODULE_AUTHOR("Scott J. Bertin <sbertin@securenym.net> & Peter Pregler <Peter_Pregler@email.com> & Johannes Erdfelt <johannes@erdfeld.com>");
|
MODULE_AUTHOR("Scott J. Bertin <sbertin@securenym.net> & Peter Pregler <Peter_Pregler@email.com> & Johannes Erdfelt <johannes@erdfelt.com>");
|
||||||
MODULE_DESCRIPTION("V4L-driver for Vision CPiA based cameras");
|
MODULE_DESCRIPTION("V4L-driver for Vision CPiA based cameras");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_SUPPORTED_DEVICE("video");
|
MODULE_SUPPORTED_DEVICE("video");
|
||||||
|
|||||||
@@ -107,13 +107,8 @@ saa7110_write_block (struct i2c_client *client,
|
|||||||
* the adapter understands raw I2C */
|
* the adapter understands raw I2C */
|
||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
struct saa7110 *decoder = i2c_get_clientdata(client);
|
struct saa7110 *decoder = i2c_get_clientdata(client);
|
||||||
struct i2c_msg msg;
|
|
||||||
|
|
||||||
msg.len = len;
|
ret = i2c_master_send(client, data, len);
|
||||||
msg.buf = (char *) data;
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
ret = i2c_transfer(client->adapter, &msg, 1);
|
|
||||||
|
|
||||||
/* Cache the written data */
|
/* Cache the written data */
|
||||||
memcpy(decoder->reg + reg, data + 1, len - 1);
|
memcpy(decoder->reg + reg, data + 1, len - 1);
|
||||||
@@ -431,15 +426,13 @@ saa7110_command (struct i2c_client *client,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DECODER_DUMP:
|
case DECODER_DUMP:
|
||||||
for (v = 0; v < 0x34; v += 16) {
|
for (v = 0; v < SAA7110_NR_REG; v += 16) {
|
||||||
int j;
|
int j;
|
||||||
dprintk(1, KERN_INFO "%s: %03x\n", I2C_NAME(client),
|
dprintk(1, KERN_DEBUG "%s: %02x:", I2C_NAME(client),
|
||||||
v);
|
v);
|
||||||
for (j = 0; j < 16; j++) {
|
for (j = 0; j < 16 && v + j < SAA7110_NR_REG; j++)
|
||||||
dprintk(1, KERN_INFO " %02x",
|
dprintk(1, " %02x", decoder->reg[v + j]);
|
||||||
decoder->reg[v + j]);
|
dprintk(1, "\n");
|
||||||
}
|
|
||||||
dprintk(1, KERN_INFO "\n");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,10 @@ MODULE_PARM_DESC(debug, "Debug level (0-1)");
|
|||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#define SAA7111_NR_REG 0x18
|
||||||
|
|
||||||
struct saa7111 {
|
struct saa7111 {
|
||||||
unsigned char reg[32];
|
unsigned char reg[SAA7111_NR_REG];
|
||||||
|
|
||||||
int norm;
|
int norm;
|
||||||
int input;
|
int input;
|
||||||
@@ -109,24 +111,21 @@ saa7111_write_block (struct i2c_client *client,
|
|||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
struct saa7111 *decoder = i2c_get_clientdata(client);
|
struct saa7111 *decoder = i2c_get_clientdata(client);
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] =
|
||||||
decoder->reg[reg++] = data[1];
|
decoder->reg[reg++] = data[1];
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -209,6 +208,7 @@ saa7111_command (struct i2c_client *client,
|
|||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
break;
|
||||||
case DECODER_INIT:
|
case DECODER_INIT:
|
||||||
{
|
{
|
||||||
struct video_decoder_init *init = arg;
|
struct video_decoder_init *init = arg;
|
||||||
@@ -226,11 +226,11 @@ saa7111_command (struct i2c_client *client,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < 32; i += 16) {
|
for (i = 0; i < SAA7111_NR_REG; i += 16) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
printk(KERN_DEBUG "%s: %03x", I2C_NAME(client), i);
|
printk(KERN_DEBUG "%s: %03x", I2C_NAME(client), i);
|
||||||
for (j = 0; j < 16; ++j) {
|
for (j = 0; j < 16 && i + j < SAA7111_NR_REG; ++j) {
|
||||||
printk(" %02x",
|
printk(" %02x",
|
||||||
saa7111_read(client, i + j));
|
saa7111_read(client, i + j));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,9 +138,6 @@ saa7114_write (struct i2c_client *client,
|
|||||||
u8 reg,
|
u8 reg,
|
||||||
u8 value)
|
u8 value)
|
||||||
{
|
{
|
||||||
/*struct saa7114 *decoder = i2c_get_clientdata(client);*/
|
|
||||||
|
|
||||||
/*decoder->reg[reg] = value;*/
|
|
||||||
return i2c_smbus_write_byte_data(client, reg, value);
|
return i2c_smbus_write_byte_data(client, reg, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,25 +153,21 @@ saa7114_write_block (struct i2c_client *client,
|
|||||||
* the adapter understands raw I2C */
|
* the adapter understands raw I2C */
|
||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
/*struct saa7114 *decoder = i2c_get_clientdata(client);*/
|
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] = data[1];
|
||||||
/*decoder->reg[reg++] =*/ data[1];
|
reg++;
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -112,24 +112,21 @@ saa7185_write_block (struct i2c_client *client,
|
|||||||
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
|
||||||
/* do raw I2C, not smbus compatible */
|
/* do raw I2C, not smbus compatible */
|
||||||
struct saa7185 *encoder = i2c_get_clientdata(client);
|
struct saa7185 *encoder = i2c_get_clientdata(client);
|
||||||
struct i2c_msg msg;
|
|
||||||
u8 block_data[32];
|
u8 block_data[32];
|
||||||
|
int block_len;
|
||||||
|
|
||||||
msg.addr = client->addr;
|
|
||||||
msg.flags = 0;
|
|
||||||
while (len >= 2) {
|
while (len >= 2) {
|
||||||
msg.buf = (char *) block_data;
|
block_len = 0;
|
||||||
msg.len = 0;
|
block_data[block_len++] = reg = data[0];
|
||||||
block_data[msg.len++] = reg = data[0];
|
|
||||||
do {
|
do {
|
||||||
block_data[msg.len++] =
|
block_data[block_len++] =
|
||||||
encoder->reg[reg++] = data[1];
|
encoder->reg[reg++] = data[1];
|
||||||
len -= 2;
|
len -= 2;
|
||||||
data += 2;
|
data += 2;
|
||||||
} while (len >= 2 && data[0] == reg &&
|
} while (len >= 2 && data[0] == reg &&
|
||||||
msg.len < 32);
|
block_len < 32);
|
||||||
if ((ret = i2c_transfer(client->adapter,
|
if ((ret = i2c_master_send(client, block_data,
|
||||||
&msg, 1)) < 0)
|
block_len)) < 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -395,7 +395,7 @@ struct zoran {
|
|||||||
struct videocodec *codec; /* video codec */
|
struct videocodec *codec; /* video codec */
|
||||||
struct videocodec *vfe; /* video front end */
|
struct videocodec *vfe; /* video front end */
|
||||||
|
|
||||||
struct semaphore resource_lock; /* prevent evil stuff */
|
struct mutex resource_lock; /* prevent evil stuff */
|
||||||
|
|
||||||
u8 initialized; /* flag if zoran has been correctly initalized */
|
u8 initialized; /* flag if zoran has been correctly initalized */
|
||||||
int user; /* number of current users */
|
int user; /* number of current users */
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/video_decoder.h>
|
#include <linux/video_decoder.h>
|
||||||
#include <linux/video_encoder.h>
|
#include <linux/video_encoder.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
@@ -673,7 +674,7 @@ zoran_i2c_client_register (struct i2c_client *client)
|
|||||||
KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
|
KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n",
|
||||||
ZR_DEVNAME(zr), client->driver->id);
|
ZR_DEVNAME(zr), client->driver->id);
|
||||||
|
|
||||||
down(&zr->resource_lock);
|
mutex_lock(&zr->resource_lock);
|
||||||
|
|
||||||
if (zr->user > 0) {
|
if (zr->user > 0) {
|
||||||
/* we're already busy, so we keep a reference to
|
/* we're already busy, so we keep a reference to
|
||||||
@@ -694,7 +695,7 @@ zoran_i2c_client_register (struct i2c_client *client)
|
|||||||
}
|
}
|
||||||
|
|
||||||
clientreg_unlock_and_return:
|
clientreg_unlock_and_return:
|
||||||
up(&zr->resource_lock);
|
mutex_unlock(&zr->resource_lock);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -707,7 +708,7 @@ zoran_i2c_client_unregister (struct i2c_client *client)
|
|||||||
|
|
||||||
dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
|
dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr));
|
||||||
|
|
||||||
down(&zr->resource_lock);
|
mutex_lock(&zr->resource_lock);
|
||||||
|
|
||||||
if (zr->user > 0) {
|
if (zr->user > 0) {
|
||||||
res = -EBUSY;
|
res = -EBUSY;
|
||||||
@@ -722,7 +723,7 @@ zoran_i2c_client_unregister (struct i2c_client *client)
|
|||||||
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
|
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id);
|
||||||
}
|
}
|
||||||
clientunreg_unlock_and_return:
|
clientunreg_unlock_and_return:
|
||||||
up(&zr->resource_lock);
|
mutex_unlock(&zr->resource_lock);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -995,10 +996,7 @@ test_interrupts (struct zoran *zr)
|
|||||||
static int __devinit
|
static int __devinit
|
||||||
zr36057_init (struct zoran *zr)
|
zr36057_init (struct zoran *zr)
|
||||||
{
|
{
|
||||||
u32 *mem;
|
int j, err;
|
||||||
void *vdev;
|
|
||||||
unsigned mem_needed;
|
|
||||||
int j;
|
|
||||||
int two = 2;
|
int two = 2;
|
||||||
int zero = 0;
|
int zero = 0;
|
||||||
|
|
||||||
@@ -1049,19 +1047,16 @@ zr36057_init (struct zoran *zr)
|
|||||||
|
|
||||||
/* allocate memory *before* doing anything to the hardware
|
/* allocate memory *before* doing anything to the hardware
|
||||||
* in case allocation fails */
|
* in case allocation fails */
|
||||||
mem_needed = BUZ_NUM_STAT_COM * 4;
|
zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
|
||||||
mem = kzalloc(mem_needed, GFP_KERNEL);
|
zr->video_dev = kmalloc(sizeof(struct video_device), GFP_KERNEL);
|
||||||
vdev = (void *) kmalloc(sizeof(struct video_device), GFP_KERNEL);
|
if (!zr->stat_com || !zr->video_dev) {
|
||||||
if (!mem || !vdev) {
|
|
||||||
dprintk(1,
|
dprintk(1,
|
||||||
KERN_ERR
|
KERN_ERR
|
||||||
"%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
|
"%s: zr36057_init() - kmalloc (STAT_COM) failed\n",
|
||||||
ZR_DEVNAME(zr));
|
ZR_DEVNAME(zr));
|
||||||
kfree(vdev);
|
err = -ENOMEM;
|
||||||
kfree(mem);
|
goto exit_free;
|
||||||
return -ENOMEM;
|
|
||||||
}
|
}
|
||||||
zr->stat_com = mem;
|
|
||||||
for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
|
for (j = 0; j < BUZ_NUM_STAT_COM; j++) {
|
||||||
zr->stat_com[j] = 1; /* mark as unavailable to zr36057 */
|
zr->stat_com[j] = 1; /* mark as unavailable to zr36057 */
|
||||||
}
|
}
|
||||||
@@ -1069,16 +1064,11 @@ zr36057_init (struct zoran *zr)
|
|||||||
/*
|
/*
|
||||||
* Now add the template and register the device unit.
|
* Now add the template and register the device unit.
|
||||||
*/
|
*/
|
||||||
zr->video_dev = vdev;
|
|
||||||
memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
|
memcpy(zr->video_dev, &zoran_template, sizeof(zoran_template));
|
||||||
strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
|
strcpy(zr->video_dev->name, ZR_DEVNAME(zr));
|
||||||
if (video_register_device(zr->video_dev, VFL_TYPE_GRABBER,
|
err = video_register_device(zr->video_dev, VFL_TYPE_GRABBER, video_nr);
|
||||||
video_nr) < 0) {
|
if (err < 0)
|
||||||
zoran_unregister_i2c(zr);
|
goto exit_unregister;
|
||||||
kfree((void *) zr->stat_com);
|
|
||||||
kfree(vdev);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
zoran_init_hardware(zr);
|
zoran_init_hardware(zr);
|
||||||
if (*zr_debug > 2)
|
if (*zr_debug > 2)
|
||||||
@@ -1092,6 +1082,13 @@ zr36057_init (struct zoran *zr)
|
|||||||
zr->zoran_proc = NULL;
|
zr->zoran_proc = NULL;
|
||||||
zr->initialized = 1;
|
zr->initialized = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
exit_unregister:
|
||||||
|
zoran_unregister_i2c(zr);
|
||||||
|
exit_free:
|
||||||
|
kfree(zr->stat_com);
|
||||||
|
kfree(zr->video_dev);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1121,7 +1118,7 @@ zoran_release (struct zoran *zr)
|
|||||||
btwrite(0, ZR36057_SPGPPCR);
|
btwrite(0, ZR36057_SPGPPCR);
|
||||||
free_irq(zr->pci_dev->irq, zr);
|
free_irq(zr->pci_dev->irq, zr);
|
||||||
/* unmap and free memory */
|
/* unmap and free memory */
|
||||||
kfree((void *) zr->stat_com);
|
kfree(zr->stat_com);
|
||||||
zoran_proc_cleanup(zr);
|
zoran_proc_cleanup(zr);
|
||||||
iounmap(zr->zr36057_mem);
|
iounmap(zr->zr36057_mem);
|
||||||
pci_disable_device(zr->pci_dev);
|
pci_disable_device(zr->pci_dev);
|
||||||
@@ -1206,7 +1203,7 @@ find_zr36057 (void)
|
|||||||
zr->id = zoran_num;
|
zr->id = zoran_num;
|
||||||
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
||||||
spin_lock_init(&zr->spinlock);
|
spin_lock_init(&zr->spinlock);
|
||||||
init_MUTEX(&zr->resource_lock);
|
mutex_init(&zr->resource_lock);
|
||||||
if (pci_enable_device(dev))
|
if (pci_enable_device(dev))
|
||||||
continue;
|
continue;
|
||||||
zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
|
zr->zr36057_adr = pci_resource_start(zr->pci_dev, 0);
|
||||||
|
|||||||
+114
-113
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user