Skip to content

Commit

Permalink
V4L/DVB (3825): Remove broken 'fast firmware load' from cx25840.
Browse files Browse the repository at this point in the history
The fast firmware load hack in cx25840 uses private data. In fact, it
breaks pvrusb2 and doesn't work at all with ivtv. It is a unsafe
implementation and so it is removed.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed May 12, 2006
1 parent 5691c84 commit 7d16eaa
Showing 1 changed file with 2 additions and 47 deletions.
49 changes: 2 additions & 47 deletions drivers/media/video/cx25840/cx25840-firmware.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,29 +39,12 @@

#define FWDEV(x) &((x)->adapter->dev)

static int fastfw = 1;
static char *firmware = FWFILE;

module_param(fastfw, bool, 0444);
module_param(firmware, charp, 0444);

MODULE_PARM_DESC(fastfw, "Load firmware fast [0=100MHz 1=333MHz (default)]");
MODULE_PARM_DESC(firmware, "Firmware image [default: " FWFILE "]");

static void set_i2c_delay(struct i2c_client *client, int delay)
{
struct i2c_algo_bit_data *algod = client->adapter->algo_data;

/* We aren't guaranteed to be using algo_bit,
* so avoid the null pointer dereference
* and disable the 'fast firmware load' */
if (algod) {
algod->udelay = delay;
} else {
fastfw = 0;
}
}

static void start_fw_load(struct i2c_client *client)
{
/* DL_ADDR_LB=0 DL_ADDR_HB=0 */
Expand All @@ -71,16 +54,10 @@ static void start_fw_load(struct i2c_client *client)
cx25840_write(client, 0x803, 0x0b);
/* AUTO_INC_DIS=1 */
cx25840_write(client, 0x000, 0x20);

if (fastfw)
set_i2c_delay(client, 3);
}

static void end_fw_load(struct i2c_client *client)
{
if (fastfw)
set_i2c_delay(client, 10);

/* AUTO_INC_DIS=0 */
cx25840_write(client, 0x000, 0x00);
/* DL_ENABLE=0 */
Expand All @@ -107,30 +84,8 @@ static int fw_write(struct i2c_client *client, u8 * data, int size)
int sent;

if ((sent = i2c_master_send(client, data, size)) < size) {

if (fastfw) {
v4l_err(client, "333MHz i2c firmware load failed\n");
fastfw = 0;
set_i2c_delay(client, 10);

if (sent > 2) {
u16 dl_addr = cx25840_read(client, 0x801) << 8;
dl_addr |= cx25840_read(client, 0x800);
dl_addr -= sent - 2;
cx25840_write(client, 0x801, dl_addr >> 8);
cx25840_write(client, 0x800, dl_addr & 0xff);
}

if (i2c_master_send(client, data, size) < size) {
v4l_err(client, "100MHz i2c firmware load failed\n");
return -ENOSYS;
}

} else {
v4l_err(client, "firmware load i2c failure\n");
return -ENOSYS;
}

v4l_err(client, "firmware load i2c failure\n");
return -ENOSYS;
}

return 0;
Expand Down

0 comments on commit 7d16eaa

Please sign in to comment.