tda1004x: Lock I2C bus during firmware load
authorMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 28 Sep 2012 19:28:51 +0000 (16:28 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 1 Oct 2012 10:17:01 +0000 (07:17 -0300)
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: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb-frontends/tda1004x.c

index 35d72b46aa1e81acc51706433738f21abac76767..a2631be7ffac9943384bdabc608b811f5686859e 100644 (file)
@@ -329,6 +329,7 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
        tda1004x_write_byteI(state, dspCodeCounterReg, 0);
        fw_msg.addr = state->config->demod_address;
 
+       i2c_lock_adapter(state->i2c);
        buf[0] = dspCodeInReg;
        while (pos != len) {
                // work out how much to send this time
@@ -339,15 +340,18 @@ static int tda1004x_do_upload(struct tda1004x_state *state,
                // send the chunk
                memcpy(buf + 1, mem + pos, tx_size);
                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");
+                       i2c_unlock_adapter(state->i2c);
                        return -EIO;
                }
                pos += tx_size;
 
                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);
 
        return 0;