Commit 347c4e95 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

tda1004x: Lock I2C bus during firmware load

tda1004x doesn't allow firmware loads while it is busy with something
else. Avoid it to happen by locking the I2C bus during firmware transfer.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 25ec43d3
...@@ -329,6 +329,7 @@ static int tda1004x_do_upload(struct tda1004x_state *state, ...@@ -329,6 +329,7 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
tda1004x_write_byteI(state, dspCodeCounterReg, 0); tda1004x_write_byteI(state, dspCodeCounterReg, 0);
fw_msg.addr = state->config->demod_address; fw_msg.addr = state->config->demod_address;
i2c_lock_adapter(state->i2c);
buf[0] = dspCodeInReg; buf[0] = dspCodeInReg;
while (pos != len) { while (pos != len) {
// work out how much to send this time // work out how much to send this time
...@@ -339,15 +340,18 @@ static int tda1004x_do_upload(struct tda1004x_state *state, ...@@ -339,15 +340,18 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
// send the chunk // send the chunk
memcpy(buf + 1, mem + pos, tx_size); memcpy(buf + 1, mem + pos, tx_size);
fw_msg.len = tx_size + 1; fw_msg.len = tx_size + 1;
if (i2c_transfer(state->i2c, &fw_msg, 1) != 1) { if (__i2c_transfer(state->i2c, &fw_msg, 1) != 1) {
printk(KERN_ERR "tda1004x: Error during firmware upload\n"); printk(KERN_ERR "tda1004x: Error during firmware upload\n");
i2c_unlock_adapter(state->i2c);
return -EIO; return -EIO;
} }
pos += tx_size; pos += tx_size;
dprintk("%s: fw_pos=0x%x\n", __func__, pos); dprintk("%s: fw_pos=0x%x\n", __func__, pos);
} }
// give the DSP a chance to settle 03/10/05 Hac i2c_unlock_adapter(state->i2c);
/* give the DSP a chance to settle 03/10/05 Hac */
msleep(100); msleep(100);
return 0; return 0;
......
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