[media] stv090x: Optional external lock routine
authorOliver Endriss <o.endriss@gmx.de>
Mon, 10 Jan 2011 09:36:10 +0000 (06:36 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 21 Mar 2011 23:31:44 +0000 (20:31 -0300)
Card driver may supply its own lock routine now.

Signed-off-by: Oliver Endriss <o.endriss@gmx.de>
Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/stv090x.c
drivers/media/dvb/frontends/stv090x.h

index e26bfd7..eccad06 100644 (file)
@@ -767,8 +767,12 @@ static int stv090x_i2c_gate_ctrl(struct stv090x_state *state, int enable)
         * In case of any error, the lock is unlocked and exit within the
         * relevant operations themselves.
         */
-       if (enable)
-               mutex_lock(&state->internal->tuner_lock);
+       if (enable) {
+               if (state->config->tuner_i2c_lock)
+                       state->config->tuner_i2c_lock(&state->frontend, 1);
+               else
+                       mutex_lock(&state->internal->tuner_lock);
+       }
 
        reg = STV090x_READ_DEMOD(state, I2CRPT);
        if (enable) {
@@ -784,13 +788,20 @@ static int stv090x_i2c_gate_ctrl(struct stv090x_state *state, int enable)
                        goto err;
        }
 
-       if (!enable)
-               mutex_unlock(&state->internal->tuner_lock);
+       if (!enable) {
+               if (state->config->tuner_i2c_lock)
+                       state->config->tuner_i2c_lock(&state->frontend, 0);
+               else
+                       mutex_unlock(&state->internal->tuner_lock);
+       }
 
        return 0;
 err:
        dprintk(FE_ERROR, 1, "I/O error");
-       mutex_unlock(&state->internal->tuner_lock);
+       if (state->config->tuner_i2c_lock)
+               state->config->tuner_i2c_lock(&state->frontend, 0);
+       else
+               mutex_unlock(&state->internal->tuner_lock);
        return -1;
 }
 
index a3fefa7..29cdc2b 100644 (file)
@@ -100,6 +100,7 @@ struct stv090x_config {
        int (*tuner_get_bbgain) (struct dvb_frontend *fe, u32 *gain);
        int (*tuner_set_refclk)  (struct dvb_frontend *fe, u32 refclk);
        int (*tuner_get_status) (struct dvb_frontend *fe, u32 *status);
+       void (*tuner_i2c_lock) (struct dvb_frontend *fe, int lock);
 };
 
 #if defined(CONFIG_DVB_STV090x) || (defined(CONFIG_DVB_STV090x_MODULE) && defined(MODULE))